Yolo9000算法分析

Yolo9000算法概述

  现实世界通用的目标检测与识别性能要够快够准、能够多类别的检测识别。目前主流的目标检测算法(RCNN系列)受限于少部分的目标检测识别,而且当下的目标检测数据集类别数较少,相比于图像分类数据集(ImageNet)相差较大。Yolov2(Yolo9000)针对Yolo目标检测算法进一步改进,作者提出联合训练策略:将检测和分类数据集联合来训练目标检测模型。具体方法:利用目标检测数据集来学习目标的定位,利用分类数据集来提升检测器鲁棒性和增加检测目标的类别数。

Yolo9000改进要点

图1 Yolo到Yolo9000优化

—————————————— 更好 ——————————————
  当下计算机视觉领域中,更好的性能通常取决于 训练更深的网络(more deeper)或者将 多个模型组合在一起(combined model)。但是,Yolov2并没有增加网络深度,相反简化了网络使其更容易学习 (这或许是作者想要保证Yolo算法的实时性和检测精度的折衷)。早期作者提出的Yolo第一版本相比于区域提取(Region Proposal)方法的算法框架(R-CNN/Fast-RCNN)主要缺点是边界框(bounding boxes)定位精度不准和召回率低。因此,Yolov2版本在保持分类准确率的情况下要提高bounding boxes的定位精度和召回率。采取如下的改进措施:
Batch Normalization(批归一化)

  自从2015年GoogleNet提出Batch Normalization技巧之后,使用Batch Normalization几乎变成卷积神经网络的标准削弱”梯度弥散”问题,加快模型收敛速度的同时也去除其它形式的正则化需求更有助于模型正则化。Yolov2从模型中去掉了dropout步骤也没有产生过拟合。运用Batch Normalization策略性能提升2%mAP。

High Resolution Classifier(高分辨分类)

  当下所有的主流目标检测方法都使用ImageNet上进行预训练分类器。Yolo是以224*224分辨率训练分类器网络,随后将分辨率提高到448进行检测。这种方式意味着网络必须能够同时在学习目标检测和调整新的输入分辨率之间切换。Yolov2对分类网络通过10个迭代周期微调以此来给网络更多的时间进行调整滤波器,以此来更好的处理高分辨的输入。实验表明运用High Resolution Classifier性能提升4%mAP。

Convolutional with Anchor Boxes(使用默认框卷积)

  Yolov2:首先从Yolo模型中移除全连接层,使用Anchor boxes来预测边界框。去掉了一个池化层,目的使得卷积网络输出更高的分辨率特征。网格输入大小从448*448缩减为416*416,目的在于后面特征映射中奇数个位置(中心点确定)。Yolov2目标预测仍然预测实际值与提出的边界框的IoU,同时预测当下存在目标时该类别的条件概率。运用默认框方式,预测精度有一定的下降。(模型获得69.5%mAP(without anchor boxes) -> 69.2%mAP(with anchor boxes))但是,召回率Recall从81%上升至88%,这意味着Yolo模型有更大的提升空间。

Dimension Clusters(维度聚类)

  当然,Yolo模型结合Anchor boxes进行检测时,会存在两个问题。一是Anchor boxes的尺寸是手工挑选的。二是模型不稳定。Yolov2不采取手工选择先验,而是在训练集边界框上采取k-means聚类的方式自动求取好的先验。以此来使整个网络更容易学习以便更好的进行预测。Yolov2目的是求取好的IoU分数的先验,这独立于边界框的大小。因此,对于距离度量采用的方式:

d(box, centroid) = 1 - IoU(box, centroid)

  之所以采用这样的方式,因为如果采用欧几里得距离标准那么较大的边界框将会比较小的边界框产生更多的误差。作者通过实验选取k-means中阈值k=5作为模型复杂度和召回率之间的折衷。
图2 K-means聚类阈值选取
图3 边界框bounding boxes平均IoU对比

  图2、3对比表明,使用9个先验中心聚类的结果比手工选择的先验结果更好,表明采用k-means来生成边界框会以更好的表示开始训练模型,使得任务更容易学习。
  
Direct Location Prediction(直接定位预测)

  Yolo模型使用Anchor boxes在早期的迭代过程中,不稳定来自于边界框(x, y)位置。在Region Proposal Network中,网络预测值 tx t x ty t y ,(x, y)中心坐标计算如下:

x=(txwa)xa x = ( t x ∗ w a ) − x a
y=(tyha)ya y = ( t y ∗ h a ) − y a

  这种方式不管在图像哪个位置预测边界框,Anchor boxes都可以在任意点结束。导致随机初始化模型需要很长的时间才能够预测合理的偏移量。Yolov2并没有预测偏移量,而是遵从Yolo思想预测相对于网格单元位置的位置坐标。网络预测输出特征映射中每个单元的5个边界框,每个边界框坐标为: tx t x ty t y tw t w th t h to t o 。如果单元从图像左上角偏移了( cx c x , cy c y )并且边界框先验宽度和高度为 pw p w ph p h ,那么预测对应:
bx=δ(tx)+cx b x = δ ( t x ) + c x
by=δ(ty)+cy b y = δ ( t y ) + c y
bw=pwe(tw) b w = p w e ( t w )
bh=phe(th) b h = p h e ( t h )
Pr(object)IOU(b,object)=σ(to) P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o )

图4 具有维度先验和位置预测的边界框

  Yolov2预测边界框的宽度和高度作为聚类中心的偏移量,使用sigmod激活函数预测边界框相对于滤波器应用位置的中心坐标。由于模型限制位置预测参数化更容易学习,网络更加稳定。采用维度聚类和直接预测边界框的中心位置方式比使用Anchor boxes方式提高5%mAP。

Fine-Grained Features(细粒度特性)

  Yolov2在13*13特征映射上预测检测的结果。虽然这对于大型目标检测来说已经足够,但它可以用来定位较小目标中更细粒度中受益。Faster-RCNN和SSD都在网络的各种特征映射上运行所提出的网络,以获得一系列的分辨率。Yolov2仅仅添加一个直通层,从26*26分辨率的更早层提取特征。
  直通层(passthrough layer)通过将相邻特征堆叠到不同的通道而不是空间位置来链接高分辨率特征和低分辨率特征,类似于ResNet中的恒等映射。这将26*26*512特征映射变成13*13*2048特征映射,其可以与原始特征链接。Yolov2检测器运行在这个扩展的特征映射顶部,便于它可以访问细粒度的特征,这样使性能提升1%mAP。

Multi-Scale Training(多尺度方式训练)

  原始Yolo采取输入图像分辨率448*448,通过添加Anchor boxes我们将其改为416*416。为了使Yolov2模型在不同图像大小上进行检测,结构只是用卷积层和池化层,能够实时的调整输入大小。相比较于修改输入图像大小方式,Yolov2通过每隔几次迭代周期就改变网络来进行模型的训练。这种方式迫使网络学习如何在各种输入维度上做好预测,即相同的网络可以预测不同分辨率下的检测结果。在更小的尺寸网络运行速度更快,Yolov2在速度和精度上进行简单的折衷。Yolov2在低分辨率有相当的准确率。(在228*228大小,运行速度超过90FPS,mAP与Fast-RCNN差不多)能够应用于高帧率视频。当然,Yolov2在VOC2007性能达到78.6%同时速度仍然保持实时。

图5 Pascal Voc2007检测框架对比
图6 VOC2007数据集上目标检测算法速度与准确度对比

—————————————— 更快 ——————————————
  为了使目标检测在速度与精度上面得到最佳的匹配折衷,作者从头设计Yolov2模型。大多数目标检测框架依赖于VGG-16作为基本的特征提取,这主要因为VGG-16特征提取准确,但是复杂(耗时较大)。Yolo框架使用GoogleNet架构的自定义网络,速度比VGG-16更快,准确度略低于VGG-16。

Darknet-19
  文章作者设计一个新的分类模型Darknet-19,类似于VGG模型,Darknet-19大多使用3*3滤波器,并且在每次池化步骤后double倍通道数。受启发于Network in Network论文思想,Darknet-19使用全局平均池化做预测以及1*1滤波器来压缩3*3卷积之间的特征表示。Darknet-19同样使用Batch Normalization在稳定训练,加速模型收敛速度,同时正则化模型。

图7 Darknet-19模型架构

Training for detection(检测训练)
  
  对Darknet-19网络进行修改进行检测目标:删除最后一个卷积层,增加3个1024滤波器的3*3卷积层,最后1*1卷积层输出。对于VOC,预测5个边界框,每个边界框有5个坐标和20个类别,所以有125个滤波器。为了使模型可以使用细粒度特征,作者还添加了从最后的3*3*512层到倒数第二层的直通层 (passthrough思想类似于ResNet,将高低分辨率特征图结合改进性能)

