Yolo 对象检测:包括不包含要预测的类的图像?

che*_*zza 3 machine-learning object-detection deep-learning yolo

我想在我自己的数据集上训练小 yolo。我想预测 3 个类别:汽车、行人和骑自行车的人;所有这些都已被注释。

我的数据集还包括不包含这些类的图像(因此没有注释)。我应该在培训中包含这些图像吗?为什么或者为什么不?

谢谢!

j31*_*rre 8

TLDR;您不需要为 YOLO 提供没有类的图像。

YOLO 将输出层划分为单独的网格单元,每个网格单元都有一个或多个锚框先验,每个单元预测对象类标签与“非对象性”的输出值。

由于大多数图像不会在每个网格单元中都包含对象,因此它自然会学习如何识别“无对象”。

事实上,通常会有太多没有对象的锚点和有实际对象的锚点太少的不平衡。这就是为什么 YOLO 使用联合损失函数来降低负样本的权重?_noobj = .5

其他方法,例如 SSD,使用“硬负挖掘”来减少负样本的数量并解决不平衡问题。

因此,您通常不需要包含纯粹的负面训练示例,因为在您的正面示例数据集中,过多的负面网格框已经不平衡。

我能想到的一个例外是:如果您的所有训练示例都包含整个视野中的许多对象(即人群、交通拥堵等),那么您可能需要包含一些没有对象的训练示例。

另一个例外是,如果您的对象总是出现在同一个网格单元(例如中心)中,那么您可能需要一些纯反例,或者使用数据增强来生成对象出现在不同位置的示例。


wou*_*rio 6

除了提供模型应该检测到的训练数据之外,提供模型不应该检测到的负数据也可能会有所帮助。没有注释的图像隐含地表明其中的任何内容都不是模型应该检测的内容。

假设您正在训练一个模型来检测黄色出租车。当然,您可以通过黄色出租车提供数据。但包含包含非出租车的黄色物体以及非出租车的汽车的负面数据也是有意义的。这可以防止您的网络得知任何黄色的东西都是出租车,或者任何汽车都是出租车。

神经网络有点像黑匣子,但从理论角度来看,你可以说它们以某种方式从输入中提取某些抽象特征。根据提取的特征,它们确定(例如)对象的类别和位置。

训练神经网络意味着网络学会寻找与确定对象的类别和位置相关的抽象特征。神经网络的本质使得我们很难理解它正在学习什么特征。我们所能看到的是,神经网络开始根据我们的训练方式来表现。

如果没有负面数据,网络可能会学习过于抽象的特征。然后网络可能会在其他它不应该检测的对象中找到这些特征。例如,在我们的团队中,我们正在训练 YOLO 网络来检测某些植物。但有一次我们发现我们的一个网络也在一张只有块的图像中检测到植物。

负数据为学习特征提供更多反馈。在训练过程中,网络可能会开始学习过于抽象的特征。但随后网络很可能开始检测负数据中的对象。然后,训练算法发现网络错误地检测到对象并提供反馈。

Rohit 引用了 AlexeyAB 的 github 页面,指出您应该提供与提供带有对象的图像一样多的负样本图像。由于 AlexeyAB 是 YOLO 的主要贡献者之一,因此遵循他的建议可能不会有什么坏处,除非你有明确的证据证明他错了。


小智 5

建议使用没有物体的图像,但我不确定其实际原因是什么。

希望您的训练数据集包含您不想检测的带有非标记对象的图像 - 无边界框的负样本(空 .txt 文件) - 使用与带有对象的图像一样多的负样本图像

https://github.com/AlexeyAB/darknet#how-to-train-to-detect-your-custom-objects