yolov2理解

参考:https://blog.csdn.net/lwplwf/article/details/82895409 

1、Batch Normalization
BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。作者在YOLOv2种为每个卷积层都添加了BN层,由于BN可以规范模型,所以加入BN后就把dropout去掉了,实验证明添加了BN层可以提高2%的mAP。

2、High Resolution Classifier
现在基本跑个分类或目标检测模型都不会从随机初始化所有参数开始,所以一般都是用预训练的网络来fine-tuning自己的网络,而且预训练的网络基本上都是在ImageNet数据集上跑的,一方面数据量大,另一方面训练时间久,而且也比较容易得到。

YOLOv1在预训练的时候用的是224*224的输入,一般预训练的分类模型都是在ImageNet数据集上进行的,然后在检测的时候采用448*448的输入。这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
YOLOv2中将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch,然后再将输入调整到448*448,再训练10个epoch。**注意这两步都是在ImageNet数据集上操作。**最后再在检测的数据集上fine-tuning,也就是检测的时候用448*448的图像作为输入就可以顺利过渡了。

3、Convolutional With Anchor Boxes
YOLOv1是利用全连接层直接预测bounding box的坐标。
YOLOv2则借鉴了Faster R-CNN的思想,引入anchor。

YOLOv2做了以下改变:
(1)删掉全连接层和最后一个pooling层,使得最后的卷积层可以有更高分辨率的特征;
(2)缩减网络,用416*416大小的输入代替原来448*448。这样做是希望希望得到的特征图都有奇数大小的宽和高,奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个中心cell。因为大的目标一般会占据图像的中心,所以希望用一个中心cell去预测,而不是4个中心cell。网络最终将416*416的输入下采样32倍变为13*13大小的feature map输出,查看.cfg文件可以看到有8个pooling层。

YOLOv1中将输入图像分成7*7的网格,每个网格预测2个bounding box,一共只有7*7*2=98个box。
YOLOv2中引入anchor boxes,输出feature map大小为13*13,每个cell有5个anchor box预测得到5个bounding box,一共有13*13*5=845个box。增加box数量是为了提高目标的定位准确率。

4、Dimension Clusters
Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。
如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络更好地预测。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。

作者发现采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了距离函数,使得误差和box的大小无关:
设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析师使用box与聚类中的box之间的IOU值作为距离指标。

在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框

对于两个数据集,5个先验框的width和height如下

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

这里先验框的大小具体指什么作者在论文中并没有说明,从代码实现上看,应该是相对于13*13的特征图的大小。 

实验对比:
(1)采用聚类分析得到的先验框比手动设置的先验框平均IOU值更高,因此模型更容易训练学习。
(2)仅选取5种box就能达到Faster RCNN的9种box的效果。

5、Direct Location prediction
这部分细节很多
作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的中心坐标(x,y)值。
在基于region proposal的目标检测算法中,是通过预测tx和ty来得到(x,y)值,也就是预测的是offsets。
论文这里公式是错的,应该是“+”号。依据是下文中的例子,以及Faster R-CNN中的公式。

å¨è¿éæå¥å¾çæè¿°

这个公式是无约束的,预测的边界框很容易向任何方向偏移。
当tx=1时,box将向右偏移一个anchor box的宽度;
当tx=-1时,box将向左偏移一个anchor box的宽度;
因此,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。

YOLOv2中没有采用这种预测方式,而是沿用了YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值。
网络在最后一个卷积层输出13*13的feature map,有13*13个cell,每个cell有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值。

分别为:tx、ty、tw、th和to(类似YOLOv1的confidence)
为了将bounding box的中心点约束在当前cell中,使用sigmoid函数将tx、ty归一化处理,将值约束在0~1,这使得模型训练更稳定。

损失函数

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

(1)W,H分别指的是特征图(13*13)的宽与高;
(2)A指的是先验框数目(这里是5);
(3)各个λ值是各个loss的权重系数,参考YOLOv1的loss;
(4)第一项loss是计算background的置信度误差,但是哪些预测框来预测背景呢,需要先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background,需要计算noobj的置信度误差;
(5)第二项是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算,我觉得这项应该是在训练前期使预测框快速学习到先验框的形状;
(6)第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。
先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。
在计算obj置信度时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值。对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。这点在YOLOv3论文中也有相关说明:YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框。
尽管YOLOv2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss。
另外需要注意的一点是,在计算boxes的和误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正:l.coord_scale * (2 - truth.w*truth.h),这样对于尺度较小的boxes其权重系数会更大一些,起到和YOLOv1计算平方根相似的效果。
 

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/89312893