YOLOv1是一个anchor-free的,从YOLOv2开始引入了Anchor,在VOC2007数据集上将mAP提升了10个百分点。YOLOv3也继续使用了Anchor,本文主要讲ultralytics版YOLOv3的Loss部分的计算, 实际上这部分loss和原版差距非常大,并且可以通过arc指定loss的构建方式, 如果想看原版的loss可以在下方release的v6中下载源码。
Github地址: https://github.com/ultralytics/yolov3
Github release: https://github.com/ultralytics/yolov3/releases
1. Anchor
Faster R-CNN中Anchor的大小和比例是由人手工设计的,可能并不贴合数据集,有可能会给模型性能带来负面影响。YOLOv2和YOLOv3则是通过聚类算法得到最适合的k个框。聚类距离是通过IoU来定义,IoU越大,边框距离越近。
d ( b o x , c e n t r o i d ) = 1 − I o U ( b o x , c e n t r o i d ) d(box,centroid)=1-IoU(box,centroid) d(box,centroid)=1−IoU(box,centroid)
Anchor越多,平均IoU会越大,效果越好,但是会带来计算量上的负担,下图是YOLOv2论文中的聚类数量和平均IoU的关系图,在YOLOv2中选择了5个anchor作为精度和速度的平衡。
2. 偏移公式
在Faster RCNN中,中心坐标的偏移公式是:
{ x = ( t x × w a ) + x a y = ( t y × h a ) + y a \left\{ \begin{aligned} x=&(t_x\times w_a)+x_a\\ y=&(t_y\times h_a)+y_a \end{aligned} \right. { x=y=(tx×wa)+xa(ty×ha)+ya
其中 x a x_a xa、 y a y_a ya 代表中心坐标, w a w_a wa和 h a h_a ha代表宽和高, t x t_x tx和 t y t_y ty是模型预测的Anchor相对于Ground Truth的偏移量,通过计算得到的x,y就是最终预测框的中心坐标。
而在YOLOv2和YOLOv3中,对偏移量进行了限制,如果不限制偏移量,那么边框的中心可以在图像任何位置,可能导致训练的不稳定。
{ b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h σ ( t o ) = P r ( o b j e c t ) × I O U ( b , o b j e c t ) \left\{ \begin{aligned} b_x&=\sigma(t_x)+c_x\\ b_y&=\sigma(t_y)+c_y\\ b_w&=p_we^{t_w}\\ b_h&=p_he^{t_h}\\ \sigma(t_o)&=Pr(object)\times IOU(b,object) \end{aligned} \right. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧bxbybwbhσ(to)=σ(tx)+cx=σ(ty)+cy=pwetw=pheth=Pr(object)×IOU(b,object)
对照上图进行理解: