现实世界通用的目标检测与识别性能要够快、够准、能够多类别的检测识别。目前主流的目标检测算法(RCNN系列)受限于少部分的目标检测识别,而且当下的目标检测数据集类别数较少,相比于图像分类数据集(ImageNet)相差较大。Yolov2(Yolo9000)针对Yolo目标检测算法进一步改进,作者提出联合训练策略:将检测和分类数据集联合来训练目标检测模型。具体方法:利用目标检测数据集来学习目标的定位,利用分类数据集来提升检测器鲁棒性和增加检测目标的类别数。
自从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分数的先验,这独立于边界框的大小。因此,对于距离度量采用的方式:
Yolo模型使用Anchor boxes在早期的迭代过程中,不稳定来自于边界框(x, y)位置。在Region Proposal Network中,网络预测值 tx t x 和 ty t y ,(x, y)中心坐标计算如下:
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%同时速度仍然保持实时。
Darknet-19
文章作者设计一个新的分类模型Darknet-19,类似于VGG模型,Darknet-19大多使用3*3滤波器,并且在每次池化步骤后double倍通道数。受启发于Network in Network论文思想,Darknet-19使用全局平均池化做预测以及1*1滤波器来压缩3*3卷积之间的特征表示。Darknet-19同样使用Batch Normalization在稳定训练,加速模型收敛速度,同时正则化模型。
—————————————— 更强 ——————————————
文章作者提出了一个联合训练分类和检测数据的机制,通过使用标记为检测的图像来学习边界框的坐标预测和目标之类的特定信息以及如何对常见的目标进行分类。训练模型期间,将检测和分类数据集混合。当网络看到标记为检测图像时,我们能够基于完整的Yolov2损失函数进行反向传播。当它看到一个分类图像时,只能够从该架构的分类特定部分反向传播损失。但是,这种方法的困难在于: 检测数据集只有通用的目标和标签,分类数据集具有更广更深的标签范围。如何在这两个数据集上使用一种连贯的方式来合并这些标签?
Hierarchical Classification
文章作者借鉴ImageNet中的WordNet组合数据集思想来构建分层树以此提出WordTree来简化组合假定不互斥的数据集与数据来源包含之间关系。WordTree一个视觉概念的分层模型,为了使用WordTree进行分类,我们预测每个节点的条件概率,以此得到同义词集合中每个同义词的下义词概率。例如:当样本标签在叶子节点时候,父节点也激活成为正样本。如果样本标签为非叶子节点时候,值将会对非叶子节点和父节点进行反向传播。
Yolo9000在ImageNet上能够很好的学习新的动物种类,但是在服装和设备这样的类别学习中较为困难。新的动物更容易学习,主要由于目标预测可以从COCO数据中动物泛化。同时,COCO没有关于服装和设备的边界框标签数据导致模型在学习此类时候泛化能力较弱。联合训练数据集实现Yolo9000网络能够检测识别出一些样本中没有的目标特性。
Yolo9000目标检测算法改进如下:
使用Anchor boxes取代原始网格化的方法,使用K-Means聚类来选择Anchor boxes的大小,而不是手动选择采集。
将低维特征和高维特征数据融合(直通层),低维特征是高维特征的下采样后重塑相同大小的尺寸。
多尺度训练;类似于随机裁剪等数据增强,可以使网络在不同的尺度下保持稳健,与随机裁剪相比,多尺度方式更容易扩大较小尺寸的物体。
新颖性:
将检测和分类任务进行协同训练,使用分层树表示类别进行类别标记。结果令人印象深刻,该网络可以在检测任务中检测超过9000个类别。
引入自动Anchor boxes尺寸大小,特征融合,多尺度训练等新技术,提高检测性能。
对比当前Faster-RCNN/SSD等,在VOC2012结果更好,速度更快,泛化性能更强。
不足:
COCO数据集上评估结果并不是很理想。如果使用来自不同图层的更多特征图,检测性能将会进一步改进。仅仅使用最后一层可能会影响检测较小物体。文中提到通过”下采样”低维特征,这种在某种情况下削弱高分辨率优势。解决方法可以通过上采样高维特征与低维特征相结合会更加有效。
图片目标检测:
视频检测结果:
链接地址:
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