您的位置:首页 > 移动开发 > Objective-C

YOLO9000( YOLO v2 ), a state of the art, real time object detection system

2017-01-09 00:50 375 查看
Object Detection近两年发展十分迅速,从RCNN、Fast RCNN到towards real time 的Faster RCNN,然后是real time 的YOLO、SSD,一代更比一代快(fps),一代更比一代强(mAP),faster and stronger,然而今天要介绍的是真正的Better、Faster 、stronger的 a state of the art系统----YOLO9000(and v2)。

YOLO v1 一个实时的目标检测系统,可以达到45fps,如此高的处理速度,得益于其简化的框架,相比较Faster Rcnn,YOLO v1首先去掉了RPN网络,输出直接回归出bounding box,其次通过自身简化的卷积层(比VGG16快)加快检测时间,两种方法结合,在448X448的图像上直接到达了实时监测的效果。网络结构如下图所示。



YOLO v1通过上述方法提高了速度,但是63.4的mAP并没有Faster Rcnn高,正是因为其去掉的RPN网络,抛弃了anchor boxes机制,另外YOLO的卷积网络(YOLO customized architecture)也不如VGG效果好。SSD弥补了YOLO的不足,同时结合了YOLO v1的end to end思想和Faster Rcnn的anchor boxes机制,并且依然采用了VGG16网络,兼顾了速度和正确率,只在300X300的图像输入下就达到了73.1mAP
58fps。速度的提高一方面在SSD的anchor boxes不是由网络单独生成,而是直接location在feature map上,另一方面SSD裁掉了耗时的计算,比如YOLO的4096节点的fc layer,替代以1X1的conv layer。另外300X300的输入也减少了detection时间,因为它结合了多个feature
map,所以SSD能在小尺度输入下达到如此高的检测精度。SSD的网络结构如下图所示。



OK,今天我们的主角要登场了------YOLO9000(and v2)。YOLO v2做到了67fps 76.8mAP,在40fps下达到了78.6mAP,效果较SSD有大幅提高。不止这些,YOLO9000通过结合不同数据集(ImageNet and COCO)的训练方法,做到了可以同时识别超过9000个类别的的目标检测,更重要的是,it
still runs in real time。

YOLO v2有满满的干货,既有像Batch Normalization这样的通用trick,又有Dimension Cluster这样的新鲜trick。YOLO9000更是建立的WordTree机制,得以将不同的数据集结合起来用,也是一大创新(虽然这目前来看对我还没有什么卵用)。现在的目标检测系统往往会趋于复杂(larger
and deeper),但是YOLO v2却在简化模型,pool a variety of idea,同样提高了速度和精度。novel ideas 如下表所列,几乎每一项都有一到两个点的提升。



1.
Better:

Batch
Normalization Batch Normalization的重要性不言而喻,加快收敛,防止过拟合,可以部分代替Dropout简化模型,为YOLO带来了2%的精度提升。

High
Resolution Classifier YOLO v2 虽然和v1一样也采用了448X448的输入,但是网络的训练方法不一样,v2首先在ImageNet下做10 epochs的fine tune,然后在fine tune它的resulting network,这样让网络有时间调整他的滤波器(filters),好让其能更好的运行在高分辨率上。High
Resolution Classifier 让YOLO v2有了4%的提高,这一项是非常重要的提升。

Convolutional With Anchor Boxes YOLO v1和Fast Rcnn对bounding
box的预测方法不同,YOLO v1采用了全连接层直接预测坐标系的位置,而Fast Rcnn则采用预测anchor boxes的offset。YOLO v2也采用了anchor boxes机制,去掉了全连接层,让训练变得简单。采用了anchor boxes的YOLO v2必须在输入上做出变化,由原来的448X448的输入变为416X416,这样才能得到奇数尺度的feature map,让location变为single center,否则location出两个中心是万万不能地。这里值得注意的是,采用anchor
boxes后,精度反而稍有下降,但是,但是recall却大幅提升,81%到88%,这意味着模型进步的空间还很多,可以通过后面的trick来提升。

