训练对象检测模型过长导致模型破裂

时间:2018-08-20 13:13:43

标签: python object-detection

我正在使用来自tensorflow的对象检测。

有关该问题的一些背景信息
我面临挑战,因为我有兴趣训练一种模型,该模型除其他功能外还将检测武器。我的常规观点是从无人驾驶飞机出发,但是从这种观点来看,我找不到包含武器的任何公开可用的数据集。因此,我用武器收集了图像并试图尽可能模仿无人机的观点。

  • 我的第一个想法是填充图像(使图像中的实际边界框变小)。
  • 第二步也是旋转我的图像。由于tensorflow尚未实现此功能,因此我编写了一个简单的代码来创建预旋转图像。这有局限性,但无论如何我还是给了机会。

我尝试了在海滩上的人的照片,并试图模仿实际的问题:

  • 我正在使用相对较近的海滩人物进行训练
  • 同时使用海滩上相对较远的人的图像进行测试。

实际问题
在我的一项实验中,我训练模型的时间比平常更长,并且注意到它确实使它破灭了。具体来说:

  • 我有一个初始的140张“近景”图像用于训练。

  • 我用它们创建了4x140=560图像,这些图像具有较小的填充(最大图像中的图像最大可达原始图像的1.6倍)和旋转尺寸(最大5度旋转)。

  • 我使用这个包含560张图像的数据集,使用Faster R-CNN模型对我的模型进行了近80万次迭代训练。

  • 我以各种迭代方式导出了模型: 分别以150k,300k,500k,700k进行测试。

我还使用了比较模型,该模型使用原始大小调整后的图像进行训练,以检查差异。

意外结果

  • 第一个奇特的发现是,我的模型在500k及其以上时根本无法检测到任何人。 (最初的想法是训练过度)
  • 我在实际的培训图片上进行了尝试,以进行检查,但这里也没有在测试图片中检测到任何东西。
  • 此外,我希望我的“增强型”数据集的性能要比简单调整大小的数据集更好,但事实并非如此。 (尽管这是一个小问题,在科学上似乎是合理的)。

所以,我的问题是那怎么可能?培训时间过长还会导致无法检测到培训样本吗?有什么理论解释吗? (除了实现上的错误等,我认为这不太可能,但在任何情况下都不能排除)。

P.S.1
我调整图像大小的版本遵循与Faster R-CNN相同的最小调整大小条件。暗淡。最大为600像素一1024像素。因此,这应该不是任何调整大小的问题。

P.S.2
我正在使用tensorflow,但我不认为这是特定于tensorflow的问题。因此,我没有将其包含在标签中。

1 个答案:

答案 0 :(得分:0)

经过一些研究(和大量实验),我得出了一些结论,可能会帮助其他面临相同问题的人。

  1. 未能检测到任何物体,可能意味着该模型在训练的某些部分已经崩溃。在我的情况下,这可能是在训练时一些极高的损耗值。虽然我有发生这种情况的模型,但似乎并没有太大地影响模型(至少不会太大地影响模型,以至于无用),但是这些值的增加表明存在致命错误。请注意,这些值的出现频率并不一定一直都在增加。
  2. 班级越多越好::第一阶段过后,我仅用 1类进行了实验。尽管这是合法的,并且据我所知,并没有提及避免这种情况的发生(我什至阅读了使用1类对象检测的教程),但这也加剧了破解率。使用2个类似乎可以部分缓解问题。当我用11个班级训练模型时,问题似乎消失了。
  3. bbox大小的小变化有助于:通过对大小变化很大的边界框进行试验,我得出的结论是,大致相同的bbox大小也有助于缓解问题。
  4. 更多的课程可能会提高性能:我还注意到,尽管11课的问题似乎比1课的任务重得多,但由于训练1课性能的模型存在局限性,因此在某些情况下前一种情况。

我的最终结论是,由于某种原因,我的模型在某些时候经历了一些权重的溢出,从而阻止了它再次回到正常状态。我增加了数据的事实(例如,类似的图像被一个接一个地馈送并且例如增加了一定的权重)可能会增加问题发生的频率,但是问题仍然存在于非扩展数据集中。