guodong's blog

master@zhejiang university
   

目标检测模型 YOLOv2

1、简介

SSD在实时检测中有着比YOLOv1更好的精确率。和基于区域检测的检测器相比,YOLO有着更高的坐标误差和更低的召回率。YOLOv2此时诞生了,有着更高的精确度和更快的速度。

2、提高精确度的tips

2.1 更高分辨率的分类器

YOLO训练包括两步,首先类似VGG16Lakisha训练网络,然后我们用卷积层替代最后的全连接层,成为一个端到端的网络,重新训练它。YOLO使用224*224图片来训练,随后用448*448大小的图片来训练目标检测。YOLOV2开始是使用224*224来训练目标检测,然后再使用448*448使用较少的迭代周期对模型进行调优。这样会使检测器训练更简单,同时提高mAP4%。

2.2 batch normalization

在卷积层中添加bn层,去掉dropout层,是的mAP提高2%。

2.3 加入anchor boxes

早期的yolo对位置的检测有很大的不稳定性,yolo对边界框的预测进行任意的预测,这些预测可能对一些目标效果好,但对其他差,导致梯度变化很大。早期的训练中,预测都在相互fight目标究竟是什么形状。

在现实生活中,边界框不是任意的,比如车辆,它们具有相似的形状,行人也是,纵横比大约0.41等等。

所以引入anchor后,可以使得预测部分更准确,也会使得网络更稳定。比如我们可以创造5个anchor boxes,尺寸如下:

我们预测每个anchor boxes 的偏移量,而不是预测5个任意大小的边界框。如果我们获取到偏移量的值,那我们可以更精确的获得目标的shape,初始的训练也会更加稳定。

3、网络结构

和yolov1相比,改变的有:

  1. 去掉用于预测边界框的全连接层。
  2. 对class预测,yolo v1关注单元格,yolov2关注边界框。每个预测包含边界框的4个参数,1个置信度,和20个类别概率。
  3. 为了生成7*7*125大小的预测,yolov2用三个3*3的卷积层来代替最后一层,每个卷积层输出1024的通道,然后用最终的1*1卷积层,将7*7*1024的输出转变成7*7*125.
  4. 改变图片的尺寸,从448*448改变成416*416。这样最后生成的是奇数维度的单元格。通常图片的中央被大目标覆盖。当单元格是奇数时,这样能够更容易确定目标属于哪个单元格。
  5. 移除一个池化曾,使得网络空间输出为13*13

4、维度聚类

在许多问题域中,边界框具有强烈的模式。 例如,在自动驾驶中,2个最常见的边界框将是不同距离的汽车和行人。 为了识别对训练数据具有最佳覆盖范围的前K个边界框,我们对训练数据运行K均值聚类以定位前K个聚类的质心。

因为我们用了边界框而不是点,那我们就不能用常规的空间距离来计算,相反,我们应该使用IOU

上面左图,绘制了使用不同的簇(或anchor)时的 anchors 和 ground truth之间的平均的IOU。当anchor增加时,精确度提高很快。为了最好的效果,yolov2设置了5个簇。在右图上是5个簇之间的形状。紫蓝矩形框代表着coco数据集,黑色矩形框代表VOC2007数据集。在这两种情况下,我们都获得了瘦高的anchor,这表明现实生活里的boundary boxes 不是任意的。

5、直接预测location

yolov2预测边界框的偏移,然而如果它不受约束的花,我门的预测又将会是随机的。yolov2预测5个参数tx,ty,tw,th和t0,同时使用sigmoid函数来约束范围。

其可视化图如下

使用聚类方法预测的模型,其mAP提高5%

6、Fine-Grained Features

卷积层逐渐减少空间维度。因为空间分辨率降低,所以很难检测到小目标。其他目标检测模型比如SSD是从不同的层的特征图来定位目标。所以每个层都专攻属于自己的尺度。它把28*28*512层reshape成14*14*2048。接着和原始的14*14*1024层相concatenate,然后就可以使用新的14*14*3027层来预测。

7、多尺度训练

移除全连接层后,YOLO可以接收不同尺度的照片。如果宽和高是double的,那可以输出4*output的单元格,做出4*predication。因为yolo采取32倍下采样,所以在训练中,YOLO接收320*320,352*352。。。608*608的照片。对每10个batches,yolov2随机选择另一张尺寸的图片来训练模型。这样做可以强迫使得网络对不同输入尺寸维度都能预测很好。同时,我们也可以使用较低的分辨率图片,这样就牺牲了准确度的代价,但提升了速度。

8、精确度

9、speeder

在YOLO v1中,作者采用的训练网络是基于GooleNet,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。

9.1 darknet-19

这个网络包含19个卷积层和5个max pooling层,而在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLO v1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测

10、训练

10.1 for classification

训练处理的小trick。这里的training for classification都是在ImageNet上进行预训练,主要分两步:1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224*224,初始学习率为0.1。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。2、再fine-tuning 网络,这时候采用448*448的输入,参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001,并训练10个epoch。结果表明fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,而如果按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。因此可以看出第1,2两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

10.2 for detection

在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。首先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1*1的卷积层,1*1卷积的filter个数根据需要检测的类来定。比如对于VOC数据,由于每个grid cell我们需要预测5个box,每个box有5个坐标值和20个类别值,所以每个grid cell有125个filter(与YOLOv1不同,在YOLOv1中每个grid cell有30个filter,还记得那个7*7*30的矩阵吗,而且在YOLOv1中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个grid cell的两个box的20个类别值是一样的)。另外作者还提到将最后一个3*3*512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

 




上一篇:
下一篇:

guodong

没有评论


你先离开吧:)



发表评论

电子邮件地址不会被公开。 必填项已用*标注