Dimension Clusters 采用了anchor boxes 后,就需要决定到底用什么样尺度的box(box
dimensions),手动选取的方法弱爆了(并不针对Faster rcnn,是所有),拍脑袋在人工智能时代已经不管用了。YOLO v2在VOC and COCO数据集上,用k-means的算法自动cluster 出 box dimensions,如下图所示,虽然dimensions越多准确率越高,但是考虑模型复杂度,选择 5个dimension的boxes最合适,通过右图还可以看出,VOC和COCO 的box dimension的不同, 非常直观和准确的做法。



Direct location prediction 采用Fast Rcnn的anchor boxes机制,又带来了另一个问题,在预测boxes的offset时,带来的训练的不稳定,要花大量时间才能让其收敛,原因出在采用offset计算坐标,让预测出的boxes非常随意没有约束,可以落在图像的任何地方。所以YOLO
v2采用了预测相对grid cell坐标,这让预测值限制在[0,1],然后采用logistic activation激活,如下图所示。这样的限制非常容易学习,结合上dimension clusters的anchor boxes,又提高了5% mAP。



Fine-Grained Features YOLO v2的feature maps 为13X13,这对识别大物体来说足够了,小物体的是被则可以通过Fine-Grained
Features。Fast Rcnn和SSD都是直接使用不同尺寸的feature maps做最后的预测,YOLO v2采用了不同的做法,它是将26X26的feature maps直接添加在13X13的后面。这样就是26X26X512的feature maps 直接分开,变为13X13X2048,采用这种方式的转变又将正确率提高了1%。

Multi-Scale Training 最初YOLO的输入时448X448,增加anchor boxes后输入变为416X416。但是YOLO只有卷积层和池化层,可以做多尺度的训练,为了让模型更稳定,所以YOLOv2做了多尺度的训练。训练时,每个10
batches 就随机的从{}320; 352; :::; 608}中选择一个尺寸。这种方法让YOLO v2能适应更多尺寸的输入,同时满足了速度的需求。Multi-Scale Training 让 YOLO v2在速度和准确性做出平衡的选择,228X228输入的YOLO可以达到90fps,可以应用更小的GPU(例如我们在做的嵌入式)做实时监测和高帧率的视频检测。下标列出了YOLO
v2的准确度和速度对比,可以看出YOLO的速度优势。



2. Faster

YOLO v2不仅要追求准确率,更重要的是速度,机器人控制、自动驾驶技术,就必须依赖低延时的系统。虽然VGG16是一个稳定且准确率高的模型,但是这个模型有点过于复杂,在224X224的输入上,VGG16需要30.96billion次的浮点计算,而基于GoogLeNet构架的YOLO模型,只需要8.52billion次浮点计算,速度快了许多倍(但是top5精度只降了一点,88.0%
vs 90.0%),

Darknet-19 YOLO v2的新模型继承了模型设计的一贯思想:用像VGG16一样的3X3 filters;池化后增加一倍feature
maps的channals;利用global average pooling做最后预测;在3X3 卷积之间用 1X1 filters来压缩feature maps;利用Batch Normalization加速收敛,规则化模型。这样最后设计出来的模型叫 Darknet-19(暗黑网络,霸气侧漏的名字主要是用了霸气侧漏的库,Darknet),侧漏网络,啊不对,暗黑网络主要有19个卷积层5个池化层,处理一副图片只需要5.58 billion次计算。

Training for classification YOLO v2 在ImageNet上对1000个类别训练160
epoches,用的参数如文献里所述,这里就不BB了,训练增强的方法也是常用的,暂且不表。训练同样是用224X224初始化,然后用用448X448 fine tune。

Training for detection 做detection时,因为加了anchor boxes ,所以修改了网络的输出,去掉了最后一个卷积层,增加了3X3X1024的卷积层,再加上原来的passthrough
layers,最后输出最后预测的boxes。训练策略同fast rcnn和ssd。

3.
stronger

