今天,我们一起学习下YOLO-V2
跟YOLO-V1
比起来都做了哪些改进?从速度优化和精确度优化的角度来看,主要有以下内容:
Darknet-19
结构YOLO-v2
结构Anchor
卷积针对YOLO-V1
准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD
的特点,提出了YOLO-V2
算法。改算法从速度和精度上做了一些改进措施,我们一起看下都有哪些优化?微信公众号[智能算法]回复关键字“1002”,即可下载YOLOV2
论文。
大多数检测网络依赖于VGG-16
作为特征提取网络,VGG-16
是一个强大而准确的分类网络,但是过于复杂。比如一张224x224
的图片进行一次前向传播,其卷积层就需要多达306.9
亿次浮点数运算。
YOLO-V1
使用使用的是基于GoogLeNet
的自定制的网络,比VGG-16
更快,一次前向传播需要85.2
亿次运算,不过它的精度要略低于VGG-16
。
在YOLO-V2
中,使用的是Darknet-19
的网络,该网络一次前向传播仅需要55.8
亿次运算,我们先来看下Darknet-19
模型的网络框架:
Darknet-19
顾名思义,有19
个卷积层,如下图:
Darknet-19网络框架
网络很简单,大致连接如下:
224x224x3
,经过3x3x32
的卷积层以及池化后得到112x112x32
的特征图;3x3x64
的卷积层以及池化后得到56x56x64
的特征图;3x3x128
,1x1x64
,3x3x128
的卷积层以及池化后得到28x28x128
的特征图;3x3x256
,1x1x128
,3x3x256
的卷积层和最大化池化后得到14x14x256
的特征图;3x3x512
,1x1x256
,3x3x512
,1x1x256
,3x3x512
和最大化池化后得到7x7x512
的特征图;3x3x1024
,1x1x512
,3x3x1024
,1x1x512
,3x3x1024
的卷积层后得到7x7x1024
的特征图;1x1x1000
的卷积层,均值池化层得到1000
个结果再经过softmax
输出。既然YOLO-V2
的主框架是基于Darknet-19
搭建的,我们来看下YOLO-V2
的结构,如下图:
YOLO-V2的结构框架
其中上图中的输入大小为416x416x3
,其他的0-24
层跟上面学的Darknet-19
是一样的。我们来从第25
层看一下后面的那几层啥意思:
25
层的route 16
的意思是将第16
层中的数据取过来做第26
层的处理。26
层对第16
层的数据做了一个reorganization
的处理,将26x26x512
的数据转化为13x13x2048
的特征图;27
层将第26
层和24
层的数据拿过来堆放到一起,给第28
层处理;28
层做了一个3x3x1024
的卷积,将特征图大小变为13x13x1024
;29
层最终经过一个1x1x125
的卷积层,将特征图变为13x13x125
,最后得到检测结果。到这里应该有一些疑问,什么是reorganization
处理?以及为什么最后是13x13x125
的尺寸?这里简单的说下reorganization
处理,reorganization
处理就是硬性的对数据进行重组,比如将一个2x2
的矩阵重组成1x4
,重组前后元素总个数不变,但是尺寸变化。上面的就是对26x26x512
的数据进行了重组为13x13x2048
大小。那么最后的尺寸为什么是13x13x125
,这个下面再讲好理解些。框架上大致优化就这些,我们接着看以下精确度上如何优化。
为了得到更好的精确度,YOLO-V2
主要做从这几方面做了优化:高精度分类器,Anchor
卷积,维度聚类,直接位置预测,细粒度特征,多尺度训练。我们一个一个看:
在YOLO-V1
中,网络训练的分辨率是224x224
,检测的时候将分辨率提升到448x448
。而YOLO-V2
直接修改了预训练分类网络的分辨率为448x448
,在ImageNet
数据集上训练10
个周期(10 epochs
)。这个过程让网络有足够的时间去适应高分辨率的输入,然后再fine tune
检测网络,mAP
获得了4%
的提升。
在YOLO-V1
中使用全连接层进行bounding box
预测,这会丢失较多的空间信息,导致定位不准。YOLO-V2
借鉴了Faster RCNN
中anchor
的思想,我们知道Faster RCNN
中的anchor
就是在卷积特征图上进行滑窗采样,每个中心预测9
个不同大小和比例的anchor
。
总的来说YOLO-V2
移除了全连接层(以获得更多的空间信息)使用anchor boxes
去预测bounding boxes
。并且YOLO-V2
中的anchor box
可以同时预测类别和坐标。具体做法如下:
YOLO-V1
比起来,去掉最后的池化层,确保输出的卷积特征图有更高的分辨率。416x416
,目的是让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell
。因为大物体通常占据了图像的中间位置,可以只用一个中心的cell
来预测这些物体的位置,否则就要用中间的4
个cell
来进行预测,这个技巧可稍稍提升效率。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
。具体每个网格对应的输出维度如下图:
YOLOV1和YOLOV2网格输出维度对比
我们知道YOLO-V1
输出7x7x30
的检测结果,如上图,其中每个网格输出的30
个数据包括两个候选框的位置,有无包含物体的置信度,以及网格中包含物体类别的20
个概率值。
YOLO-V2
对此做了些改进,将物体类别的预测任务交给了候选框,而不再是网格担任了,那么假如是9
个候选框,那么就会有9x25=225
个数据的输出维度,其中25
为每个候选框的位置,有无物体的置信度以及20
个物体类别的概率值。这样的话,最后网络输出的检测结果就应该是13x13x225
,但是上面网络框架中是125
,是怎么回事儿呢?我们接着看。
在使用anchor
时,Faster RCNN
中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
大小无关),因此采用了如下距离度量方式:
假设有两个框,一个是3x5
,一个框是5x5
,那么欧式距离计算为:
IoU
的计算如下,为了统计宽高聚类,这里默认中心点是重叠的:
这里,为了得到较好的聚类个数,算法里做了组测试,如下图,随着k
的增大IoU
也在增大,但是复杂度也在增加。
k-means聚类个数的选择
所以平衡复杂度和IoU
之后,最终得到k
值为5
.可以从右边的聚类结果上看到5
个聚类中心的宽高与手动精选的boxes
是完全不同的,扁长的框较少,瘦高的框较多(黑丝框对应VOC2007
数据集,紫色框对应COCO
数据集)。 这样就能明白为什么上面网络框架中的输出为什么是13x13x125
了,因为通过聚类选用了5
个anchor
。
上面学习,我们知道这里用到了类似Faster RCNN
中的anchor
,但是使用anchor boxes
有一个问题,就是会使得模型不稳定,尤其是早期迭代的时候。大部分的不稳定现象出现在预测box
的中心坐标时,所以YOLO-V2
没有用Faster RCNN
的预测方式。
YOLO-V2
位置预测
,
就是预测边界框中心点相对于对应cell
左上角位置的相对偏移值,为了将边界框中心点约束在当前cell
中,使用了sigmoid
函数处理偏移值,这样预测的偏移值就在(0,1)
范围内了(每个cell
的尺度看作1
)。
我们具体来看以下这个预测框是怎么产生的?
在网格特征图(13x13
)的每个cell
上预测5
个anchor
,每一个anchor
预测5
个值:
,
,
,
,
。如果这个cell
距离图像左上角的边距为(
,
),cell
对应的先验框(anchor
)的长和宽分别为(
,
),那么网格预测框为下图蓝框。如下图:
候选框如何生成?
总的来说,虚线框为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
运行更快,在速度和精度上达到了平衡。
对于YOLO-V2
的性能,直接看下YOLOV2
和其他常见的框架在pascal voc2007
数据集上测试结果性能比对表,如下表:
pascal voc2007数据集上测试结果
首先可以看到随着训练尺寸的尺寸变大,YOLOv2
算法的mAP
是逐渐上升的,FPS
相应的逐渐下降。在554x554
尺寸上的训练mAP
达到78.6
,从下面的性能分布图图中也可以看到YOLOV2
算法的性能相对来说是挺不错的。
pascal voc2007上性能分布图
其中YOLOv2
的五个蓝色圈圈代表上面表中的五个不同尺寸的结果。
好了,至此,我们从Darknet-19
结构,YOLO-v2
结构,高精度分类器,Anchor
卷积,维度聚类,直接位置预测,细粒度特征,多尺度训练以及性能方面一起学习了YOLO-V2
相比与YOLO-V1
做了哪些改进。下一期,我们将一起学习YOLO-V3
的算法框架。