训练步骤中的 Yolo v1 边界框

Yolo v1 bounding boxes during training step

我想实现 Yolo v1,但我对算法有一些疑问。

我了解在 YOLO 中,我们将图像划分为每个单元格 (7x7),并预测固定数量的边界框(论文中默认为 2 个,具有 4 个坐标:x、y、w、h ),一个置信度分数,我们还预测每个单元格的 classes 分数。在测试步骤中,我们可以使用NMS算法来去除 一个物体的多重检测。

1) 我们什么时候将图像划分为网格?事实上,当我阅读他们提到的分割图像的论文时,但当我查看网络架构时,我们似乎有两部分:卷积层和 FC 层。这是否意味着网络 "naturally" 使用边界框输出? 7x7 的网格大小是论文中卷积部分特有的吗?如果我们使用例如 VGG,它会改变网格的大小吗?

编辑:由于我们网络的输出,网格似乎被分割了"virtually"。

2) 每个单元格使用 2 个边界框。但是在一个单元格中,我们只能预测一个对象。为什么我们使用两个边界框?

At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth. This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.

3) 我不太明白这句话。事实上,据说图像中的每个物体都有一个边界框。但是bounding boxe仅限于cell,那么当物体大于一个cell时,YOLO是如何工作的呢?

4)关于输出层,据说他们用的是线性激活函数,但是它使用的最大值等于1吗?因为他们说他们标准化了 0 和 1 之间的坐标(我认为置信度和 class 预测是一样的)。

1)最后一层的输出将是一个大小为SxSx(5B+C)的向量。这意味着如果你将采用这个向量并且你将采用前 5 个值,它们将是 x、y、w、h 和第一个单元格中第一个框的置信度,然后后五个值将对应于第二个边界框在第一个单元格中,你将拥有对应于 class 概率的 C 值,假设你有两个 classes 和以下网络输出 [0.21 0.98],所以第二个 class 有更大的概率,这意味着网络认为它在这个网格单元中是第二个 class。所以是的,你是对的图像被虚拟地分割了。

2) 当他们训练网络时,他们选择了哪个预测器(从特定网格单元中的 B 框中读取一个框)进行惩罚。他们根据与基本事实的最高 IoU 选择一个预测变量。引自论文:"We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth." 假设在预测过程中,第一个框的 IoU 为 0.3,第二个框的 IoU 为 0.7,我们选择第二个框负责预测该对象,我们将仅从中累积损失那个盒子。因此,例如,在训练期间,网络将自然地学习使用第一个预测器预测高框(人),并使用第二个预测器(汽车)预测宽框。所以使用多个框的原因是能够预测具有不同纵横比的框。

3) "But the bounding box is limited to the cell, so how does YOLO work when the object is bigger than one cell ?"。 YOLO预测的bounding box不局限于grid cell,只是它的(x,y)坐标局限于grid cell。他们在论文中写道:"The (x, y) coordinates represent the center of the box relative to the bounds of the grid cell. The width and height are predicted relative to the whole image."。所以正如你所看到的,他们预测了 bbox 相对于整个图像的宽度和高度,而不是网格单元。

4) 好吧,我不知道这个问题的答案,但我可以说在他们的代码中他们也使用检测层,计算损失、IoU 和许多其他东西。我不太擅长阅读他们的代码,但你可能运气更好:this is code for detection layer in yolo github

P.S。关于 YOLO 的另一个很好的信息来源:Joseph Redmon's presentation on youtube