写在前面
在深度学习出现之前,传统的目标检测方法大概分为区域选择(滑窗)、特征提取(SIFT、HOG等)、分类器(SVM、Adaboost等)三个部分,其主要问题有两方面:一方面滑窗选择策略没有针对性、时间复杂度高,窗口冗余;另一方面手工设计的特征鲁棒性较差。自深度学习出现之后,目标检测取得了巨大的突破,最瞩目的两个方向有:1 以RCNN为代表的基于Region Proposal的深度学习目标检测算法(RCNN,SPP-NET,Fast-RCNN,Faster-RCNN等);2 以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD等)。前篇文章介绍了基于Region Proposal的深度学习目标检测算法,本篇将对基于回归方法的深度学习目标检测方法(YOLO,SSD)进行介绍,前者在速度上并不能满足实时要求,后者利用回归的思想(既给定输入图像,直接在图像的多个位置上回归出这个位置的目标边框以及目标类别),很大的加快了检测的速度。
YOLO
算法特点
1 将物体检测作为回归问题求解。基于一个单独的End-To-End网络,完成从原始图像的输入到物体位置和类别的输出,输入图像经过一次Inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。
2 YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用Inception Module,而是使用1*1卷积层(此处1*1卷积层的存在是为了跨通道信息整合)+3*3卷积层简单替代。
3 Fast YOLO使用9个卷积层代替YOLO的24个,网络更轻快,速度从YOLO的45fps提升到155fps,但同时损失了检测准确率。
4 使用全图作为 Context 信息,背景错误(把背景错认为物体)比较少。
5 泛化能力强。在自然图像上训练好的结果在艺术作品中的依然具有很好的效果。
网络结构
几个要点
一、大致流程
1 给个一个输入图像,首先将图像划分成7*7的网格。
2 对于每个网格,我们都预测2个边框(包括每个边框是目标的置信度以及每个边框区域在多个类别上的概率)。
3 根据上一步可以预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可。
二、训练
1 预训练分类网络:在 ImageNet 1000-class Competition Dataset上预训练一个分类网络,这个网络是前文网络结构中的前20个卷机网络+Average-Pooling Layer+Fully Connected Layer(此时网络输入是224*224)。
2 训练检测网络:文献[6]提到在预训练网络中增加卷积和全链接层可以改善性能。YOLO添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入也从224*224变成448*448。
(1)一幅图片分成7*7个网格,某个物体的中心落在这个网格中此网格就负责预测这个物体。每个网格预测两个Bounding Box。网格负责类别信息,Bounding Box负责坐标信息(4个坐标信息及一个置信度),所以最后一层输出为7*7*(2*(4+1)+20)=7*7*30的维度。
(2)Bounding Box的坐标使用图像的大小进行归一化0-1。Confidence使用$Pr(Object) \ast IOU^{truth}_{pred}$计算,其中第一项表示是否有物体落在网格里,第二项表示预测的框和实际的框之间的IOU值。
3 损失函数的确定:损失函数的定义如下,损失函数的设计目标就是让坐标,置信度和类别这个三个方面达到很好的平衡。简单的全部采用了Sum-Squared Error Loss来做这件事会有以下不足:① 8维的Localization Error和20维的Classification Error同等重要显然是不合理的;② 如果一个网格中没有Object(一幅图中这种网格很多),那么就会将这些网格中的Box的Confidence Push到0,相比于较少的有Object的网格,这种做法是Overpowering的,这会导致网络不稳定甚至发散。 解决方案如下。
(1)更重视8维的坐标预测,给这些损失前面赋予更大的Loss Weight, 记为$\lambda_{coord}$ ,在Pascal VOC训练中取5。(上图蓝色框)。
(2)对没有Object的Bbox的Confidence Loss,赋予小的Loss Weight,记为 $\lambda_{noobj}$ ,在Pascal VOC训练中取0.5。(上图橙色框)。
(3)有Object的Bbox的Confidence Loss(上图红色框)和类别的Loss (上图紫色框)的Loss Weight正常取1。
(4)对不同大小的Bbox预测中,相比于大Bbox预测偏一点,小Bbox预测偏一点更不能忍受。而Sum-Square Error Loss中对同样的偏移Loss是一样。为了缓和这个问题,将Bbox的Width和Height取平方根代替原本的Height和Width。 如下图:Small Bbox的横轴值较小,发生偏移时,反应到y轴上的Loss(下图绿色)比Big Bbox(下图红色)要大。
(5)一个网格预测多个Bbox,在训练时我们希望每个Object(Ground True box)只有一个Bbox专门负责(一个Object 一个Bbox)。具体做法是与Ground True Box(Object)的IOU最大的Bbox 负责该Ground True Box(Object)的预测。这种做法称作Bbox Predictor的Specialization(专职化)。每个预测器会对特定(Sizes,Aspect Ratio or Classed of Object)的Ground True Box预测的越来越好。
三、测试
1 计算每个Bbox的Class-Specific Confidence Score:每个网格预测的Class信息( $Pr(Class_i | Object) $)和Bbox预测的Confidence信息( $Pr(Object) \ast IOU^{truth}_{pred} $) 相乘,就得到每个Bbox的Class-Specific Confidence Score。
$$Pr(Class_i|Object) * Pr(Object) * IOU_{pred}^{truth} = Pr(Class_i) * IOU_{pred}^{truth}$$
2 进行Non-Maximum Suppression(NMS):得到每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉得分低的Bboxes,对保留的Bboxes进行NMS处理,就得到最终的检测结果。更为直观详细的流程可参见[5]。
存在问题
1 YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
2 测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。
3 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。
SSD
算法特点
1 SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域特征进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样比较精准。
2 SSD的核心是在特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。为了提高检测准确率,SSD在不同尺度的特征图上进行预测。
网络结构
几个要点
一、模型结构
1 多尺度特征图(Mult-scale Feature Map For Detection)
在图像Base Network基础上,将Fc6,Fc7变为了Conv6,Conv7两个卷积层,添加了一些卷积层(Conv8,Conv9,Conv10,Conv11),这些层的大小逐渐减小,可以进行多尺度预测。
2 卷积预测器(Convolutional Predictors For Detection)
每个新添加的卷积层和之前的部分卷积层,使用一系列的卷积核进行预测。对于一个大小为m*n大小,p通道的卷积层,使用3*3的p通道卷积核作为基础预测元素进行预测,在某个位置上预测出一个值,该值可以是某一类别的得分,也可以是相对于Default Bounding Boxes的偏移量,并且在图像的每个位置都将产生一个值。
3 默认框和比例(Default Boxes And Aspect Ratio)
在特征图的每个位置预测K个Box。对于每个Box,预测C个类别得分,以及相对于Default Bounding Box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。这里,Default Bounding Box类似于Faster-RCNN中Anchors,如下图所示。
二、模型训练
1 监督学习的训练关键是人工标注的label。对于包含Default Box(在Faster R-CNN中叫做Anchor)的网络模型(如:YOLO,Faster R-CNN, MultiBox)关键点就是如何把 标注信息(Ground True Box,Ground True Category)映射到(Default Box上)。
2 给定输入图像以及每个物体的Ground Truth,首先找到每个Ground True Box对应的Default Box中IOU最大的作为正样本。然后,在剩下的Default Box中找到那些与任意一个Ground Truth Box的IOU大于0.5的Default Box作为正样本。其他的作为负样本(每个Default Box要么是正样本Box要么是负样本Box)。如上图中,两个Default Box与猫匹配,一个与狗匹配。在训练过程中,采用Hard Negative Mining 的策略(根据Confidence Loss对所有的Box进行排序,使正负例的比例保持在1:3) 来平衡正负样本的比率。
3 损失函数
与Faster-RCNN中的RPN是一样的,不过RPN是预测Box里面有Object或者没有,没有分类,SSD直接用的Softmax分类。Location的损失,还是一样,都是用Predict box和Default Box/Anchor的差 与Ground Truth Box和Default Box/Anchor的差进行对比,求损失。
其中,$x^p_{ij}=1$表示 第$i$个Default Box 与类别$p$的第$j$个Ground Truth Box相匹配,否则若不匹配的话,则$x^p_{ij}=0$。
4 Default Box的生成
对每一张特征图,按照不同的大小(Scale) 和长宽比(Ratio)生成生成k个默认框(Default Boxes)。
(1)Scale:每一个Feature Map中Default Box的尺寸大小计算如下:
$$s_k = s_{min} + \frac{s_{max} - s_{min}}{m-1}(k-1), \ \ \ \ \ \ \ \ \ \ k \in [1, m]$$
其中,$s_{min}$取值0.2,$s_{max}$取值0.95,意味着最低层的尺度是0.2,最高层的尺度是0.95。
(2)Ratio:使用不同的Ratio值$a_r={ 1, 2, 3, \frac{1}{2}, \frac{1}{3} }$计算Default Box的宽度和高度:$w^a_k=s_k \sqrt{a_r} ,\, h^a_k=s_k/\sqrt{a_r}$。另外对于Ratio=1的情况,还增加了一个Default Box,这个Box的Scale为$s^{\prime}{k}=\sqrt{s_k s_{k+1}}$。也就是总共有6种不同的Default Box。
(3)Default Box中心:每个Default Box的中心位置设置成$( \frac{i+0.5}{ \left| f_k \right|},\frac{j+0.5}{\left| f_k \right| } ) $,其中 $\left| f_k \right| $表示第k个特征图的大小$i,j \in [0, \left| f_k \right| )$ 。
5 Data Augmentation:为了模型更加鲁棒,需要使用不同尺寸的输入和形状,作者对数据进行了多种方式的随机采样。
小结
至此,介绍完了以YOLO为代表的基于回归方法的深度学习目标检测算法(YOLO,SSD),主要介绍了算法的核心思想和要点难点,代码可以从GitHub得到,更多实现细节可以阅读原论文和代码。在继YOLO和SSD之后,YOLO作者又提出了YOLOv2版,使用一系列的方法对YOLO进行了改进,在保持原有速度的同时提升精度得到YOLOv2。提出了一种目标分类与检测的联合训练方法,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。后面会写一篇对YOLOv2的总结分析整理。
参考文献
[1] YOLO:"You Only Look Once: Unified, Real-Time Object Detection"
[2] 图解YOLO
[3] YOLO详解
[4] 基于深度学习的目标检测研究进展
[5] YOLO PPT by Deepsystems.io
[6] Ren S, He K, Girshick R, et al. "Object detection networks on convolutional feature maps" [J].
[7] SSD:"Single Shot MultiBox Detector"
[8] 读文笔记SSD
[9] 论文阅读:SSD: Single Shot MultiBox Detector
[10] SSD
[11] SSD PPT by Deepsystems.io
[12] SSD关键源码解析