stronger的YOLO9000登场了,为什么stronger呢,不光是因为它可以识别9000个类别,重要的是它建立的训练机制能够混合利用多个数据集。这种机制能让YOLO在训练的时候,碰到classification数据就只反向传播类别误差,碰到detection数据就同时传播类别和回归误差。然而更重要的是,它建立了WorTree,把所有的类别像Tree一样串起来------Hierarchical
classification机制,这个机制太机智了。

Hierarchical classification ImageNet的类别标签是从WordNet上扒下来的,WordNet的结构是一个有向图结构,例如狗同属哺乳动物和家畜,这种结构现在类别标签上不适用。因此在建立WordTree的时候,会把有向图简化,先把仅有一个path的词加入到WordTree,然后在一点点补充,当碰到两个Path
to root的时候,选择增加该词后路径短的那个。

WordTree的最终结果其实是一个条件概率模型,所以如果要计算一个节点的概率,只需要把该路径上所有的节点结果相乘:



因为ImageNet有1000个类别,那么给ImageNet建立WordTree,增加路径节点,最后扩展类别到1369个类别,这样在训练阶段,就需要给一副图片附几个类别,例如哈士奇要同时附给狗和动物。同大多数ImageNet模型不同的是,在分类函数上,YOLO9000对WordTree里的每一个子类单独用一个softmax,不同点如下图所示:



使用WordTree来训练网络带来了一些好处,例如在一些不确定的物体上,如果网络不确定看到的是一只金毛还是哈士奇,网络仍然会告诉你这个东西肯定是个狗。这个方法也适用于detection,在detection时当然就不能假装每一幅图都有一个物体了,detector必须得明确算出物体的概率值,包括bounding
box和条件概率。预测的时候是吧tree倒过来看的,先输出后面节点高于阈值的物体。

Dataset combination with WordTree 建立WordTree就是为了同时训练多个数据集,这里主要用了ImageNet和COCO两个数据集来训练,下图展示了训练这两个数据集的例子,WordTree的多样性很强,也可以用来训练其他多个数据集。



Joint classification and detection YOLO9000的9000个类别是选取了ImageNet的前9000个类别,然后根据WordTree扩展成了9418个类别,因为ImageNet比COCO大的多,所以训练的时候对COCO多采样一些,保持比例在4:1。YOLO9000同样采用了YOLOv2的构架,但是anchors只用3个,减少输出的数量。

在训练时,如果遇到detection image时,正常做反向传播。如果遇到classification image时,只传播分类误差,例如遇到狗的标签,就只反向传播狗的参数,不需要反向传播给哈士奇和金毛,因为也没得可传的信息了。传播分类误差时,就只利用得分最高的哪个bounding
box,并且只假定和ground truth 有0.3的IOU。

经过训练后的YOLO9000,评估结果为:19.7mAP,在未学习过的156个分类数据上进行测试,mAP达到16.0,YOLO9000的mAP比DPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。

虽然YOLO9000对动物的识别性能很好,但是对墨镜或者泳裤这种衣着类别识别率很低,这跟数据集有关系,因为COCO几乎没有衣服类标定的bounding box。

4. 总结

YOLO v2 和 YOLO9000都是实时的检测系统,YOLO v2做到了state of the art,并且可以速度和准确率之间做权衡。YOLO9000能做到对9000个类别的实时检测,还通过建立WordTree实现了对多数据集的训练,这是在多数据集训练领域的一大步。

思考:

1. 通过简化模型,可以大大提高检测速度,未来加上优化的算法和专用芯片,速度会更快,实时性完全不是问题。

2. deep learning通用的 tricks ,尤其是经过大神验证的,确实非常有用,要善于结合各种trick,一点点提高性能。

3. 现有的多数模型可能过于复杂,例如VGG16等,通过Batch Normalization这些技巧,已经慢慢可以提高模型的表达能力,所以适当的简化模型,适当的优化,已经可以很好满足某些场合的应用。

4. 在训练方法上还可以有很多文章可以做,参数的调整对训练结果影响很大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: