【笔记】YOLO9000: Better, Faster, Stronger

来源:互联网 发布:淘宝助理使用 编辑:程序博客网 时间:2024/06/01 07:40

YOLO9000: Better, Faster, Stronger

论文:https://arxiv.org/abs/1612.08242

项目:http://pjreddie.com/darknet/yolo/

Caffe:caffe-yolo9000

源码解析:

https://zhuanlan.zhihu.com/p/25100992

http://blog.csdn.net/qq_14839543/article/details/62425073

Introduction 

通用的目标检测不但要够快够准,还要能够检测多类的目标。但实际情况是,目标检测数据集包含的类别数都太少,远远小于图像分类数据集所包含的类别数(比如ImageNet)。于是,本文提出了一种联合训练的方法,可以同时利用检测数据集和分类数据集来训练目标检测器。具体思路是,利用目标检测数据集来学习目标的准确定位,用分类数据集来增加检测的目标类别数以及检测器的鲁棒性。通过采用上述策略,本文利用COCO目标检测数据集和ImageNet图像分类数据集训练得到了YOLO9000,可以实时地检测超过9000类的目标。

Better

YOLOv1同Fast RCNN相比存在定位不准以及召回率不如Region Proposal方法等问题。因此,V2的主要目标就是在保持分类准确率的同时提高召回率和定位准确度。为了做到又快又好,所以文章在简化的网络上采用了很多策略来提高性能,具体用的技术如下:

float

(1) Batch Normalization

Question : 

1)、训练数据与测试数据的分布不同,网络的泛化能力也大大降低

2)、每批训练数据的分布各不相同(batch 梯度下降),网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。

Solution:

归一化预处理,YOLOv2网络通过在每一个卷积层后添加batch normalization,可以加速收敛同时减少了对其它正则化方法的依赖

Dropout等来防止网络过拟合,使mAP获得了2%的提升。

(2) High Resolution Classifier

Question:

state-of-the-art的检测方法基本上都会用ImageNet预训练过的模型(classifier)来提取特征,这导致分辨率不够高,给检测带来

困难。Eg:YOLO(v1)先以分辨率224*224训练分类网络,检测时需要增加分辨率到448*448,这样做意味着网络要同时学习目标检测

和适应新的输入像素。

Think : 

能不能在预训练的时候就把分辨率提高了,训练的时候只是由分类算法切换为检测算法

Solution:

YOLOv2以448x448的分辨率在ImageNet上预训练了10个epoch(轮),这个过程让网络有足够的时间调整filter去适应高分辨率的输入,然后将该预训练模型在检测数据上finetune为检测网络,最终得到了 4% mAP的提升。

(3) Convolutional With Anchor Boxes

Question:

1)、yolo v1(FCN):只能预测98个框,数量太少,而Fast-RCNN在conv-map上每一个位置都可以预测9个框;

2)、Fast-RCNN(anthor box):yolo v1丢失较多的空间信息定位不准预测坐标不如预测坐标相对偏移量有效,Fast-RCNN预测的是偏移量和置信度。

Think:

可否借鉴Faster R-CNN中的anchor思想: 在卷积特征图上进行滑窗采样,每个中心预测9种不同大小和比例的建议框。由于都是卷积不需要reshape,可以很好的保留的空间信息,最终特征图的每个特征点和原图的每个cell一一对应。而且用预测相对偏移(offset)取代直接预测坐标简化了问题,方便网络学习。


Solution:

1)、去掉最后的池化层确保输出的卷积特征图有更高的分辨率。

2)、缩减网络,让图片输入分辨率为416 * 416而不是448*448,目的是让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。可以只用一个中心的cell来预测这些物体(大物体通常占据了图像的中间位置)的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。

3)、使用卷积层降采样(factor 为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13);4)、把预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标

YOLO v1中每个cell同时回归预测:见博文yolo v1

1、B Bounding box:(paper中B=2)

回归自身的位置(x,y,w,h)+置信的分数(confidence)。 

2、class 分数:C numbers(paper中C=20)


    

YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是让全部放到anchor box中。下面是特征维度示意图:

假设每个cell预测9个建议框,总共预测13 * 13 * 9 = 1521个boxes,yolo仅仅预测7 * 7 * 2 = 98个boxes。具体数据为:

Ancor boxes     recall            mAP     81%69.5%88%69.2%

这样看来,通过在卷积层使用anchor boxes,网络可以预测超过1000个窗口,虽然这导致了准确率降低了0.3mAP,而召回率则提升
了7%。

