🎈🎈🎈YOLO 系列教程 总目录
YOLOV2提出论文:YOLO9000: Better, Faster, Stronger
1、YOLOV1
- 优点:快速,简单!
- 问题1:每个Cell只预测一个类别,如果重叠无法解决
- 问题2:小物体检测效果一般,长宽比可选的但单一
YOLOV2更快!更强!
YOLO | YOLOV2 | ||||||||
---|---|---|---|---|---|---|---|---|---|
batch norm | √ | √ | √ | √ | √ | √ | √ | √ | |
hi-res classifier | √ | √ | √ | √ | √ | √ | √ | ||
convolutional | √ | √ | √ | √ | √ | √ | |||
anchor boxes | √ | √ | |||||||
new network | √ | √ | √ | √ | √ | ||||
dimension priors | √ | √ | √ | √ | |||||
location prediction | √ | √ | √ | √ | |||||
passthrough | √ | √ | √ | ||||||
multi-scale | √ | √ | |||||||
hi-res detecttor | √ | ||||||||
VOC2007 mAP | 63.4 | 65.8 | 69.5 | 69.2 | 69.6 | 74.4 | 75.4 | 76.8 | 78.6 |
V2版本整体上没有太多改变,主要在网络上、实现上的细节上有一些改进,如表格中的mAP值是有明显的上升的。看这个表格,v2版本的mAP值有一个很明显的上升,接下来我会根据表格内容依次介绍v2版本在哪些方面有改进。
2、Batch Normalization
- V2版本舍弃Dropout,卷积后全部加入Batch Normalization
- 网络的每一层的输入都做了归一化,收敛相对更容易
- 经过Batch Normalization处理后的网络会提升2%的mAP
- 从现在的角度来看,Batch Normalization已经成网络必备处理
Batch Normalization:顾名思义,批量归一化处理,分别对一列特征进行进行归一化操作,具体为当前值减去均值再除以方差。
Dropout:随机杀死一些神经元,即被杀死的神经元部分的特征权重为0,避免过拟合,在全连接层最常使用。
在v2版本,首先就全面剔除Dropout,在每一次卷积后都进行了Batch Normalization,能够避免网络往不好的方向训练,能够使得收敛更快,由于这个地方的改动,YOLOv2的mAP提升了约2%。
3、更大的分辨率
- V1训练时用的是224224,测试时使用448448
- 可能导致模型水土不服,V2训练时额外又进行了10次448*448 的微调
- 使用高分辨率分类器后,YOLOv2的mAP提升了约4%
这个实际上就是V1和V2都是使用(224,224)的图像训练,然后都是用(448,448 )的图像测试。只不过V2版本,在训练的时候加了10个epoch,这10个epoch都是用(448,448 )的图像进行训练,因为10个epoch比较个数比较少,所以实际上是对模型进行微调。
这是因为用(224,224)的图像训练,然后用(448,448 )的图像测试会让模型无法适应,增加了10个epoch用(448,448 )的图像进行训练对模型进行微调有一个适应的过程,就是因为这个适应的过程使得YOLOv2的mAP提升了约4%
4、网络结构
- DarkNet,实际输入为416*416
- 没有FC层,5次降采样,(13*13)
- 1*1卷积节省了很多参数
YOLOV2借助了ResNet和VGG的一些思想:
- 所有的全连接层都不见了,全连接层容易过拟合,收敛慢,参数多,最后的输出是(7,7,30)这个用卷积也同样能够做到
- 5次降采样操作,maxpooling,(224,224)变成(112,112),最终输出(7,7)
- 输入输出进行了改变,输入改成了(416,416)输出为(13,13)
- darknet,具体为darknet19,一共有19个卷积层,每次经过卷积的时候特征图的个数会翻倍,这里用了(1,1)的一维卷积降低了卷积核的个数
5、YOLO-V2聚类提取先验框
- faster-rcnn系列选择的先验比例都是常规的,但是不一定完全适合数据集
- K-means聚类中的距离: d ( b o x , c e n t r o i d s ) = 1 − I O U ( b o x , c e n t r o i d s ) d(box,centroids) = 1-IOU(box,centroids) d(box,centroids)=1−IOU(box,centroids)
5.1 YOLOV1先验框
在YOLOV1中,有两个预选框可供选择,但是实际中物体可能远不止两种,并且有长的宽的,多个物体重叠在一起或者一个物体有多个标签,可能就会出现问题。
5.2 Fast-RCNN先验框
在当时Fast-RCNN用了9种先验框,但是它的做法是有三种scale不同大小,每种大小三种比例的先验框有1:1、1:2、2:1这3种比例,但是这种做法对实际的数据集可能无法完全适配。
5.3 YOLO-V2聚类提取先验框
比如在coco数据集中,有很多标注数据,假如说在标注的数据中标注了100万个框,对这100万个框使用kmeans进行聚类,加入k=5,就会将先验框的大小、长宽比例、中心坐标点等特征分成5类,而这5类也是专门针对当前数据集的个性化分类。那先验框就会有5种确定的大小比例,这就会和最终的实际任务会比较接近。
而kmeans的距离计算公式用LOU来实现。
作者通过实验发现,k=5可以获得比较好的IOU值。
YOLOV1 = 77 2 = 98
YOLOV2 = 1313 5 = 845
YOLOV2在先验框的数量上大幅度提升,V1是98个,V2则为845个
6、偏移量计算方法
6.1 anchor boxes
- 通过引入anchor boxes(锚框,即先验框),使得预测的box数量更多(1313n)
- 跟faster-rcnn系列不同的是先验框并不是直接按照长宽固定比给定
without anchor | 69.5mAP | 81%recall |
---|---|---|
with anchor | 69.2mAP | 88%recall |
在第5节提到增加了先验框,但是如表格所示,并没有增加mAP值,但是recall是明显增加的,recall描述了被标记物体全部被检测的可能性。
YOLOV1:使用全连接层来预测边界框的坐标
Faster R-CNN:使用手工挑选的先验因素来预测边界框,Faster R-CNN中的区域生成网络(RPN)只使用卷积层来预测锚框的偏移量和置信度。由于预测层是卷积,RPN预测了特征图中每个位置的偏移量。
Anchor Box的构成:
- 使用CNN提取的Feature Map的点,来定位目标的位置
- 使用Anchor Box的Scale来表示目标的大小
- 使用Anchor Box的Aspect Ratio来表示目标的形状。
6.2 YOLO-V2-Directed Location Prediction
直接的位置预测 改为相对位置预测策略
- bbox:中心为 ( x p , y p ) (x_p,y_p) (xp,yp),宽和高为 ( w p , h p ) (w_p,h_p) (wp,hp),则: x = x p + w p ∗ t x x = x_p+w_p*t_x x=xp+wp∗tx , y = y p + h p ∗ t y y = y_p+h_p*t_y y=yp+hp∗ty
- t x t_x tx=1,则将bbox在x轴向右移动 w p w_p wp; t x t_x tx=−1则将其向左移动 w p w_p wp
- 这样会导致收敛问题,模型不稳定,尤其是刚开始进行训练的时候
- V2中并没有直接使用偏移量,而是选择相对grid cell的偏移量
解析:
- 得到先验框有4个参数 ( x p , y p , h p , w p ) (x_p,y_p,h_p,w_p) (xp,yp,hp,wp),这是kmeans聚类预测出来的
- 预测出4个偏移量 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) (tx,ty,tw,th),新的框为 ( x , y , h , w ) (x,y,h,w) (x,y,h,w),其中 x = x p + t x x = x_p+t_x x=xp+tx,y、h、w同理
- 但是这样存在一个问题,网络初期的时候效果不好(网络啥也不会),预测出的offset偏移量可能导致得到的框会错误的很离谱,V2对此做出改进
- 具体改进为中心点x、y的偏移量的预测结果,加上sigmoid的,这样保证了中心点不会离开原来的grid cell格子,还要加上单元格与图像左上角的偏移量为 ( c x , c y ) (cx,cy) (cx,cy),h和w的预测策略不变。
具体公式为:
b x = σ ( t x ) + c x b_x = σ(t_x)+c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = σ(t_y)+c_y by=σ(ty)+cy
b w = p w e t w b_w = p_we^{t_w} bw=pwetw
b h = p h e t h b_h = p_he^{t_h} bh=pheth
加入预测值为 ( σ t x , σ t y , t w , t h ) (σt_x,σt_y,t_w,t_h) (σtx,σty,tw,th) = (0.2,0.1,0.2,0.32)
anchor框为: p w = 3.19275 , p h = 4.00944 p_w = 3.19275,p_h = 4.00944 pw=3.19275,ph=4.00944
在特征图位置:
b x = 0.2 + 1 = 1.2 b_x = 0.2+1 = 1.2 bx=0.2+1=1.2
b y = 0.1 + 1 = 1.1 b_y = 0.1+1 = 1.1 by=0.1+1=1.1
b w = 3.19275 ∗ e 0.2 = 3.89963 b_w = 3.19275*e^{0.2} = 3.89963 bw=3.19275∗e0.2=3.89963
b h = 4.00944 ∗ e 0.32 = 5.52153 b_h = 4.00944*e^{0.32} = 5.52153 bh=4.00944∗e0.32=5.52153
在原位置:
b x = 1.2 ∗ 32 = 38.4 b_x = 1.2*32=38.4 bx=1.2∗32=38.4
b y = 1.1 ∗ 32 = 35.2 b_y = 1.1*32=35.2 by=1.1∗32=35.2
b w = 3.89963 ∗ 32 = 124.78 b_w = 3.89963*32=124.78 bw=3.89963∗32=124.78
b h = 5.52153 ∗ 32 = 176.68 b_h = 5.52153*32=176.68 bh=5.52153∗32=176.68
7、YOLO-V2的感受野
7.1 感受野
从原始图像数据中,经过特征提取,得到一个Feature Map特征图,特征图的一个点可能代表原始图像中一个区域,这个区域就是这个点的感受野。越大的感受野越能感受一个整体。
7.2 卷积核对应参数
如图有一个(5,5)的图像数据(或者特征图),经过一个(3,3)的卷积核,步长为1,得到的输出就是一个(3,3)的特征图,再经过一个一次卷积就能得到(1,1)的输出,如果直接用5*5的卷积核就能得到一个(1,1)的输出,一步能得到的结果为什么要用两步呢?但是实际中却都是在用小的卷积核没有用大的。实际上用多步小的卷积核,用到的参数更少。
假设输入大小都是(H,W,C),并且都使用c个卷积核(得到c个特征图),可以计算一下各自所需参数:
1个(7,7)卷积核所需参数:
= C • ( 7 • 7 • c ) = 49 c 2 =C • (7 • 7 • c) = 49c^2 =C•(7•7•c)=49c2
3个(3,3)卷积核所需参数:
= 3 • c • ( 3 • 3 • c ) = 27 c 2 =3•c•(3•3•c) = 27c^2 =3•c•(3•3•c)=27c2
7.3 Fine-Grained Features
- 最后一层时感受野太大了,小目标可能丢失了,需融合之前的特征
yolo算法,在一次次的卷积过程中,越往后的感受野越大,(224,224)的图像经过处理最后得到的Feature Map特征图是(7,7),实际上这个感受野太大了,容易忽视一下小物体,比较容易检测到大的物体。
yolov2在最后得到的特征图是(13,13,1024)将其拆分为(1,13,13,1024),倒数第二个特征图为(26,26,512)拆分为(4,13,13,512),再拆分为(2,13,13,1024),将其拼接为(3,13,13,1024),reshape成(13,13,3072)
8、多尺度检测
- YOLO-V2-Multi-Scale
- 都是卷积操作可没人能限制我了!一定iterations之后改变输入图片大小
实际中得到的图像大小是不一样的的,全部resize成相同大小,会影响检测效果。
不同输入大小能不能做,肯定能的,卷积和输入大小没有关系啊。
最小的尺寸为(320,320),最大的为(608,608)
原始的YOLO使用448×448的输入分辨率。通过添加锚框,我们将分辨率改为416×416。然而,由于我们的模型只使用卷积层和池化层,因此可以实时调整大小。我们希望YOLOv2能够鲁棒地运行在不同尺寸的图像上,所以我们将多尺度训练应用到模型中。
我们不需要修改输入图像的大小,而是每隔几个迭代就改变网络。每10个批次,我们的网络就会随机选择一个新的图像尺寸。由于我们的模型缩减了32倍,我们从以下32的倍数中抽取:{320, 352, ..., 608}。因此,最小的选项是320 × 320,最大的是608 × 608。我们将调整网络的尺寸,然后继续训练。
这种制度迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。
在低分辨率下,YOLOv2作为一个廉价、相当准确的检测器运行。在288×288时,它以超过90 FPS的速度运行,其mAP几乎与Faster R-CNN一样好。这使它成为较小的GPU、高帧率视频或多个视频流的理想选择。
在高分辨率下,YOLOv2是一个最先进的检测器,在VOC 2007上的mAP为78.6,而运行速度仍高于实时速度。