YOLO v1虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLO v2在YOLO v1的基础上提出了几种改进策略,如下图所示,一些改进方法能有效提高模型的mAP。
这个图片的第2行第1列是进行改进的点,第2行第3列应该看红色数字标注的列,有√
就是有改进,空白就是没改进,第2行第4列就是今天咱们的主角yolo V2,集所有BUFF于一身得到最强mAP值,第3行是对应的mAP值。下面我们按顺序逐一讲解:
YOLO v2采用Darknet-19,其网络结构如下图所示,包括19 1919个卷积层和5 55个max pooling层,主要采用3 × 3卷积和1 × 1卷积,这里1 × 1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用 YOLO v2,模型的mAP值没有显著提升,但计算量减少了。
各参数计算方法:
可参考 :https://blog.csdn.net/m0_54634272/article/details/128519246
kernel(内核): 是一个2维矩阵,长 × 宽;
filter(滤波器):是一个三维立方体,长× 宽 × 深度, 其中深度便是由多少张内核构成;
两者之间的关系:可以说 kernel 是filter 的基本元素, 多张kernel 组成一个filter;
那么, 一个filter 中应该包含多少张 kernel 呢?
答:是由输入的通道个数所确定, 即,输入通道是3个特征时,则后续的每一个filter中包含3张kernel ;
filter输入通道是包含128个特征时, 则一个filter中所包含kernel 数是128张。
那么一层中应该有多少个filter 构成呢?
答: 我们想要提取多少个特征,即我们想要输出多少个特征,那么这一层就设置多少个filter;
一个filter 负责提取某一种特征,N个filter 提取 N 个特征;
Filters(卷积核个数):是可以人为指定的,在out_channels
设置,如果设置为2,就会生成两个形状相同,初始参数不同的filter。
Size:卷积核的大小
Stride(步长):往往决定了输出特征图的大小。h/stride和w/stride。
Q:为什么要加入1x1的卷积层
Q:maxpool特征图个数翻倍?
out_channels=2
Q:1x1节省了参数?
在YOLO-V1
中使用全连接层进行bounding box
预测,这会丢失较多的空间信息,导致定位不准。YOLO-V2
借鉴了Faster R-CNN
中anchor
的思想,我们知道Faster R-CNN
中的anchor
就是在卷积特征图上进行滑窗采样,每个中心预测9
个不同大小和比例的anchor
。
总的来说YOLO-V2
移除了全连接层(以获得更多的空间信息)使用anchor boxes
去预测bounding boxes
。并且YOLO-V2
中的anchor box
可以同时预测类别和坐标。具体做法如下:
YOLO-V1
比起来,去掉最后的池化层,确保输出的卷积特征图有更高的分辨率。factor=32
),使得输入卷积网络的416x416
的图片最终得到13x13
的卷积特征图(416/32=13
)。anchor box
同时预测类别和坐标。因为YOLO-V1
是由每个cell
来负责预测类别的,每个cell
对应的两个bounding box
负责预测坐标。YOLO-V2
中不再让类别的预测与每个cell
绑定一起,而是全部都放到anchor box
中去预测。anchor
之后,我们来计算下,假设每个cell
预测9
个anchor
,那么总计会有13x13x9=1521
个boxes
,而之前的网络仅仅预测了7x7x2=98
个boxes
。具体每个网格对应的输出维度如下图:我们知道YOLO-V1
输出7x7x30
的检测结果,如上图,其中每个网格输出的30
个数据包括两个候选框的位置,有无包含物体的置信度,以及网格中包含物体类别的20
个概率值。
YOLO-V2
对此做了些改进,将物体类别的预测任务交给了候选框,而不再是网格担任了,那么假如是9
个候选框,那么就会有9x25=225
个数据的输出维度,其中25
为每个候选框的位置,有无物体的置信度以及20
个物体类别的概率值。这样的话,最后网络输出的检测结果就应该是13x13x225
,但是上面网络框架中是125
,是怎么回事儿呢?我们接着看。
在Faster R-CNN和SSD中,先验框都是手动设定的,带有一定的主观性。 YOLO v2采用k-means聚类算法对训练集中的边界框做了聚类分析,选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率,最终选择5 个聚类中心,得到5个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习。
在使用anchor
时,Faster R-CNN
中anchor boxes
的个数和宽高维度往往是手动精选的先验框(hand-picked priors
),如果能够一开始就选择了更好的,更有代表性的先验boxes
维度,那么网络就应该更容易学到精准的预测位置。YOLO-V2中利用K-means
聚类方法,通过对数据集中的ground truth box
做聚类,找到ground truth box
的统计规律。以聚类个数k
为anchor boxes
个数,以k
个聚类中心box
的宽高为anchor box
的宽高。
可以复习一下K-means聚类算法:
基础聚类算法:K-means算法
但是,如果按照标准的k-means
使用欧式距离函数,计算距离的时候,大boxes比小boxes产生更多的error
。但是,我们真正想要的是产生好的IoU
得分的boxes
(与box大小无关),因此采用了如下距离度量方式:
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)
假设有两个框,一个是3x5
,一个框是5x5
,那么欧式距离计算为:
( 5 − 3 ) 2 + ( 5 − 5 ) 2 = 2 \sqrt{{(5-3)^2+(5-5)^2}}=2 (5−3)2+(5−5)2=2
IoU
的计算如下,为了统计宽高聚类,这里默认中心点是重叠的:
( 3 ∗ 5 ) / ( 5 ∗ 5 ) = 0.6 (3*5)/(5*5)=0.6 (3∗5)/(5∗5)=0.6
当两个框无限接近时,IOU值也就趋于1,此时 d ( b o x , c e n t r o i d s ) d(box,centroids) d(box,centroids)接近于0,K-means聚类算法将这样的框聚在一起。
这里,为了得到较好的聚类个数,算法里做了组测试,如下图,随着k
的增大IoU
也在增大,但是复杂度也在增加。
k-means聚类个数的选择
所以平衡复杂度和IoU
之后,最终得到k
值为5
。可以从右边的聚类结果上看到5
个聚类中心的宽高与手动精选的boxes
是完全不同的,扁长的框较少,瘦高的框较多(黑丝框对应VOC2007
数据集,紫色框对应COCO
数据集)。 这样就能明白为什么上面网络框架中的输出为什么是13x13x125
了,因为通过聚类选用了5
个anchor。
anchor boxes
吧,而且在5之后曲线上升的就不是那么快了,所以选了一个折中的值5。上面学习,我们知道这里用到了类似Faster R-CNN
中的anchor
,但是使用anchor boxes
有一个问题,就是会使得模型不稳定,尤其是早期迭代的时候。大部分的不稳定现象出现在预测box
的中心坐标时,所以YOLO-V2
没有用Faster R-CNN
的预测方式。
YOLO-V2位置预测(tx,ty)就是预测边界框中心点相对于对应cell
左上角位置的相对偏移值,为了将边界框中心点约束在当前cell
中,使用了sigmoid
函数处理偏移值,这样预测的偏移值就在(0,1)
范围内了(每个cell的尺度看作1)。
我们具体来看以下这个预测框是怎么产生的?
在网格特征图(13x13)
的每个cell
上预测5
个anchor
,每一个anchor
预测5
个值:(tx,ty,tw,th,t0)。如果这个cell距离图像左上角的边距为(cx,cy),cell
对应的先验框(anchor
)的长和宽分别为(pw,ph),那么网格预测框为下图蓝框。如下图:
候选框如何生成?
总的来说,虚线框为anchor box就是通过先验聚类方法产生的框,而蓝色的为调整后的预测框。算法通过使用维度聚类和直接位置预测这亮相anchor boxes的改进方法,将mAP提高了5%。接下来,我们继续看下还有哪些优化?
SSD
通过不同Scale
的Feature Map
来预测Box
,实现多尺度,不熟悉的可以看下面:
目标检测算法SSD结构详解
而YOLO-V2
则采用了另一种思路:通过添加一个passthrough layer
,来获取之前的26x26x512
的特征图特征,也就是前面框架图中的第25
步。对于26x26x512
的特征图,经过重组之后变成了13x13x2048
个新的特征图(特征图大小降低4倍,而channels
增加4倍),这样就可以与后面的13x13x1024
特征图连接在一起形成13x13x3072
大小的特征图,然后再在此特征图的基础上卷积做预测。如下图:
YOLO-V2
算法使用经过扩展后的特征图,利用了之前层的特征,使得模型的性能获得了1%
的提升。
原始的YOLO
网络使用固定的448x448
的图片作为输入,加入anchor boxes
后输入变成了416x416
,由于网络只用到了卷积层和池化层,就可以进行动态调整,检测任意大小的图片。为了让YOLO-V2
对不同尺寸图片具有鲁棒性,在训练的时候也考虑到了这一点。
不同于固定网络输入图片尺寸的方法,每经过10
批训练(10 batches
)就会随机选择新的图片尺寸。网络使用的降采样参数为32
,于是使用32
的倍数{320,352,…,608},最小尺寸为320x320
,最大尺寸为608x608
。调整网络到相应维度然后继续训练。这样只需要调整最后一个卷积层的大小即可,如下图:
这种机制使得网络可以更好地预测不同尺寸的图片,同一个网格可以进行不同分辨率的检测任务,在小尺寸图片上YOLO-V2
运行更快,在速度和精度上达到了平衡。