我已经学习了几篇关于YOLO
的教程,但我在试图弄清楚图像被分成的每个单元格的锚框是否是预先设定的时遇到了困难。在我阅读的一个指南中,图像被分成了13×13个单元格,并且指出每个单元格预测5个锚框(比单元格大,这让我遇到了第一个问题,因为它还说在预测框之前会先检测小单元格中存在什么对象)。
小单元格如何预测比它大的对象的锚框?此外,据说每个单元格在预测其锚框之前会进行分类,如果对象的一部分落在单元格内,小单元格如何在不查询邻近单元格的情况下正确分类对象?
例如
,假设13个单元格中的一个只包含一个穿T恤的男人白色口袋部分的图像,这个单元格如何在不与其邻近单元格连接的情况下正确分类出有一个人存在?在使用普通的CNN尝试定位单个对象时,我知道边界框的预测与整个图像相关,因此至少我可以说网络在决定框的位置之前对图像上发生的事情有了一个整体的了解。
附注:我目前对YOLO工作原理的理解是,每个单元格被分配了预先设定的锚框,每个锚框末端都有一个分类器,然后选择每个类别得分最高的框,但我确定这在某处不成立。
更新:我在这篇问题中犯了一个错误,问题本应是关于常规边界框是如何决定的,而不是锚框/先验框。所以我将
@***
的回答标记为正确,因为根据YOLO v2论文,锚框就是这样决定的
回答:
我认为这里有两个问题。首先,标题中的问题,询问锚框从何而来。其次,锚框是如何分配给对象的。我将尝试回答这两个问题。
- 锚框是通过k-means过程确定的,查看数据集中所有的边界框。如果你观察的是车辆,从侧面看的车辆宽高比大约是2:1(宽度=2*高度)。从正面看的车辆大致是正方形,1:1。如果你的数据集包括人,宽高比可能是1:3。前景对象会较大,背景对象会较小。k-means程序会找出一组代表你数据集的锚框。对于yolov3,k=5,但每个YOLO版本的锚框数量不同。
拥有代表你数据集的锚框是有用的,因为YOLO学习如何对锚框进行小的调整,以创建对象的准确边界框。YOLO学习小的调整比大的调整更容易/更好。
- 分配问题更为复杂。据我所知,YOLO训练过程的一部分是学习为哪些对象使用哪些锚框。因此,“分配”不像匈牙利算法那样是确定性的。因此,一般来说,多个锚框会检测到每个对象,你需要在之后进行非最大抑制以选择“最佳”一个(即置信度最高的)。
在理解锚框之前,我需要理解以下几点:
- 锚框可以是任何大小,因此它们可以超出13×13网格单元格的边界。为了检测大型对象,它们必须如此。
- 锚框只在YOLO的最终层中出现。YOLO的神经网络进行13x13x5=845次预测(假设13×13网格和5个锚框)。这些预测被解释为从锚框计算边界框的偏移量。(预测还包括置信度/对象性得分和类别标签。)
- YOLO的损失函数将真实标签中的每个对象与一个锚框进行比较。它选择与真实标签相比IoU最高的锚框(在任何偏移之前)。然后将预测作为偏移量添加到锚框上。所有其他锚框被指定为背景。
- 如果分配给对象的锚框具有高IoU,它们的损失较小。未分配给对象的锚框应通过将置信度设置为接近零来预测背景。最终的损失函数是所有锚框的组合。由于YOLO试图最小化其总体损失函数,最接近真实标签的锚框被训练识别对象,其他锚框被训练忽略它。
以下页面帮助我理解了YOLO的锚框: