YOLOv2 学习记录

说明
1.本文是博主的学习记录,主要为了方便以后查看,当然如果能为别人提供帮助就更好了,如果有不对的地方请指正
2.本文重点是了解YOLOv2在YOLO的基础上做了哪些改进,尽量用较少篇幅表达清楚论文整体思路,其他一些不影响理解论文算法的东西有需要的请查看其他博客
3.论文中的链接是我经过大量搜索,个人认为讲解最清楚的参考,看本文的过程中如对一些名词有疑惑可以直接点击参考链接

原论文
代码
论文翻译

创新点
1.使用分类网络Darknet19提升速度
2.使用BN层
3…多尺度训练网络
4.使用K-means选取anchor box
5.提出一种新方法,使用对象分类的分层视图,将不同的数据集组合在一起,扩展当前能够检测的类别
6.提出联合训练方法,同时使用检测数据集和分类数据集训练检测网络,用检测数据集学习精确定位对象,用分类数据集来增加可检测物体类和鲁棒性
7.基于YOLOv2用联合训练方法在ImageNet的9000多个类的分类数据和COCO的检测数据训练出了YOLO9000(一个可以检测超过9000种不同物体类别的实时检测器)

主要解决YOLOv1的问题
1.YOLOv1产生大量的定位误差
2.YOLOv1的召回率比较低

YOLO9000:Better, Faster, Stronger
(主要针对以上问题,作者提出YOLOv2/YOLO9000,从YOLO9000的名字就可以看出它有三方面的改进:Better、Faster、Stronger)
1.Better
1)Batch Normalization(使用批量归一化)
通过在所有卷积层上添加批量归一化可以显著提高收敛性,代替其他正则化(如删除DropOut)而不会发生过拟合(mAP提高2%以上)
2)High Resolution Classifier(用高分辨率分类图片微调分类网络)
给图片标注类别容易,分类数据很多,但是标注边框工作量太大,检测数据集少,所以检测网络的提取特征的基础网络都是用分类数据集训练的,而分类数据集如ImageNet上的图片分辨率都比较低,相反检测数据集分辨率相对会高,比如最初的YOLO在224x224的数据上训练分类网络,检测数据却是448x448,这样肯定会影响性能,所以对于YOLOv2会用448x448的数据微调分类网络(这种高分辨率使mAP提高近4%)
3)Convolutional With Anchor Boxes(去掉全连接层,并改用anchor box预测bounding box)
使用anchor box时有两个问题。第一个是anchor box是手工挑选的尺寸,不一定合适,虽然网络可以学习着调整这些框,但是如果选择更适合网络的先验框,就可以让网络更容易学习;第二个问题是采用anchor box预测的是offset,中心坐标txt_xtyt_y不受控制,如果落在其他栅挌中,应该有中心落入的栅挌负责(注意这是因为YOLO有栅挌的概念),训练初期,模型初始化,由于中心坐标位置不一定在哪,导致模型很不稳定

第一个问题:解决方案就是不再手工选择先验框,而是用k-means聚类算法自动找到好的先验框分布,但是如果使用欧氏距离,大尺寸的框会比小尺寸的框误差大,为了使iou与框的尺寸无关(YOLOv1损失函数w开根号也是解决这个问题),所以把欧氏距离改为新的距离公式:
YOLOv2 学习记录
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”,IOU越大,“距离”越近
第二个问题:YOLOv2不预测offset,而是延续YOLOv1预测bbox的中心相对于所在栅挌左上角的坐标(相对于栅挌边长的比例,(0,1)之间),为了使bbox中心坐标在(0,1)之间(即在对应的栅挌中),使用sigmoid函数来约束预测值所以新的坐标计算公式为:
YOLOv2 学习记录
YOLOv2 学习记录
其中bxb_xbyb_ybwb_wbhb_h是预测的bbox的中心坐标以及宽高,cxc_xcyc_y是对应栅挌的左上角坐标(整张图片左上角坐标为(0,0)),pwp_wphp_h是anchor box的宽高,σ(txt_x)、σ(tyt_y)是bbox的中心相对于栅挌左上角的横纵坐标,σ(tot_o)是bbox的中有物体的置信分数,σ是sigmoid函数

YOLOv2每个栅挌预测5个bbox,每个bbox包含txt_xtyt_ytwt_wtht_htot_o,并且每个bbox都有一组类别概率(YOLOv1每个栅挌只有一组)所以YOLOv2的输出为SxSx(Bx(5+C)),实际S=13,B=5,C=20,如下图所示
YOLOv2 学习记录
4)Fine-Grained Features(细粒度特征)
最后输出13x13的特征图检测大目标还行,但是小目标特征已经不明显了,为了更好的检测小目标,YOLOv2引入一种称为passthrough层的方法在特征图中保留一些细节信息,具体操作就是在最后一个pooling之前,特征图的大小是26×26×512,将其分为两路,1路拆分成4×13×13×512,然后经过1×1卷积降到4×13×13×64(即13×13×256)直接传递(passthrough)到pooling后,另一路经过pooling变成13×13×1024的特征图,两者叠加到一起作为输出的特征图为13×13×1280,再经过3×3卷积和1×1卷积,最后输出13×13×125,即13×13×5×25,13×13就是栅挌数,5就是每个栅挌预测5个bbox,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度(参考
注:
a)大物体往往占据图像的中心,因此最好在中心有一个位置来预测这些物体而不是四个位于附近的网格都参与预测,在特征图中需要奇数个位置,所以输入由448x448变为416x416,416x416的输入图像,得到13 ×13(奇数)的输出特征图
b)1拆4具体操作如下图
YOLOv2 学习记录
1个4×4拆为4个2×2,深度不变所以没画
5)Multi-Scale Training(多尺度训练)
由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以任意尺寸的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,就是在训练过程中每间隔几个批次就改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:{320,352,…,608},输入图片最小为320x320,此时对应的特征图大小为 10x10(不是奇数了),而输入图片最大为608×608,对应的特征图大小为 19×19 。在训练过程,每隔几个批次随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练
YOLOv2 学习记录
采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果

2.Faster
YOLOv2使用分类网络Darknet-19,比YOLOv1更快,比VGG-16更准

3.Stronger
就是联合训练分类数据集和检测数据集得到YOLO9000,暂时不看这部分

训练过程
YOLOv2的训练主要包括三个阶段。第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224×224 ,共训练160个epochs。然后第二阶段将网络的输入调整为 448×448,继续在ImageNet数据集上微调分类模型,训练10个epochs。第三个阶段就是修改Darknet-19分类模型为检测模型,并在检测数据集上继续微调网络
YOLOv2 学习记录
损失函数
YOLOv2 学习记录
1.W、H分别是输出特征图的宽高(13×13),A是先验框数量(5),各个lambda值是各部分loss的权重系数
2.第一项loss是计算框内无目标情况的置信度误差(先计算各个预测框和所有ground truth的IOU值,并且取最大值Max_IOU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框内无目标,需要计算noobj的置信度误差)
2.第二项loss是计算先验框与预测宽的坐标误差,但是只在前12800个iterations间计算(是先验框不是gt,应该是在训练前期使预测框快速学习到先验框的形状)
3.第三大项loss计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差
1)匹配原则:对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth
2)对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差,YOLO中一个ground truth只会与一个先验框匹配(IOU值最好的),对于那些IOU值超过一定阈值的先验框,其预测结果就忽略了。这和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框
3)尽管YOLOv2和YOLOv1计算loss处理上有不同,但都是采用均方差来计算loss。另外需要注意的一点是,在计算boxes的 [公式] 和 [公式] 误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正(w和h都归一化到(0,1)),这样对于尺度较小的boxes其权重系数会更大一些,可以放大误差,起到和YOLOv1计算平方根相似的效果
参考

YOLOv2缺点
对小目标检测性能还有待提高