—————————————— 更强 ——————————————
  文章作者提出了一个联合训练分类和检测数据的机制,通过使用标记为检测的图像来学习边界框的坐标预测和目标之类的特定信息以及如何对常见的目标进行分类。训练模型期间,将检测和分类数据集混合。当网络看到标记为检测图像时,我们能够基于完整的Yolov2损失函数进行反向传播。当它看到一个分类图像时,只能够从该架构的分类特定部分反向传播损失。但是,这种方法的困难在于: 检测数据集只有通用的目标和标签,分类数据集具有更广更深的标签范围。如何在这两个数据集上使用一种连贯的方式来合并这些标签?

Hierarchical Classification

  文章作者借鉴ImageNet中的WordNet组合数据集思想来构建分层树以此提出WordTree来简化组合假定不互斥的数据集与数据来源包含之间关系。WordTree一个视觉概念的分层模型,为了使用WordTree进行分类,我们预测每个节点的条件概率,以此得到同义词集合中每个同义词的下义词概率。例如:当样本标签在叶子节点时候,父节点也激活成为正样本。如果样本标签为非叶子节点时候,值将会对非叶子节点和父节点进行反向传播。

图8 WordTree数据存储结构图

Joint Classification and Detection(联合分类与检测)

  Yolo9000在ImageNet上能够很好的学习新的动物种类,但是在服装和设备这样的类别学习中较为困难。新的动物更容易学习,主要由于目标预测可以从COCO数据中动物泛化。同时,COCO没有关于服装和设备的边界框标签数据导致模型在学习此类时候泛化能力较弱。联合训练数据集实现Yolo9000网络能够检测识别出一些样本中没有的目标特性。

Yolo9000算法总结及其优缺点

  Yolo9000目标检测算法改进如下:
  
  使用Anchor boxes取代原始网格化的方法,使用K-Means聚类来选择Anchor boxes的大小,而不是手动选择采集。

  将低维特征和高维特征数据融合(直通层),低维特征是高维特征的下采样后重塑相同大小的尺寸。
  
  多尺度训练;类似于随机裁剪等数据增强,可以使网络在不同的尺度下保持稳健,与随机裁剪相比,多尺度方式更容易扩大较小尺寸的物体。
  
  新颖性:
  
  将检测和分类任务进行协同训练,使用分层树表示类别进行类别标记。结果令人印象深刻,该网络可以在检测任务中检测超过9000个类别。

  引入自动Anchor boxes尺寸大小,特征融合,多尺度训练等新技术,提高检测性能。

  对比当前Faster-RCNN/SSD等,在VOC2012结果更好,速度更快,泛化性能更强。
  
  不足:
  
  COCO数据集上评估结果并不是很理想。如果使用来自不同图层的更多特征图,检测性能将会进一步改进。仅仅使用最后一层可能会影响检测较小物体。文中提到通过”下采样”低维特征,这种在某种情况下削弱高分辨率优势。解决方法可以通过上采样高维特征与低维特征相结合会更加有效。

Yolo9000代码实验结果

图片目标检测:

视频检测结果:
 
 链接地址:
 http://player.youku.com/player.php/sid/XMzQ2MDk5Nzg4OA==/v.swf

代码下载
环境配置:Windows 10 x64 + Visual Stdio2015 + OpenCV-3.3.1

Darknet版本(C版本VS2015):
  https://github.com/AlexeyAB/darknet (推荐)
下载后只需配置opencv和工程目录下.vcxproj的CUDA路径修改即可运行

TensorFolw-Java版本:
  https://github.com/szaza/tensorflow-java-yolo
参考配置步骤,或者参考我的配置文档(下载如下)

Java-TensorFlow-Yolo配置文档与模型链接(翻不了墙小伙伴这里下载):

百度网盘链接:https://pan.baidu.com/s/1LnIFGdzLD3mPZ9TJIukFNg 密码:cnr9

参考内容:
https://pjreddie.com/darknet/  
https://pjreddie.com/publications/yolo9000/
http://blog.csdn.net/shuzfan/article/details/54018736
http://x-algo.cn/index.php/2017/03/03/1820/
http://noahsnail.com/2017/12/26/2017-12-26-YOLO9000,%20Better,%20Faster,%20Stronger%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E6%96%87%E7%89%88/
https://github.com/szaza/tensorflow-java-yolo
https://github.com/AlexeyAB/darknet

你可能感兴趣的:(深度学习)