YOLO9000: Better, Faster, Stronger

YOLO9000 论文

YOLO9000在CVPR2017目标检测领域大放异彩。首先这篇文章没有Related Work给我的第一感觉就是干货满满,这样的好文章当然不容错过。本篇博客,简单的介绍了一下YOLO9000到底采用了哪些技术。

Better

Batch Normalization

在Google的这篇文章Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift,详细讲述了BN的作用。
简单总结一下:
1. BN能够解决数据偏移:以激活函数ReLU为例 max(0,x) ,每次经过一个ReLU激活函数,小于0的数据就会置零,大于0的数据就会得到保留,这样从卷积或者全连接层输出的分布就会往数据为正的方向偏移,加入BN就能使数据重新变为[0,1]的正太分布 。
2. 反向传播的时候会存在梯度消失或者梯度爆炸,例如 0.75=0.168,1.29=5.15 ,网络越深,这种现象越严重。使用BN能使梯度稳定,更容易收敛。
3. 在BN中,每一个数据都会受到当前Batch内数据的影响。同一个样本,在不同的Batch内,由于BN存在,输出的概率都不一定相同,这样可以认为是提高了模型的泛化能力,这样也就降低了过拟合的可能性。

在YOLOv2中,作者在每一层卷积层之后都加入BN层,然后去掉了Dropout,综合起来mAP提高了2%。

High Resolution Classifier

之前的方法大多都是在ImageNet的学习的模型fine tune得到,这些模型有一个共同的特点,输出图像小于256*256。Yolo最早的版本直接拿输入为224*224的分类网络fine tune变为输入448*448的检测网络。如此作,fine tune的过程微调参数,就要完成两个任务:分类+检测。很Naive的想法,我们不可能一口气吃成一个大胖子,不如一点点的来。首先在448*448分辨率的网络在imagenet分类任务迭代10epoch。然后在检测任务进行fine tune。采取这个措施,提高了4%的mAP。

Convolutional With Anchor Boxes

YOLOv1版本最后直接使用了全连接层,用4096维,fc变为1470,然后reshape成7*7*30, 产生98个预测框。
1. 首先全连接这块,4096*7*7*30 参数过多,不容易学习。
2. 第二这里只有98个预测框,不能更好的预测。这里借用清华大学博士孔涛的话:目标的检测和定位中一个很困难的问题是,如何从数以万计的候选窗口中挑选包含目标物的物体。只有候选窗口足够多,才能保证模型的 Recall。没有Anchor boxes, 69.5%mAP,81% Recall, 添加Anchor Boxes, 69.2% mAP, 88%Recall。 从实验结果也可以看出,使用anchor boxes以后,预测了1000+的框,的确提高了召回率。
3. 全连接+直接reshape的过程,太暴力,丢失空间信息。
YOLOv2借助了Faster-RCNN的RPN网络,在卷积的feature map上预测k=9中不同尺度的框。


这里写图片描述

这样做,是因为前面的卷积和pooling操作,一定程度上保留了空间信息,并且feature map的特征点能和原图一一对应起来。借用了RPN网络的思想,作者不是像YOLOv1一样直接预测坐标位置,而是预测anchor boxes偏移量和置信度。如图所示,用来预测的是卷积层,参数量更少,所以更容易学习。

综合起来,作者主要采用了以下的措施:
1. 去掉一个Pooling layer提高了分辨率
2. 缩小图片从448到416,因为作者采用的darknet到预测这层的时候,尺度缩小了32倍。存在这种先验,很多图片大目标占据中间位置,如果是448/32=14的话,需要用中间4个feature 点进行预测,416/32 = 13,就只会有一个点参与预测。
3. 预测类别从空间位置中分开,由anchor box同时预测类别和坐标。YOLOv1每一个cell预测类别,对应2个bounding box预测坐标和置信度。 YOLOv2中,一个Anchor Box直接预测类别,4个坐标位置,和置信度。下面这张从知乎拿来的图更形象。


这里写图片描述

Dimension Clusters

这里又回到了Faster-RCNN里面了,为啥一个feature map的点预测9个位置框?为啥长宽比例是1:1, 1:2, 2:1? 为啥预测的是128, 256, 512? 你问我也不知道,作者这样说的,实验试出来的呗!虽然网络可能学习到一个不错的结果,但是预测多了,肯定会慢,并且初始值不好,收敛慢也是肯定的。为何不用一下先验知识呢?这个角度很刁钻!

