Harukaze

 

【YOLO】anchor机制的理解

推荐anchor机制的理解:https://www.zhangshengrong.com/t/用yolov5检测的metric/
内容来自于上述链接,便于自己理解记录在此。

为什么使用anchor进行检测?

最初的YOLOv1的初始训练过程很不稳定,在YOLOv2的设计过程中,作者观察了大量图片的ground truth,发现相同类别的目标实例具有相似的gt长宽比:比如车,gt都是矮胖的长方形;比如行人,gt都是瘦高的长方形。所以作者受此启发,从数据集中预先准备几个几率比较大的bounding box,再以它们为基准进行预测。


anchor的检测过程

首先,yolov5中使用的coco数据集输入图片的尺寸为640x640,但是训练过程的输入尺寸并不唯一,因为v5可以采用masaic增强技术把4张图片的部分组成了一张尺寸一定的输入图片。但是如果需要使用预训练权重,最好将输入图片尺寸调整到与作者相同的尺寸,而且输入图片尺寸必须是32的倍数,这与下面anchor检测的阶段有关。


上图是张玉荣大佬自己绘制的v5 v6.0的网络结构图。当我们的输入尺寸为640*640时,会得到3个不同尺度的输出:80x80(640/8)、40x40(640/16)、20x20(640/32),即上图中的CSP2_3模块的输出。

anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

其中,80x80代表浅层的特征图(P3),包含较多的低层级信息,适合用于检测小目标,所以这一特征图所用的anchor尺度较小;同理,20x20代表深层的特征图(P5),包含更多高层级的信息,如轮廓、结构等信息,适合用于大目标的检测,所以这一特征图所用的anchor尺度较大。另外的40x40特征图(P4)上就用介于这两个尺度之间的anchor用来检测中等大小的目标。yolov5之所以能高效快速地检测跨尺度目标,这种对不同特征图使用不同尺度的anchor的思想功不可没。

以上就是yolov5中的anchors的具体解释。


关于anchor的理解:

写在前面:
本文只针对anchor的位置和大小进行分析,并不涉及confidece及class。希望通过这个文章给初学yolo的人一点小小的帮助,能更好的理解anchor的思想
anchor box: 锚框,先验框
anchor box 的属性为:中心坐标Cx,Cy;长宽属性pw,ph
iou: 交并比
cell: yolo中将目标图像分割为不同大小的区域如1313,在1313的区域大小中,我们将这169个区域称为cell

正文:
在yolov2以后,yolo框架使用anchor技术对目标进行识别,通过聚类训练将不同的样本中的框分类出固定大小的几类anchor box。
在进行训练时,yolo通过样本的真实框的大小与不同anchor box进行iou运算,选择iou最大的一个先验框。先验框的大小位置是固定的(先验框的Cx,Cy为cell的左上角坐标),在进行回归时,我们并不对目标的真实坐标x,y进行预测,而是预测目标中心点相对于其所在的cell的左上角(也就是先验框的中心点)的偏移量(tx,ty),也就是按照其选择的先验框的绝对位置加上偏移量计算位置信息。(tx,ty)利于激活函数对预测的数值进行处理再与其cell左上角的坐标相加得到预测的绝对坐标bx,by。
公式为
\(bx = σ(tx) + Cx\)
\(by = σ(ty) + Cy\)
我们利用bx和by与样本标准的真实坐标x,y进行损失函数计算和反向传播,便可学习出相对准确的偏移量(tx,ty)。解决了anchor位置的问题,我们也可以通过类似的思想解决预测框的长宽大小问题。在yolo中我们也是通过预测其相对anchor的相对大小来计算预测框的真实大小,参数为(tw,th)。在这里我们利用指数函数的特性,使用e为底使用对tw,th进行激活,利用激活值与先验框的长宽进行乘法运算得出预测框的长宽bw,bh。
公式为:
\(bw = pwe^{tw}\)
\(bh = phe^{th}\)
这样通过预测中间变量计算中心坐标和宽高的真实值,能够将需要直接预测的参数值(tx,ty,tw,th)维持在一个较小的范围,利于模型的学习精度和梯度传播速度。
根据我对于yolo3框架源代码的阅读得知,作者在进行损失函数计算时,将真实框的标签数据根据box,by,be,bh的公式进行反函数的计算,计算出真实标签(true-label)相对于先验框的左标长宽数据,然后与预测值的tx,ty,tw,th计算损失。


anchor匹配策略(build_targets)分析

https://blog.csdn.net/ChuiGeDaQiQiu/article/details/116402281
https://blog.csdn.net/ChuiGeDaQiQiu/article/details/116403974

(Pdb) print(pred[0].shape)
torch.Size([1, 3, 76, 76, 7]) #1:batch-size,3:该层anchor的数量,7:位置(4),obj(1),分类(2)

posted on 2022-08-11 15:31  Harukaze  阅读(2614)  评论(0)    收藏  举报

导航