yolov1到yolov2的改进

大部分人学习YOLO应该是从V3开始的,我很奇葩,从V2开始的,但是V2论文中有很多点一笔带过,前前后后断断续续看了几篇博客介绍V2和V1,想着做一个阶段性总结,自己写一篇,也有助于自己加深理解。
大部分参考https://blog.csdn.net/shentanyue/article/details/84860600#t0
这篇总结的很全面
目前的目标检测算法分为两类:One-stage和Two-stage
Two-stage检测算法将检测问题划分为两个阶段首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修),这一类的典型代表是R-CNN, Fast R-CNN, Faster R-CNN,Mask R-CNN家族。他们识别错误率低,漏识别率也较低,但速度较慢,不能满足实时检测场景。
One-stage检测算法其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度,比较典型的算法如YOLO,SSD,YOLOv2,YOLOv3等。
YOLO算法的核心:将目标检测看作回归问题解决,如果一个标注的对象的中心落在某个区域上,那么这个区域负责预测这个物体。每个区域需要预测2个bounding box的位置和置信度。每个边界框对应于5个输出,分别是x,y,w,h和置信度。其中x,y代表边界框的中心离开其所在网格单元格边界的偏移。w,h代表边界框真实宽高相对于整幅图像的比例。x,y,w,h
置信度(score)=Pr(object)*IOU
IOU之前的博客解释过,预测框和实际框的交集/两者并集yolov1到yolov2的改进_第1张图片

根据上一步得到7X7X2个bounding box,首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU(IOU(bb-max,bb-curve1)),如果其值大于一定阈值(说明bb-max,和bb-curve重合度过高,自然选择置信度分数高的框留下),那么就将bb-curve分数置为0;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。
损失函数含三部分:位置误差、置信度误差、分类误差。
具体公式如下:
yolov1到yolov2的改进_第2张图片yolov1到yolov2的改进_第3张图片
先验框:简单来说,在YOLOv1中,作者遇到了一个问题,虽然我们通过实验知道要选两个boxes是最优的,但是如何这两个boxes的尺寸如何决定呢?网络自身可以学着不断调节box的大小,但是我们能够提前给定一个/多个尺寸作为备选不是更好吗?因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。 因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标: yolov1到yolov2的改进_第4张图片
(1-iou)在 training set bounding boxes上来寻找先验框(框的尺寸)
https://blog.csdn.net/Pattorio/article/details/80095511
v2沿用YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets [tx,ty,tw,th] ,可以按如下公式计算出边界框实际位置和大小:https://zhuanlan.zhihu.com/p/35325884

yolov2每个卷积层加上BN
BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。
这篇详细讲解了BN学习
https://blog.csdn.net/hjimce/article/details/50866313
v2删除了v1中最后一个全连接层和增加anchorbox预测边界框
v1下每个gridcell只能预测一套分类概率,供2个box share
v2使用了anchor box ,每个位置的anchor box都单独预测分类概率值
v2采用多尺度输入训练策略–具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小
但是我们自己训练的时候cfg里设置的还是416*416,按博客里的意思每经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么可以选择的图片尺寸就是{320,352,…,608}。从中随机挑一个尺寸,接着按照这个尺寸调整网络进行训练。
在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。
yolov1到yolov2的改进_第5张图片
Darknet-19:
YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。

最终得出的基础模型就是Darknet-19,包含19个卷积层、5个最大值池化层(maxpooling layers )。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。
YOLOv2的训练主要包括三个阶段:

第一阶段:在ImageNet分类数据集上从头开始预训练Darknet-19,训练160个epoch。输入图像的大小是224*224,用的随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。

第二阶段:将网络的输入调整为448*448,继续在ImageNet数据集上fine-tuning分类模型,训练10个epoch。参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

Training for Detection:

在前面Training for Classification之后,就该训练detection网络了,作者去掉了原网络最后一个卷积层,转而增加了三个3 * 3 * 1024的卷积层(可参考darknet中cfg文件),并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

你可能感兴趣的:(yolo,学习小记录)