使用K-means进行聚类,在速度和mAP之间取一个trade-off。这就是 5 的来源!
首先定义距离度量如下:

d(box,center)=1IOU(box,centroid)

初始化聚类数目,和聚类中心,进行迭代,最后得到预测框数目和预测框的尺度。


这里写图片描述

Direct Location Prediction

使用anchor boxes之后会存在模型不稳定的问题,特别是迭代早期。作者发现,这种不稳定来源于预测 (x,y) 的位置。在这个地方论文公式写错了,应该是+号,原文中写的是-号。在Faster-RCNN中:

tx=(xxa)/wa,ty=(yya)/ha

tw=log(w/wa),th=log(h/ha)

tx=(xxa)/wa,ty=(yya)/ha

tw=log(ww),hh=log(h/ha)

上述公式中, x,xa,x 分别代表预测x坐标,anchor预设的固定值, ground truth的坐标。 y,w,h 分别代表y坐标,宽度,高度,同理。从前两个公式可以推导出下式,也就是文中有误的地方:

x=(txwa)+xa

y=(tyha)+ya

首先 tx,ty 代表相对于预设固定值的偏移量。举个栗子, tx=1 就会把box向右移动一个预定 wa 的距离, tx=1 就会把box向左移动一个预定 wa 的距离。但是这里 tx 是没有大小限制的,也就是说 tx 可以让预设的框移动到图像的任一位置。这样就会出现一个问题,前面的卷积层和pooling层都会保留空间信息的,使用Anchor box也只是会预测原图一部分区域,但是 tx 的出现,Anchor box 却能预测图像任意地方的物体了,忽然又打破了原有的空间信息,这也是为什么训练不稳定的原因。

作者改进方法, 预测相对Grid Cell的坐标位置,并通过Logistic函数来约束 tx 。feature map的每一个 cell预测5个bounding box, 每个bounding box预测5个值, tx,ty,tw,th,t0 . 预设的数值 cx,cy 分别代表距离左上角的距离,宽高 pw,ph

采用如下的计算公式:

bx=σ(tx)+cx

by=σ(ty)+cy

bw=pwetw

bh=pheth

Pr(object)IOU(b,object)=σ(to)


这里写图片描述

采取dimension clusters 和 directly location prediction 提高了5%mAP。

Fine-Grained Features

YOLOv2版使用13*13的卷积层进行预测,这种预测对大目标比较有利,小目标的效果就会差点。这也是目标检测的通病,小目标本来包含的信息就少,提取特征也少。近年来的趋势就是使用多尺度的特征,使用多层的feature map进行预测。作者直接添加了一个passthrough layer 得到26*26的细粒度的特征。然后将26*26*512的feature map的resize 变为 13*13* 2048。和原先13*13*1024的feature map拼接起来,这样就得到了多尺度的信息。这里mAP提高了1%。这里不太好理解,我们可以从这个图分析:


这里写图片描述

Multi-Scale Training

YOLOv1网络使用固定的448*448的图片作为输入。网络中只有conv layer和pooling layer,对输入图片没什么要求。为了让YOLOv2对不同尺度的图片鲁棒性,训练的时候也考虑到多尺度训练。

作者使用{320, 352, …, 608}的不同尺度的图片进行训练,每经过10个epoch以后,都会选择新的尺寸图片训练,这样可以是网络对不同尺度的图片都可以预测的较好!


这里写图片描述

从这张图上也可以看出不同尺寸的输入,passthrough的情况。

Faster

还有一个重要的目的就是要快,实现实时性检测。大多数目标检测的框架都是基于VGG-16/Google-Net等,这些网络的速度严重制约着检测的速度。基于此,作者提出了Darknet-19:

  • 使用3*3 的filter, 然后使用两倍的卷积核数目。拿第二个黑框的conv4为例,使用3*3的卷积核,输入为152*152*64,然后卷积核就是64*2,然后就变为了152*152*128。
  • 使用1*1 的filter,进行降维。第二个黑图conv5就是例子。
  • 使用batch normalization.

Darknet-19在ImageNet取得了72.9%的top-1准确率, 91.2%的top-5的精确率。

网络结构如下所示:


这里写图片描述

Training for classification

在Imagenet迭代160epoch,起始learning rate 0.1, polynomial rate decay 4,weight decay 0.0005, moment 0.9。训练过程中使用了数据增益,旋转,裁剪,平移等等。训练完毕以后,再用448*448的分辨率的fine tune,训练10个epoch, learning rate 0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

Training for detection

分类网络训练好以后,最后一个卷积层去掉,添加3层 3*3 1024个filter的卷积层,然后再加一个1*1的卷积层,filter数目是目标检测的输出,VOC为例是125( (5+ 20) * 5 , 5代表x,y,w,h,c, 20代表20类,第二个5代表5个boxes) 。passthrough 3*3*512。Darknet里面的yolo-voc.cfg这块,passthrough我觉得很论文里不太一样。这边希望读者能自己看看代码。


这里写图片描述

Stronger

这块我也看了网上很多人的博客,翻译paper的不少,这块省略的也不少。总之没看明白,后来我就反反复复读了论文这块地方,又和师兄讨论了一下,我们的理解如下,希望能对读者有借鉴,如果我们理解有误,欢迎批评指正。

这部分主要内容就是使用了ImageNet的分类数据和COCO检测数据集训练了YOLO9000。训练阶段检测数据和分类数据混合,如果输入是检测数据,则反向传播检测+分类的损失,如果只看到分类图片,只反向传播分类损失。但是COCO的数据集是分类是粗糙的,比如说就是猫狗之类的,但是Imagenet是细分类,就有了泰迪/秋田之类的。传统的分类结构最后一层时候softmax,softmax的前提是label之间是互斥的。这里明显不满足这个条件。

hierachical classification

作者借用了WordNet。Wordnet是有向图,作者需要把这个图改为树结构。
创建树的步骤如下:

  • 遍历Imagenet的所有视觉名词
  • 对每一个名词,在Wordnet找到从它所在位置到根节点的路径,加入到层次树结构中。
  • 对于有多条路径到根节点的情况,选用经过边数较少的路径。

最终形成一颗WordTree。用WordTree执行分类时,预测每一个节点的条件概率。


这里写图片描述

imagenet 1000类根据wordnet,会得到1369个类别,这里面包括了imagenet的细分类的父类。网络最后的一层输出会有一个1396的vector,但是计算的时候使用多个softmax分类器。每一个分类器计算一个节点下义词的softmax。

举一个例子,假设动物只有猫和狗,狗有泰迪,萨摩耶,吉娃娃,哈士奇,猫有杯子猫,波斯猫。其中这6种动物就是imagenet-fake数据集, 下面有请这些闪亮登场:


这里写图片描述

我们根据WordNet 建立了一个wordtree,然后就长成了这个样子:


这里写图片描述

每一个label为泰迪的,label也应该为狗,动物。 好了,我们现在最后一层输出一个长度为8的vector。分别代表狗,猫,萨摩耶,二哈,吉娃娃,泰迪,杯子猫,波斯猫吧。动物的概率默认为1。首先动物的节点的下义词为猫,狗,先建立一个softmax分类器,狗节点的下一词是萨摩耶,二哈,吉娃娃,泰迪,然后在这个节点建立一个softmax, 同理猫。来一张泰迪图片,首先会判断是不是狗,得到狗的概率,然后根据条件概率,最后得到泰迪的概率。
论文这张图也就是上述意思:


这里写图片描述

回到论文中,添加了369类,训练的darknet结果top-1还是71.9%, top-5 90.4%。这里只是分类,检查还需要联合训练。

Joint classification and detection

这块主要讲了怎么训练以及训练结果,简单总结一下:

  • ImageNet 和COCO 4:1
  • Anchor boxes = 3
  • 检测图片正常传播,分类图片只传播分类损失。Object 预测box和ground truth重叠度至少为0.31。
  • 最后就是实验结果分析。

首先根据COCO和ImageNet建立一个WordTree,总共9418类。


这里写图片描述

训练的过程中,如果检测数据反传所有loss,如果是分类数据就反传分类的loss了。这边的再详细的,就要看代码了,以后有空再更新这块。

Conclusion

本篇论文真是干货满满,比如多尺度训练,联合训练都值得在其他任务上拓展。我在这里抛砖引玉了,有错误的地方希望大家指正,最后调戏一下YOLOv2。


这里写图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值