一、RCNN,fast-RCNN、faster-RCNN进化史
本节由CDA深度学习课堂,唐宇迪老师教课,非常感谢唐老师课程中的论文解读,很有帮助。
.
1、Selective search
如何寻找有效的候选框,最开始的就是这个方法。
寻找方法就是一开始把一幅图像,分割成无数个候选框构造而成的(convert regions to boxes)
然后根据一些色彩特征、把候选框进行融合,框数量变小了,框变大;效果就是逐渐、慢慢找到最好的框
.
2、R-CNN(CVPR 2014)
图像中的候选框,每个boxes跑一次卷积神经网络(一张图大概2000个框)。conv之后接SVM/reg,进行判断,论文中用SVM来进行分类(比softmax好一些)
但是,每个都要计算太浪费时间了,最开始,需要把数据固化到硬盘很占容量,同时分类用SVM也非常耗时,效率不高。
.
3、Faster R-CNN(ICCV 2015)
官方是caffe版本:towards real-time object detection with region proposal networks
借用了RPN(region proposal network)选择候选框。
**RPN可以很有效地共享卷积成果。**RCNN是基于像素点来做的,先提取框,后卷积,有几个框就要多少次卷积;RPN是卷积之上的特征图来的,先卷积,共享卷积成果(效率更高的切入点),只需要一次卷积。
- (1)RPN候选框生成阶段。
在VGG中的最后一层卷积层的特征图中,找到某一个点,通过感受野,还原到原始图像,变成了9张大小不同的框anchor boxes,像素(128,256,521)*比率(1:1,1:2,1:3)1个点,模拟出9个候选框。其中弱候选框有超出边界的话,则去掉。
- (2)分类阶段。
选出候选框之后,接上分类对候选框进行判断。
- (3)微调阶段。
选定一些框之后,需要对框框进行最后的微调box regression、box回归。计算差异(长宽比),然后作了微调,box regression
- (4)ROI pooling层阶段
spatial pyramid pooling(SPP layer)为最后输出做准备。做了微调之后,候选框大小不一样,通过调整pooling的滑块,调整到相同的结果。
- 问题一:真的要画这9个候选框吗?
答:不是。卷积层每个点演化成9个框,而9个框则是虚构出来的,而没有真正画在图像上。
- 问题二:感受野
计算感受野的时候,在计算未来的候选框大小,VGG网络只需要根据pooling层来计算即可,因为卷积层不会矿大、缩小感受野。
- 问题三:分类任务实质上并不是二分类
之后再接分类softmax层判断候选框是否有物体。但是根据源码来看,并不是二分类(是否有物体),而是18分类。通过定义loss function来实现成9个框,9个框计算正负的概率,那就是18个结果。
- 问题四:如何判断候选框是有物体的?
根据给定的训练集的输入数据的四个坐标(x,y,m,h)的groud truth,看重合部分,大于0.7,认为是一个物体(正例,前景),小于0.3认为不是一个物体(负例,背景)
.
4、YOLO
来源知乎机智的大群主,FACEBOOK提出来的YOLO网络,也是进行物体检测,最快达到每秒钟155帧,达到了完全实时。它让一整张图像进入到神经网络,让神经网络自己判断这物体可能在哪里,可能是什么。但它缩减了可能图像块的个数,从原来Faster R-CNN的2000多个缩减缩减到了98个。
同时取消了Faster R-CNN里面的RPN结构,代替Selective Search结构。YOLO里面没有RPN这一步,而是直接预测物体的种类和位置。
YOLO的代价就是精度下降,在155帧的速度下精度只有52.7,45帧每秒时的精度是63.4。
.
5、SSD
来源知乎机智的大群主Single Shot MultiBox Detector,即SSD。
它是YOLO的超级改进版,吸取了YOLO的精度下降的教训,同时保留速度快的特点。它能达到58帧每秒,精度有72.1。速度超过Faster R-CNN 有8倍,但达到类似的精度。
.
.
二、2016年的CVPR会议目标检测
本节主要参考:文章《CVPR 2016论文快讯:目标检测领域的新进展》
在目标检测中,以下几个方面非常重要,都有各自的专属paper:
(a)识别精度:ION(inside-outside-network)、HyperNet框架 (b)识别效率:YOLO、G-CNN
(c)定位准确性:LocNet
识别精度,不得不提目标检测中衡量检测精度的指标mAP(mean average precision)。简单来讲就是在多个类别的检测中,每一个类别都可以根据recall和precision绘制一条曲线,那么AP就是该曲线下的面积,而mAP是多个类别AP的平均值,这个值介于0到1之间,且越大越好。
.
1、识别精度方面
- (1) ION(inside-outside-network)
这个工作的主要贡献有两个:加入周边信息、多层ROI提取和融合
- 第一个是如何在Fast
R-CNN的基础之上增加context信息,所谓context在目标检测领域是指感兴趣的ROI周围的信息,可以是局部的,也可以是全局的。为此,作者提出了IRNN的概念,这也就是outside-network。 - 第二个贡献是所谓skip-connection,通过将deep
ConvNet的多层ROI特征进行提取和融合,利用该特征进行每一个位置的分类和进一步回归,这也就是inside-network。
依靠这两个改进,ION可以在Pascal VOC 2007数据集上边提高大约5个百分点。同时也获得了COCO 2015 detection竞赛的best student entry。
- (2)HyperNet框架
- 高层信息:更强的语义信息,对于识别问题较为有效;
- 低层信息:的特征由于分辨率较高,对于目标定位有天然的优势
而检测问题恰恰是识别+定位,因此作者的贡献点在于如何将deep ConvNet的高低层特征进行融合,进而利用融合后的特征进行region proposal提取和进一步目标检测。
不同于Faster R-CNN,文章的潜在Anchor是用类似于[BING](Cheng M M, Zhang Z, Lin W Y, et al. BING: Binarized normed gradients for objectness estimation at 300fps. In CVPR 2014)的方法通过扫描窗口的方式生成的,但利用的是CNN的特征,因此取得了更好的性能。
通过以上的改进策略,HyperNet可以在产生大约100个region proposal的时候保证较高的recall,同时目标检测的mAP相对于Fast R-CNN也提高了大约6个百分点
.
.
2、识别效率方面
- (1)YOLO
这个工作在识别效率方面的优势很明显,可以做到每秒钟45帧图像,处理视频是完全没有问题的。
YOLO最大贡献是提出了一种全新的检测框架——直接利用CNN的全局特征预测每个位置可能的目标,相比于R-CNN系列的region proposal+CNN 这种两阶段的处理办法可以大大提高检测速度。今年新出来的[SSD](Liu W, Anguelov D, Erhan D, et al. SSD: Single Shot MultiBox Detector[J]. arXiv preprint arXiv:1512.02325, 2015.
)方法虽然在识别率上边有了很大的提升,但YOLO的先驱作用是显而易见的。
- (2)G-CNN
不管是[Fast R-CNN],还是Faster R-CNN,或者像HyperNet这样的变种,都需要考虑数以万计的潜在框来进行目标位置的搜索,这种方式的一个潜在问题是负样本空间非常大,因此需要一定的策略来进行抑制。
G-CNN从另一个角度来克服这个问题。G-CNN在在初始化的时候不需要那么多框,而是通过对图像进行划分(有交叠),产生少量的框(大约180个),通过一次回归之后得到更接近物体的位置。然后以回归之后的框作为原始窗口,不断进行迭代回归调整,得到最终的检测结果。
经过五次调整之后,G-CNN可以达到跟Fast R-CNN相当的识别性能,但速度是Fast R-CNN的5倍(3fps)。
.
.
3、准确性
LocNet:以上提到的工作都是在做整个目标检测的框架,而LocNet在做另一件事情—如何产生更准确的bounding box?
在目标检测的评价体系中,有一个参数叫做IoU,简单来讲就是模型产生的目标窗口和原来标记窗口的交叠率。在Pascal VOC中,这个值为0.5。而2014年以来出现的MS COCO竞赛规则把这个IoU变成了0.5-1.0之间的综合评价值,也就是说,定位越准确,其得分越高,这也侧面反映了目标检测在评价指标方面的不断进步。
回到这个话题,如何产生更准确的目标位置呢?
LocNet的解决方案是:针对每一个给定的初始框进行适当的放大,然后用一个CNN的网络回归出这个放大后的框包含的那个正确框的位置。为了达到这个目标,需要定义回归方式,网络以及模型,具体的细节参见paper(Gidaris S, Komodakis N. LocNet: Improving Localization Accuracy for Object Detection. In CVPR 2016)
经过把原始的框(比如selective search生成的)进行再一次回归之后,再放入Fast R-CNN进行检测,在IoU=0.5的情况下,在Pascal VOC 数据集上mAP可以提升大约5个百分点,而IoU=0.7时可以达到13个百分点的提升,效果还是挺惊人的。
.
延伸一:boosting+CNN的结合
来源于《NIPS 2016 – 增量Boosting CNN 用于面部动作单元识别》
增量Boosting CNN 用于面部动作单元识别.卷积神经网络需要很多参数,尤其是网络结构比较深的情形。为取得较好的效果,需要大量的训练图片,也需要mini-batch 训练策略,即每次迭代只利用一小批的图片。
Boosting, 比如 AdaBoost,是一种流行的集成学习技巧,这种方法通过结合多个弱分类器来提升效果,而且在面部单元识别中泛化效果较好。
Boosting可以融入到CNN中,如此一来可以选择每次迭代所选择和激活的具有判别性的神经单元。然而,Boosting CNN (B-CNN)在每个小批上迭代时会由于缺少训练数据而过拟合。而且,上次迭代或上小批中所得信息不能传播,意即,每次迭代都会训练一批新的弱分类器,之前所得弱分类器会被丢弃。
受增量学习启发,作者提出了一种新的增量Boosting CNN (IB-CNN),这种方法目标在于,每当新训练样本出现时,都会积累B-CNN学习中所得信息。
caffe实现,https://cse.sc.edu/~mengz/papers/NIPS2016.pdf
.
延伸二:级联分类模型(Cascaded Classification Models)
paper:http://ai.stanford.edu/~koller/Papers/Heitz+al:NIPS08a.pdf
用来解决如何整体上理解图像问题的。Daphne Koller的学生提出了一种级联分类模型,这种模型可以同时学习一些有关联的模型,并且使得模型之间的效果互相提升。这种方法可以将场景分割,目标检测,多类图像分割以及3D重建等任务结合起来。
首先单独学习第一层中地每个模型,通过训练得到效果最好的分类器,然后将原始数据和相对低层的模型输出集合结合起来输入到更高一层的模型中。
这种模型也有一些问题,比如,合适的深度如何确定?过深的话会导致过拟合。该模型没有考虑将高层中的分类器反馈给低层中的分类器。通过反馈,也许可以使得相对低层的分类器注意点有所集中,另外,也许可以使得相对底层的模型忽略一些不影响后续分类的误差。
.
延伸三:多姿态人脸检测-漏斗型级联结构(Funnel-Structured Cascade,FuSt)
来源于深度学习大讲堂,SeetaFace开源人脸识别引擎介绍,这边只看漏斗形级联结构
该模块基于我们提出的一种结合经典级联结构和多层神经网络的人脸检测方法[1]实现,其所采用的漏斗型级联结构(Funnel-Structured Cascade,FuSt)专门针对多姿态人脸检测而设计,其中引入了由粗到精的设计理念,兼顾了速度和精度的平衡。
快速LAB级联分类器[2]构成,紧接着是若干个基于SURF特征的多层感知机(MLP)级联结构,最后由一个统一的MLP级联结构(同样基于SURF特征)来处理所有姿态的候选窗口,整体上呈现出上宽下窄的漏斗形状。
从上往下,各个层次上的分类器及其所采用的特征逐步变得复杂,从而可以保留人脸窗口并排除越来越难与人脸区分的非人脸候选窗口。
github开源地址,SeetaFace Engine是一个C++面部识别引擎:
https://github.com/seetaface/SeetaFaceEngine
.
延伸四:人脸识别项目
非极大值阈值:http://www.thinkface.cn/thread-4203-1-1.html
一键人脸预处理工具,适用于在人脸识别,人脸表情识别小工具:
FaceTools,https://github.com/RiweiChen/FaceTools
主要实现代码,来源于【Caffe实践】基于Caffe的人脸检测实现
作者github地址:
https://github.com/RiweiChen/DeepFace/tree/master/FaceDetection/baseline