(4) Dimension Clusters

Question:

Fast-RCNN中使用3种scales和3中aspect ratios(1:1,1:2,2:1)在每个位置产生了9个anchor boxes。anchor boxes的个数和宽高维度往往是手动精选的先验框(hand-picked priors)并不够好。

Think:

能否一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置

Solution:

NO:  K-Means聚类传统的欧式距离度量,那么大的框肯定会产生更大的误差

YES:K-Means聚类中基于IOU的度量方式:对数据集中的ground true box做聚类,找到ground true box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度,IOU距离度量:

Table1:5种boxes的Avg IOU(61.0)就和Faster R-CNN的9种Avg IOU(60.9)相当。 说明K-means方法的生成的boxes更具有代表性,使得检测任务更好学习。
左图: 随着k的增大,IOU也在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IOU之后,最终得到k值为5。
右图:5聚类的中心与手动精选的boxes是完全不同的,扁长的框较少瘦高的框较多(现实中长瘦比较偏多)。
       

(5) Direct Location Prediction

Question:

anchor box回归引起模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x,y)坐标时。

在RPN中预测的是偏移量,这可能导致前期预测得到的框偏移到图像任何位置,对应的中心点(x,y)按如下公式计算:

可见预测tx=1就会把box向右移动anchor box的宽度,预测tx=-1就会把box向左移动相同的距离。

Think:

这个公式没有任何限制,无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点。模型随机初始化之后将需要很长一段时间才能稳定预测敏感的物体偏移。

Solution:

因此作者预测相对于grid cell的坐标位置,同时把ground truth限制在0到1之间(利用logistic激活函数约束网络的预测值来达到此限制)。最终,网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to。如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应的box维度(bounding box prior)的长和宽分别为(pw,ph),那么对应的box为:

约束了位置预测的范围,参数就更容易学习,模型就更稳定。使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

(6) Fine-Grained Features

Question:

大尺度物体的检测在修改后的网络13 * 13的特征图上进行预测已经很好,but小尺度的呢还存在缺陷!

Think:

Faster F-CNN、SSD都在不同层次的特征图上产生区域建议以获得多尺度的适应性,but Yolo v2怎么做的呢?

Solution:

YOLOv2则通过添加一个passthrough layer来取得上一层26x26的特征,并将该特征同最后输出特征相结合,以此来提高对小目标的检测能力。具体的做法是将相邻的特征堆积到不同channel中,从而将26x26x512的feature map变为13x13x2048的feature map。(类似残差网络的identity mapping)

(7) Multi-Scale Training

Question:

原始YOLO网络使用固定的448 * 448的图片作为输入,加入anchor boxes后输入变成416 * 416,由于网络只有卷积和pooling层,因此实际上可以接受任意尺寸的输入,作者也希望YOLOv2对各种尺度的图片都足够鲁棒性

Solution:

不同于固定网络输入图片尺寸的方法,每经过10批训练(10 batches)就会随机选择新的图片尺寸。网络使用的降采样参数

32,于是使用32的倍数{320,352,…,608},最小的尺寸为320 * 320,最大的尺寸为608 * 608。 调整网络到相应维度然后继续

行训练。

当输入图片尺寸比较小的时候检测速度比较快,当输入图片尺寸比较大的时候则精度较高,所以YOLOv2可以在速度和精度上进行权衡。

 Faster

精度提高了,也要考虑提速度了!

(1) DarkNet-19

为了提高性能同时加快速度,设计了一个带有19个卷积核5个max-pooling的网络,命名为Darknet-19。设计该网络时主要参考了VGG使用大量3x3卷积,参考NIN使用1x1卷积和avg-pooling,使用BN等。具体网络如下图:

Darknet-19处理一张照片需要55.8亿次运算,imagenet的top-1准确率为72.9%,top-5准确率为91.2%。

(2) Training for classification

先在Imagenet(1000分类)上以224x224输入训练160 epochs,然后再更改输入为448x448继续finetune 10 epochs。

训练的具体设置:

随机梯度下降法;starting learning rate =0.1;polynomial rate decay =4;weight decay=0.0005 ;momentum =0.9;

data augmentation(random crops, rotations, and hue, saturation, and exposure shifts等)

(3) Training for detection

