训练目标检测模型太长导致模型破解
Training object detection model too long causes model to crack
我正在使用来自 tensorflow 的对象检测。
关于这个问题的一些背景信息
我面临着一个挑战,因为我有兴趣训练一个模型,该模型除其他外还可以检测武器。我的常规视角来自无人机,但我无法从这个视角找到任何包含武器的公开可用数据集。所以,我收集了带有武器的图像,并试图尽可能地模仿无人机的视角。
- 我的第一个想法是填充我的图像(相对于图像本身,使它们内部的实际边界框更小)。
- 第二个是旋转我的图像。由于 tensorflow 尚未实现此功能,因此我编写了一个简单的代码来创建预旋转图像。这有局限性,但无论如何我试了一下。
我用海滩上的人的图像进行了实验,并试图模仿实际问题:
- 我正在使用海滩上相对较近的人的图像进行训练
- 并同时使用海滩上相对较远的人的图像进行测试。
实际问题
在我的一个 实验 中,我训练我的模型的时间比平时长,并注意到它真的搞砸了。更具体地说:
我有 140 "close frame" 个初始图像用于训练。
我从中创建了 4x140=560
图像,其中填充较小(生成的图像是最大版本中原始图像的 1.6 倍)和旋转(最多旋转 5 度)调整大小的版本.
我使用这个包含 560 张图像的数据集来训练我的模型,使用 Faster R-CNN 模型进行了将近 800k 次迭代。
我在不同的迭代中导出模型:
在 150k、300k、500k、700k 并用于在我的测试图像上进行测试。
我还使用了用原始调整大小的图像训练的比较模型来检查差异。
意外结果
- 第一个奇怪的观察是我的模型在 500k 及以上时根本没有检测到任何人。 (首先想到的是过度训练)
- 我在实际的 训练图像 上试过它来检查这一点,这里也没有在我的测试图像上检测到任何东西。
- 此外,我希望我的 "enhanced" 数据集比简单调整大小的数据集表现更好,但情况似乎并非如此。 (虽然这是一个看似科学合理的小问题)。
所以,我的问题是这怎么可能?训练时间过长也会导致无法检测到训练样本?对此有任何理论解释吗? (除了实施中的错误等,我认为这不太可能,但在任何情况下都不能排除)。
P.S.1
我调整大小后的图像版本遵循与 Faster R-CNN 相同的调整大小条件,最小值。暗淡。是 600 像素和最大值。一个 1024 像素。所以,这应该不是任何调整大小的问题。
P.S.2
我正在使用 tensorflow,但我认为这不是 tensorflow 的特定问题。所以,我没有将它包含在标签中。
经过一些研究(和大量实验)后,我得出了一些结论,这些结论可能会帮助其他面临同样问题的人。
- 未能检测到任何对象可能意味着模型在训练的某些部分已经崩溃。在我的案例中,一个可能的迹象是训练时损失值的一些极高值。虽然我有模型表明这种情况发生了并且似乎不会对模型产生太大影响(至少不会太大而使它变得无用),但这些值的数量增加是一个好兆头,表明出现了致命错误。请注意,这些值的出现频率不一定一直在增加。
- 越class越多越好: 第一节课后,我只用 1 class[=27 进行实验=].虽然这是合法的,并且(据我所知)没有任何关于避免它的提及(我什至阅读了使用 1 class 对象检测的教程),但这也加剧了破解率。使用 2 classes 似乎可以部分缓解该问题。当我用 11 classes 训练我的模型时,问题似乎消失了。
- bbox 尺寸的微小变化有助于: 对尺寸变化很大的边界框进行试验,我得出的结论是,基本上均匀的 bbox 尺寸也有助于缓解这个问题。
- 更多 classes 可能会提高性能: 我还注意到虽然 11 classes 问题似乎比 1 class 由于使用 1 class 性能训练模型的局限性,某些情况下前一种情况更高。
我的最终结论是,由于某种原因,我的模型在某些时候遇到了一些权重溢出,导致它无法再次恢复正常。事实上,我已经扩充了我的数据(例如,相似的图像可能一个接一个地输入并加强了某些权重)可能会增加问题发生的频率,但问题仍然存在于非扩充数据集中。
我正在使用来自 tensorflow 的对象检测。
关于这个问题的一些背景信息
我面临着一个挑战,因为我有兴趣训练一个模型,该模型除其他外还可以检测武器。我的常规视角来自无人机,但我无法从这个视角找到任何包含武器的公开可用数据集。所以,我收集了带有武器的图像,并试图尽可能地模仿无人机的视角。
- 我的第一个想法是填充我的图像(相对于图像本身,使它们内部的实际边界框更小)。
- 第二个是旋转我的图像。由于 tensorflow 尚未实现此功能,因此我编写了一个简单的代码来创建预旋转图像。这有局限性,但无论如何我试了一下。
我用海滩上的人的图像进行了实验,并试图模仿实际问题:
- 我正在使用海滩上相对较近的人的图像进行训练
- 并同时使用海滩上相对较远的人的图像进行测试。
实际问题
在我的一个 实验 中,我训练我的模型的时间比平时长,并注意到它真的搞砸了。更具体地说:
我有 140 "close frame" 个初始图像用于训练。
我从中创建了
4x140=560
图像,其中填充较小(生成的图像是最大版本中原始图像的 1.6 倍)和旋转(最多旋转 5 度)调整大小的版本.我使用这个包含 560 张图像的数据集来训练我的模型,使用 Faster R-CNN 模型进行了将近 800k 次迭代。
我在不同的迭代中导出模型: 在 150k、300k、500k、700k 并用于在我的测试图像上进行测试。
我还使用了用原始调整大小的图像训练的比较模型来检查差异。
意外结果
- 第一个奇怪的观察是我的模型在 500k 及以上时根本没有检测到任何人。 (首先想到的是过度训练)
- 我在实际的 训练图像 上试过它来检查这一点,这里也没有在我的测试图像上检测到任何东西。
- 此外,我希望我的 "enhanced" 数据集比简单调整大小的数据集表现更好,但情况似乎并非如此。 (虽然这是一个看似科学合理的小问题)。
所以,我的问题是这怎么可能?训练时间过长也会导致无法检测到训练样本?对此有任何理论解释吗? (除了实施中的错误等,我认为这不太可能,但在任何情况下都不能排除)。
P.S.1
我调整大小后的图像版本遵循与 Faster R-CNN 相同的调整大小条件,最小值。暗淡。是 600 像素和最大值。一个 1024 像素。所以,这应该不是任何调整大小的问题。
P.S.2
我正在使用 tensorflow,但我认为这不是 tensorflow 的特定问题。所以,我没有将它包含在标签中。
经过一些研究(和大量实验)后,我得出了一些结论,这些结论可能会帮助其他面临同样问题的人。
- 未能检测到任何对象可能意味着模型在训练的某些部分已经崩溃。在我的案例中,一个可能的迹象是训练时损失值的一些极高值。虽然我有模型表明这种情况发生了并且似乎不会对模型产生太大影响(至少不会太大而使它变得无用),但这些值的数量增加是一个好兆头,表明出现了致命错误。请注意,这些值的出现频率不一定一直在增加。
- 越class越多越好: 第一节课后,我只用 1 class[=27 进行实验=].虽然这是合法的,并且(据我所知)没有任何关于避免它的提及(我什至阅读了使用 1 class 对象检测的教程),但这也加剧了破解率。使用 2 classes 似乎可以部分缓解该问题。当我用 11 classes 训练我的模型时,问题似乎消失了。
- bbox 尺寸的微小变化有助于: 对尺寸变化很大的边界框进行试验,我得出的结论是,基本上均匀的 bbox 尺寸也有助于缓解这个问题。
- 更多 classes 可能会提高性能: 我还注意到虽然 11 classes 问题似乎比 1 class 由于使用 1 class 性能训练模型的局限性,某些情况下前一种情况更高。
我的最终结论是,由于某种原因,我的模型在某些时候遇到了一些权重溢出,导致它无法再次恢复正常。事实上,我已经扩充了我的数据(例如,相似的图像可能一个接一个地输入并加强了某些权重)可能会增加问题发生的频率,但问题仍然存在于非扩充数据集中。