基于深度学习的视频检测(四) yolo-v2和darkflow

yolo-v1

核心思想:从R-CNN到Fast R-CNN一直采用的思路是proposal+分类 (proposal 提供位置信息, 分类提供类别信息)精度已经很高,但是速度还不行。 YOLO提供了另一种更为直接的思路: 直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。

主要特点

 1. 速度快,能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
 2. 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
 3. 泛化能力强。

大致流程

基于深度学习的视频检测(四) yolo-v2和darkflow_第1张图片

 1. Resize成448*448,图片分割得到7*7网格(cell),一个cell设定两个bounding box

 2. CNN提取特征和预测:卷积部分负责提特征。全连接部分负责预测:
     a) 7*7*2=98个bounding box(bbox) 的坐标x_{center},y_{center},w,h 和是否有物体的confidence 。
     b) 7*7=49个cell所属20个物体的概率。

3. 过滤bbox(通过NMS( NON-MAXIMUM SUPPRESSION))

基于深度学习的视频检测(四) yolo-v2和darkflow_第2张图片

关于NMS


网络设计

基于深度学习的视频检测(四) yolo-v2和darkflow_第3张图片

基于深度学习的视频检测(四) yolo-v2和darkflow_第4张图片

网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules


缺陷

1. YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。

2. 测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。

3. 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是对小物体的处理上,还有待加强。

其他细节


yolo-v2

精度的改进(Better)

Batch Normalization

CNN 在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。**新的YOLO网络在每一个卷积层后添加batch normalization**,通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

High Resolution Classifier

目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256 * 256,导致分辨率不够高,给检测带来困难。为此,新的YOLO网络把分辨率直接提升到了448 * 448,这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入。

对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成448 * 448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行fine tune。
之前的 YOLO v1以分辨率224*224训练分类网络,YOLO v2 将分类网络的分辨率提高到 448*448,高分辨率样本对于效果有一定的提升(文中mAp提高了约4%)。

Convolutional With Anchor Boxes

之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,回顾一下,anchor是RNP网络中的一个关键步骤,说的是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的建议框。看到YOLOv2的这一借鉴,我只能说SSD的作者是有先见之明的。

YOLO v1:    S*S* (B*5 + C)   =>  7*7(2*5+20)
其中B对应Box数量,5对应 Rect 定位+置信度。 每个Grid只能预测对应两个Box,这两个Box共用一个分类结果(20 classes),这是很不合理的临时方案,看来作者为第二篇论文预留了改进,没想被 SSD 抢了风头。

YOLO v2:    S*S*K* (5 + C)   =>  13*13*9(5+20)
分辨率改成了13*13,更细的格子划分对小目标适应更好,再加上与Faster一样的K=9,计算量增加了不少。通过Anchor Box改进,mAP由69.5下降到69.2,Recall由81%提升到了88%。

 SSD(-):    S*S*K*(4 + C)  => 7*7*6*( 4+21 ) 
 对应C=21,代表20种分类类别和一种 背景类。 

Dimension Clusters

 还是针对Anchors,Faster的Anchor对应 K=9,那么为什么等于9呢?宽高比为什么定位成这样(1:1,1:2,2:1)?对于SSD选择了K=6,那么K到底等于几合适?宽高比又该怎么设计? 作者给出了解决方案,这个解决方案就是聚类。
作者在 VOC 和 COCO 上通过 Ground Truth 进行聚类统计(采用K-means算法)

Direct location prediction

作者通过使用 维度聚类 和 直接位置预测 这两项Anchor Boxes改进方法,将 mAP 提高了5%.

Fine-Grained Features

SSD通过不同Scale的Feature Map来预测Box来实现多尺度,而YOLO v2则采用了另一种思路:添加一个passthrough layer,来获取上一层26x26的特征,并将该特征同最后输出特征(13*13)相结合,以此来提高对小目标的检测能力。

通过Passthrough 把26 * 26 * 512的特征图叠加成13 * 13 * 2048的特征图,与原生的深层特征图相连接。
YOLO v2 使用扩展后的的特征图(add passthrough),将mAP提高了了1%。

PS:这里实际上是有个Trick,网络最后一层是13*13,相对原来7*7的网络来讲,细粒度的处理目标已经double了,再加上上一层26*26的Feature共同决策,这两层的贡献等价于SSD的4层以上,但计算量其实并没有增加多少。

Multi-Scale Training

为了让 YOLOv2 适应不同Scale下的检测任务,作者尝试 通过不同分辨率图片的训练来提高网络的适应性。

PS:网络只用到了卷积层和池化层,可以进行动态调整(检测任意大小图片)

具体做法是:
     每经过10批训练(10 batches)就会随机选择新的图片尺寸,尺度定义为32的倍数,( 320,352,…,608 ),为了最后一层得到特征图尺度为13*13(416=13*32),YOLO v2 输入图片尺寸为416 * 416,降采样参数为32。

速度的改进(Faster)


特点

YOLO v2 在大尺寸图片上能够实现高精度,在小尺寸图片上运行更快,可以说在速度和精度上达到了平衡。 

更多细节


darknet和darkflow

YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。

最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。

基于深度学习的视频检测(四) yolo-v2和darkflow_第5张图片

darkflow

darkflow实现了将darknet移植到tensorflow上,可以用tensorflow加载darknet训练好的模型,并使用tensorflow重新训练,输出tensorflow graph模型,用于移动设备。

环境配置参考:https://github.com/thtrieu/darkflow

你可能感兴趣的:(深度学习,目标检测-分类器)