(四)目标检测yolov2
关于网络:
YOLOv2用的是Darknet-19网络用于特征提取的。作者在论文中这样说到:其实很多检测框架都是依赖于VGG-16网络来提取特征的,VGG-16是一个强大的,准确率高的分类网络,但是它很复杂。看没看到,作者用了一个“但是”就把这个网络否定了,然后自己牛逼的提出了一个比它优秀的网络。作者继续补刀:仅一张分辨率为224*224的图片在单次传递的时候,VGG-16的卷积层就需要30.69 billion次浮点运算操作。看一张网络运算浮点操作的图就知道了,反正你知道VGG-16运算量很大就行了。
我解释一下,目标检测网络在训练之前都要用单独的网络来与提取特征,进行预训练,然后特征提取之后再在后面加上自己的创造的目标检测网络(一系列卷积层等),完成目标检测。之前的YOLOv1用的特征提取网络是GoogLeNed的改进版本,图上可以看到,计算量是8.52G-ops,top-5准确率是88.0%,VGG-16网络top-5准确率是90.0%(30.69G-ops),而,注意啦!Darknet-19网络计算量是5.58G-ops,top-5准确率高达91.2%。看一下Darknet-19的结构:
再详细看一下在Darknet-19的基础上的YOLOv2网络结构:
YOLO2网络中第23层上面是Darknet-19网络,后面是添加的检测网络。
YOLO 2采用神经网络结构,有32层。结构比较常规,包含一些卷积和最大池化,其中有一些1*1卷积,采用GoogLeNet一些微观的结构。其中要留意的是,第25层和28层有一个route。例如第28层的route是27和24,即把27层和24层合并到一起输出到下一层,route层的作用是进行层的合并。reorg是passthrough层。30层输出的大小是13*13,是指把图片通过卷积或池化,最后缩小到一个13*13大小的格。每一个格子的output参数是125。所以最后输出的参数一共是13*13*125
改进
k-means clusters
YOLOv2使用了anchor,但并非手动选取,而是通过聚类的方式学习得到。在训练集上使用k-means算法,距离衡量的方式为:
目的使得大框小框的损失同等衡量。
聚类的结果发现,聚类中心的目标框和以前手动选取的不大一样,更多的是较高、较窄的目标框。聚类结果也有了更好的性能。
框回归
通过使用sigmid函数,将偏移量的范围限制到 (0,1),使得预测框的中心坐标总位于格子内部,减少了模型的不稳定性。
另外,YOLOv2的分类置信度不再共享,每个anchor单独预测。即每一个anchor得到C+5的预测值。
passthrough layer
passthrough层在预测时使用,将网络中间层的特征图输出(具体见下文),将下采样时同一位置的像素分解成4个子图,concat合并起来。变换后通道数变为4倍,下采样2倍。如从512×26×26变为2048×13×13。
passthrough层的使用,融合了较高分辨率下的特征信息。
多尺度训练
由于网络中只包含卷积层和池化层,YOLOv2为了增加网络的鲁棒性,在训练过程中动态调整网络的输入大小,同时相应地调整网络的结构以满足输入。因为网络下采样32倍,要求输入尺寸包含因数32。
网络结构
YOLOv2中使用了一种新的基础网络结构,基于Googlenet,名为Darknet-19。拥有19个卷积层和5个Max Pooling层,网络中使用了Batch Normalization来加快收敛。
下图为基础网络的结构,output部分是输入为224×224的输出情况,网络总体下采样32倍。
Darknet-19
最后的conv层、avgpool层和softmax层是用于分类训练时的输出结构。当进行预测时,去掉这三层,只保留箭头间的部分进行特征提取。
用网络进行目标检测时,再添加一些conv层和一个passthrough层。具体组织如下:
训练过程
主要的训练过程为:
(1)先使用ImageNet数据集对Darknet-19进行分类训练,输入图片大小为224×224,包含标准的数据扩充方式。
(2)将输入图片大小调整为448×448,进行fine-tune。
(3)去掉分类的输出层,添加上文提到的目标检测输出层,进行目标检查的训练。
YOLOv2在上述训练的基础上,又进行了一个联合训练,额外使用只包含标签信息的数据集来进行分类训练,扩大网络可以预测的物体种类数,使其变得更加强大,即YOLO9000。