Question:
如何把分类网络改成检测网络:
Solution:
1)、去掉原分类网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层;
2)、在每一个卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需数量。
3)、添加passthrough layer,从最后3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。
对于VOC数据集,预测5种boxes,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。
训练的具体设置:
先以10^{-3}的初始学习率训练了160次,在第60次和第90次的时候学习率减为原来的十分之一。
(weight decay=0.0005;momentum=0.9;data augmentation: random crops, color shifting, etc)
Stronger 

Question:

检测数据集不够用,如何同时使用检测数据集和分类数据集来训练多目标检测器:将两个数据集混合,训练时如果遇到来自检测集的图片则计算完整的Loss,如果遇到来自分类集的图片则只计算分类的Loss。

Problems & Think:

通常使用的softmax假定类间独立,而Imagenet(分类集)包含了100多种狗,COCO(检测集)就只有狗这一类,直接混合后会有相互包含

的关系导致不独立。必须按照某种一致的方式来整合两类标签。

Solution:

为了解决这个无法融合的问题,作者使用了multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。

(1) Hierarchical Classification

Question:

很多分类数据集采用扁平化的标签。而整合数据集则需要结构化标签。怎么样建立一个结构可以达到这种muli-model的效果?

Think:

WordNet(描述对象关系的一个语言集合)是一个有向图结构(而非树结构),因为语言是复杂的(例如“dog”既是“canine”又

是“domestic animal”),如:

Solution:

为了简化问题,作者从ImageNet的概念中构建了一个层次树结构(hierarchical tree)来代替图结构方案。Imagenet中的类别是从WordNet中选取的。WordNet是一种比较庞大的直线图结构,作者使用分层树的结构来对其进行简化。

步骤:

1)、遍历Imagenet的label,在WordNet中寻找该label到根节点(指向一个物理对象)的路径;

2)、如果路径只有一条,那么就将该路径直接加入到分层树结构中。

3)、然后处理剩余的具有多条路径的label,并将最短路径加入。

最终可以得到分类树WordTree(视觉名词组成的层次结构模型):

左图:用WordTree执行分类时,预测每个节点的条件概率。例如: “terrier”节点概率的预测:

右图:求特定节点的绝对概率,只需要沿着路径做连续乘积。例如 :图片是否是“Norfolk terrier ”的概率计算:

                                    

验证方法:

在WordTree(用1000类别的ImageNet创建)上训练Darknet-19模型。添加了很多中间节点来创建WordTree1k,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播:例如 如果一张图片被标记为“Norfolk terrier”它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。总之现在一张图片是多标记的,标记之间不需要相互独立。 

 验证结果:

训练参数不变,这种分层结构的Darknet19达到71.9%top-1精度和90.4%top-5精确度,精度只有微小的下降。 

优点:在对未知或者新的物体进行分类时,性能降低的不是特别大。比如看到一个狗的照片,但不知道是哪种种类的狗,那么就高置信度(confidence)预测是”狗“,而其他狗的种类的同义词如”哈士奇“”牛头梗“”金毛“等这些则低置信度。

(2) Dataset Combination With WordTree

通过WordTree可以将不同的数据集合并使用(Eg:Imagenet & COCO), WordTree把数据集合中的类别映射到分层树中的同义词上.

(3) Joint Classification and Detection

 目的
训练一个ExtremelyLarge Scale检测器。
  • WordTree混合COCO检测数据集与ImageNet中的Top 9000类,混合后的数据集对应的WordTree9418个类。
  • OversamplingCOCO数据集中的数据,使COCO数据集与ImageNet数据集之间的数据量比例达到14
 YOLO9000的训练基于YOLO v2的构架,但是使用3priors而不是5来限制输出的大小。
  • 当网络遇到检测数据集中的图片时则正常地反方向传播进行误差调节;
  • 当遇到分类数据集图片的时候,只使用分类的loss功能进行反向传播(bbox能预测出的概率最高的那一类)

方法:
 YOLO9000使用COCO检测数据集学习检测图片中的物体的位置,使用ImageNet分类数据集学习如何从大量的类别中进行分类
 
评估ImageNetdetection task):
(44mAP共享种类) YOLO9000整体达到19.7mAP。在未学习过的156个分类数据上进行测试,mAP16.0。 YOLO9000mAPDPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。

  


对动物的识别性能很好,但是对衣服或者装备的类别,它的识别性能不是很好,这跟数据集的数据组成有很大关系。

Conclusion 

  • 采用多尺度训练方法,使模型可以适应不同的输入尺寸
  • Word-Tree综合不同数据集的方法
  • 联合训练方法
  • YOLO端到端实时检测和分类的思路

 
原创粉丝点击