前言
1.本文重点是YOLOv2在YOLO的基础上做了哪些改进,尽量用较少篇幅表达清楚论文算法,其他一些不影响理解算法的东西不做赘述
2.博客主要是学习记录,为了更好理解和方便以后查看,当然如果能为别人提供帮助就更好了,如果有不对的地方请指正(论文中的链接是我经过大量搜索,个人认为讲解最清楚的参考)
创新点
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,中心坐标 t x t_x tx和 t y t_y ty不受控制,如果落在其他栅挌中,应该有中心落入的栅挌负责(注意这是因为YOLO有栅挌的概念),训练初期,模型初始化,由于中心坐标位置不一定在哪,导致模型很不稳定
第一个问题:解决方案就是不再手工选择先验框,而是用k-means聚类算法自动找到好的先验框分布,但是如果使用欧氏距离,大尺寸的框会比小尺寸的框误差大,为了使iou与框的尺寸无关(YOLOv1损失函数w开根号也是解决这个问题),所以把欧氏距离改为新的距离公式:
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”,IOU越大,“距离”越近
第二个问题:YOLOv2不预测offset,而是延续YOLOv1预测bbox的中心相对于所在栅挌左上角的坐标(相对于栅挌边长的比例,(0,1)之间),为了使bbox中心坐标在(0,1)之间(即在对应的栅挌中),使用sigmoid函数来约束预测值所以新的坐标计算公式为: