YOLO 中的Anchor机制笔记

众所周知,Yolo v2最大的改进就是锚框机制,并且锚框的生成不是和以前靠经验所得,而是通过更加科学K-Means聚类获得的。那么这个Anchor是如何与yolo相结合的呢?
首先来了解一下锚框机制,锚框(Anchor)就是预设好的一堆虚拟的框,它们的尺寸和大小是固定的,但是它们与物体的真实标注框(GT)存在一些差异。人为设置锚框参数时要尽量使它能够贴近真实框。我们期望锚框是接近于真实框的,但是这显然是不可能的(因为真实框大小不一样,而锚框尺寸是固定不变的)。但是我们可以通过网络预测的结果去调整锚框,使其接近于真实框。
这个过程用数学公式就可以表达为下面图里的内容:
YOLO 中的Anchor机制笔记_第1张图片
首先需要明确的一点是,yolo网络输出的结果是一个偏移量,表示anchor与GT的差值,我们需要通过公式去调整,使anchor与预测结果的融合去贴近GT.
公式的前面两行是通过网络的预测的偏移量对anchors进行调整来获得预测的框。其中粉色的是网络预测的偏移量,蓝色的是计算出来的预测框,红色的是预设anchor的尺寸。至于为什么中心点的计算要除以anchor的宽和高是为了归一化,预测框的宽高取log是为了抑制过长或宽物体对整个loss的影响。
公式的后面两行是通过GT与anchor计算出偏移量,用灰色的框进行表示,这个是计算出来的,它的目的是为了与网络预测的偏移量计算损失,来调整网络参数。
上面讲的是锚框机制,这个机制在yolo中又做了一些改进。Yolo中引入网格(cell或者grid)这个概率,将锚框的计算方式做了一个简化,如图所示:
YOLO 中的Anchor机制笔记_第2张图片
右边的公式是改进后的锚框调整公式,左边的是原来的调整公式。由于yolo是那个物体的中心落在那个网格,那么这个网格就负责预测这个物体。如果物体的中心落在了这个网格,那么这个物体的中心坐标就应该是网络预测的偏移量加上这个网格的坐标。(例如,预测的偏移量为0.2,属于预测这个物体的网格是10,那么最终的预测的框的坐标就是10.2)也就对应了右边式子的第一行。其中,蓝色是预测结果,红色是网格的值,等号坐标是网络预测的偏移量。为什么要加sigmoid呢?是为了约束网络的预测偏移量在这一个网格内进行调整。这样对锚框进行调整后,即将锚框与yolo结合起来,又省下了归一化操作。

你可能感兴趣的:(目标检测,深度学习,自动驾驶,pytorch)