反向传播时对象检测训练如何工作?

How object detection training works while backpropagating?

我正在使用 tensorflow 训练 f-rcnn inception v2 模型。

假设我有 6000 张图片:

所以每张图片里面都有一只狗和一只猫,但是我只在其中一半标注了狗,在另一半标注了猫。

在创建数据集时,我不会打乱图像,所以我会将前 3000 个图像标记为狗,然后将其他 3000 个图像标记为猫。

我的问题是:

  1. 图片的顺序会影响结果吗?如果我先用狗然后用猫创建数据集,它会改变吗?如果我打乱数据混合猫和狗,情况会有所不同吗?

  2. 反向传播时,我没有给猫贴标签而给狗贴标签,反之亦然会影响结果吗?模型是否因为我有未标记的狗和猫而未学习?我得到的结果是否与拥有 3000 张图像且每张图像都标记了狗和猫的结果相同?

  3. 我没有在每张图片中同时标记狗和猫的原因是因为我有一个固定相机的图像,有时您会看到不同的狗或同一只狗四处走动,而猫是睡眠。因此,每次都标记睡猫将意味着多次输入相同的图像。 (当然,贴标签也需要很多时间)。我该如何解决这个问题?我应该在创建数据集之前裁剪图像吗?如果我创建一个评估是否足够 我在每个图像中都标记了狗和猫的数据集和我只有对象(狗)标签而没有猫的训练数据集?

谢谢

1- 是的,图像的顺序会影响结果[1],更重要的是,它会影响算法的学习速度。从本质上讲,您的算法正在尝试学习一种权重配置,该配置可以最小化您向其展示的所有示例的 损失函数 。它通过将这些权重安排到一个配置中来实现这一点,该配置可以检测数据中区分猫和狗的那些特征。但它仅通过一次考虑一个 批次 的输入来做到这一点。批处理中的每个图像都被单独考虑,反向传播决定了权重应该如何改变,以便算法更好地检测该图像中的 cat/dog。然后,它会对 批次 中每个图像的所有这些更改进行平均,并进行调整。

如果您的批次包含所有图像,那么顺序无关紧要;它会做出预期的调整,从而最大程度地减少所有数据的损失函数。但是,如果该批次包含的数据少于所有数据(它总是如此),那么它会进行调整以帮助仅在该批次的图像中检测 dogs/cats。这意味着如果你给它显示的猫多于狗,它会决定同样属于猫和狗的特征实际上会产生增加的可能性,即所讨论的动物是猫的概率,即错误的。因为在检测到该特征的情况下,猫的可能性更高。随着 cats:dogs 的比率趋于平衡,这会随着时间的推移自行纠正,但到达最终配置的速度会慢得多,因为它必须学习和忘掉数据中无用的特征。

例如,在您的设置中,当您的算法观察到一半数据时,它所学到的只是 "all things that look like a cat or a dog are dogs"。图像中区分猫和狗的那些特征对减少损失函数没有帮助。实际上,它会遗漏猫和狗共有的特征,因为它们是狗特有的,并且在看到更多数据时必须稍后忘记这些特征。

就整体结果而言:在训练过程中,您实际上是在沿着梯度遍历高维优化 space,直到权重配置达到 local 这个 space 中的最小值,从中逃脱的障碍的大小超过了你的学习率所允许的范围。显示一个 class 然后另一个将导致通往全局最小值的更曲折的路径,从而增加陷入次优局部最小值的可能性。 [2]


2- 如果数据集中的所有图像都包含一只狗,那么您真的想在每张图像中标记那只狗。这会做三件事:

  • 将数据集的大小加倍(更多数据 = 更好的结果)。
  • 防止错误地惩罚模型以在您未标记狗的图像中准确检测到狗。
  • 防止算法检测图像中不相关的特征。

出于显而易见的原因,将数据集的大小加倍是件好事。但是,通过显示包含一只狗但未标记该狗的输入,您实际上是在告诉您的算法该图像包含 no dog[3]。这是错误的。您实际上是在改变您要求算法检测的模式,这些模式可以将 cat/dog 与 no-cat/dogcat 与dog to which can separate labeled-dogs vs unlabelled-dogs,这对你的任务没有帮助。

最后,由于未能标记一半的狗,您的算法将学会区分标记的狗和未标记的狗。这意味着它不会学习狗共有的特征,而是学习将标记图像中的狗与未标记图像中的狗区分开来的特征。这些可能是图像中的背景特征或小的概括,这些特征在标记的狗中表现得比偶然未标记的狗更强烈。


3- 这道题有点难,这里没有简单的办法解决你的问题。您的模型只能学习它在训练期间接触到的特征,这意味着如果您只向它展示一张猫的图像(或几张猫的表现相同的图像),您的模型将学习特定于该图像的特征.这将很快导致 过度拟合 的常见问题,在这种情况下,您的模型会学习特定于您的训练示例的特征,并且不能很好地泛化到其他猫实例。

在训练期间剪掉猫然后简单地将猫包含在评估数据集中是不够的,因为您将要求模型检测它在训练期间未暴露的特征,因此具有没学过。

您想在数据中出现的每个实例中都包含您标记的猫,并regularise your network to limit over-fitting. In addition to this in the presence of data poverty it is often beneficial to use pre-training to learn cat specific features from unlabelled data prior to training, and/or to use data augmentation人为地增强数据的多样性。

这些建议可能会改善您的结果,但现实情况是,采购大量、多样化的数据集,这些数据集全面结合了识别对象的关键特征,是构建成功的深度学习模型的主要部分。这取决于猫的实例在你的数据中的统一程度,但如果你的模型只从前面见过猫,它就不会从后面识别猫。


TLDR:

  • 1 是,洗牌。
  • 2 是的,给它们都贴上标签。
  • 3 获得更好的数据。或者:预训练、正则化和扩充数据。

[1] 这取决于您将数据输入模型的批次大小。

[2] 这是我自己的直觉,很高兴在这里得到纠正。

[3] 这在某种程度上取决于你的损失函数如何处理没有狗的图像。