我想实现Yolo v1,但对算法有一些疑问。
我了解到在YOLO中,我们将图像按单元格划分(7×7),并预测固定数量的边界框(论文中默认是2个,每个框有4个坐标:x, y, w, h),一个置信度分数,并且还为每个单元格预测类别分数。在测试步骤中,我们可以使用NMS算法来去除对同一对象的多次检测。
1) 我们何时将图像划分为网格?事实上,当我阅读论文时,他们提到要划分图像,但当我查看网络的架构时,似乎有两部分:卷积层和全连接层。这是否意味着网络通过边界框输出“自然”地完成了划分?网格大小7×7是否特定于论文中使用的卷积部分?如果我们使用VGG,它是否会改变网格的大小?
编辑:似乎网格是通过网络输出“虚拟”划分的。
2) 每个单元格使用两个边界框。但在一个单元格中,我们只能预测一个对象。为什么我们使用两个边界框?
在训练时,我们只希望一个边界框预测器对每个对象负责。我们根据哪个预测与真实值的当前IOU最高,来分配一个预测器“负责”预测对象。这导致了边界框预测器之间的专业化。每个预测器在预测特定大小、纵横比或类别的对象方面变得更好,从而提高了总体召回率。
3) 我对这段话不太理解。事实上,文中提到图像中的每个对象都有一个边界框。但边界框限于单元格内,那么当对象大于一个单元格时,YOLO如何工作?
4) 关于输出层,他们说使用线性激活函数,但它是否使用最大值等于1?因为他们说他们将坐标标准化在0到1之间(我认为置信度和类别预测也是如此)。
回答:
1)最终层的输出将是一个大小为SxSx(5B+C)的向量。这意味着如果你拿这个向量并取前5个值,这些将是第一个单元格中第一个框的x,y,w,h和置信度,然后第二个五个值对应第一个单元格中的第二个边界框,然后你会有C个值对应类别概率,假设你有两个类别,网络的以下输出是[0.21 0.98],那么第二个类别的概率更大,这意味着网络认为这个网格单元格是第二个类别。所以,是的,你是对的,图像是虚拟划分的。
2)当他们训练网络时,他们选择哪个预测器(读取某个网格单元格中B个框中的一个)来惩罚。他们通过与真实值的最高IoU来选择那个预测器。论文中的引用:“我们根据哪个预测与真实值的当前IOU最高,来分配一个预测器‘负责’预测对象。”所以假设在预测过程中,第一个框的IoU是0.3,第二个框的IoU是0.7,我们选择第二个框负责预测那个对象,我们将只从那个框累积损失。因此,例如,在训练过程中,网络会自然学会用第一个预测器预测高框(人),用第二个预测器预测宽框(车)。所以使用多个框的原因是为了能够预测不同纵横比的框。
3) “但边界框限于单元格内,那么当对象大于一个单元格时,YOLO如何工作?”YOLO预测的边界框不限于网格单元格,只有它的(x,y)坐标限于网格单元格。他们在论文中写道:“(x, y)坐标表示相对于网格单元格边界的框中心。宽度和高度是相对于整个图像预测的。”所以如你所见,他们预测bbox的宽度和高度是相对于整个图像,而不是网格单元格。
4) 嗯,我不知道这个问题的答案,但我可以说在他们的代码中他们也使用了检测层,计算损失、IoUs和很多其他东西。我不太擅长阅读他们的代码,但你可能会有更好的运气:这是yolo github中检测层的代码
P.S. 关于YOLO的另一个好信息来源:Joseph Redmon在youtube上的演讲