前文简单概述了目标检测的传统算法,本文将步入深度学习时代。ILSVRC 2012中AlexNet 的出现标志着计算机视觉进入深度学习阶段,目标检测算法随之在2014年问世了R-CNN算法框架。
各传统算法的主要区别在于特征提取的思路不同,如果用CNN提取特征,我们便能得到一个粗略的基于CNN特征提取的目标检测算法:暴力搜索,从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口;输入模型前再将窗口内的图片缩放至统一的尺寸。但这种搜索方法运算量很大,效率低下,需要进一步优化。
R-CNN
为了进一步改进,有人提出采用候选区域方法(Region Proposal method)创建目标检测的感兴趣区域(ROI),即进行选择性搜索(selective search,SS)。基于这种Region Proposal 的思路,也就诞生了R-CNN(Regions with CNN features)。
候选区域如何产生
首先将每个像素都独立作为一区域。然后计算每个区域的纹理,并将两个最接近的区域合并。为了避免单个区域吞噬其他区域,优先对较小的区域进行合并。一直合并区域,直到所有区域都结合在一起。在这个过程中,出现过的所有区域,都将作为候选区域。
算法概述
R-CNN 利用这种方法创建约 2000 个 Region Proposals。这些区域被缩放至固定大小的图像,并使用卷积神经网络进行特征提取,再使用SVM对区域进行分类,及使用线性回归来校正边界框,以实现目标分类并得到边界框。
预备知识
基本概念之IoU
IoU的定义:框A与框B的IoU=(A∩B)/(A∪B),表示框A与框B的重合度(相似度)。R-CNN使用IoU来定量候选框与Ground Truth框之间的重合关系。
基本概念之NMS
非极大值抑制NMS在目标检测的传统算法里就已经很常见,其作用是去除冗余的候选框,保留最好的一个。
举个栗子:
假设有6个候选框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
从最大概率矩形框F开始,分别判断A~E与F的重叠度IoU是否大于某个设定的阈值;假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,并保留下来的。从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。如此一直重复,找到所有被保留下来的矩形框。
R-CNN算法框架
Step 1 大样本 pre-training
使用大量有类别标签的图像进行类别训练(CNN模型)。论文中“学习率=0.01,输入为227×227的ILSVRC训练集图像,输出最后一层为4096维特征->1000类的映射”。
Step 2 特定领域的 fine-tuning
为了让CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口),再次使用变形后的推荐区域对CNN参数进行微调。采用来自各Region Proposals,与真实标注框(Ground Truth)的IoU>= 0.5就认为是正例,否则就是负例。学习率=0.001(为了在学习新东西时不至于忘记之前的记忆)。输入图像为Region Proposals变形后的227×227的图像,输出维度不再是1000类,而是需要检测的类别数+1(背景)。
至此,CNN特征提取器构建完毕。
Step 3 SVM分类训练
正样本为Ground Truth,负样本为与Ground Truth的IoU<0.3的Region Proposals。SVM采用的是二分类器,需要为每个类别训练单独的SVM。
为什么不直接使用CNN的softmax输出类别?对此的解释摘自:R-CNN论文详解
为什么单独训练了一个SVM而不是直接用softmax,作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度。
Step 4 Bbox 回归训练
训练样本为:与Ground Truth的IoU>0.6的Region Proposal。这一步是用来对Region Proposal的位置和大小进行校正,使当前Region Proposal更接近Ground Truth框。简单理解就是,训练一组变换参数(平移参数dx,dy、缩放参数dw,dh ),使当前Region Proposal(x,y,w,h)(下图中的P)能通过该变换能够拟合到Ground Truth(下图中的G)。
为什么选择IoU>0.6d的Region Proposal进行训练?作者认为当IoU尽可能大时,回归模型是线性的(即可以使用平移缩放变换),否则模型将是复杂的非线性变换。具体理解可以参考:边框回归(Bounding Box Regression)详解
Bounding Box Regression实际上的输入并不是Region Proposal 的位置参数(x,y,w,h),而是CNN的pool5层输出特征向量。具体关于Bounding Box Regression的介绍可以参考:
边框回归:BoundingBox-Regression(BBR)
边框回归(Bounding Box Regression)详解
Step 5 测试
对于输入图像,提取候选框后,送入CNN进行特征提取,然后再连接到SVM Classifier 和Bounding Box Regression,从而获得类别预测和位置预测。
R-CNN家族的优化
SPP-Net
特点:
1、将提取候选框特征向量的操作转移到卷积后的特征图上进行。在R-CNN中,每个候选框先缩放到统一大小,然后分别作为CNN的输入,这样是很低效的。SPP-Net对此进行了优化:只对原图进行一次卷积得到整张图的特征图,然后找到每个候选框在特征图上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了存储空间和计算时间,比R-CNN有一百倍左右的提速。
2、在最后一个卷积层和第一个全连接层之间做一些处理,引入了Spatial Pyramid pooling层,对卷积特征图像进行空间金字塔采样获得固定长度的输出,可对特征层任意长宽比和尺度区域进行特征提取。
在得到卷积特征图之后,对卷积特征图进行三种尺度的切分:4*4,2*2,1*1,对于切分出来的每个小块进行max-pooling下采样,之后再将下采样的结果全排列成一个列向量,送入全连接层。
例如每个候选区域在最后的512张卷积特征图中得到了512个该区域的卷积特征图,通过SPP层下采样后得到了一个512×(4×4+2×2+1×1)维的特征向量,这样就将大小不一的候选区的特征向量统一到了一个维度(避免了对候选框进行缩放)。
Fast R-CNN
特点
1、将原来的串行结构改成并行结构。
2、加入RoI pooling layer,它将不同大小候选框的卷积特征图统一采样成固定大小的特征。ROI池化层是简化的SPP层,做法和SPP层类似,但只使用一个尺度进行网格划分和池化。
步骤
1、特征提取:以整张图片为输入利用CNN得到图片的特征图;
2、提取候选区:通过Selective Search等方法从原始图片提取区域候选框,并把这些候选框投影到最后的特征图;
3、区域归一化:针对特征层上的每个候选框进行RoI Pooling操作,得到固定大小的特征表示;
4、分类与回归:然后再通过两个全连接层,分别用分类做目标识别,用回归模型进行边框位置与大小微调。
Faster R-CNN
本部分节选自:计算机视觉目标检测算法综述
在Faster R-CNN之前,生成候选区域都是用的一系列启发式算法(Selective Search),基于Low Level特征(纹理相似性)生成候选框。这种做法生成了大量无效区域则会造成算力的浪费。Faster R-CNN提出 Region Proposal Network(RPN)网络替代Selective Search算法,利用神经网络自己学习去生成候选区域。RPN 使得神经网络可以学到更加高层、语义、抽象的特征,且生成的候选区域的可靠程度大大提高。从此,目标识别真正实现了端到端的计算,所有的任务都统一在了深度学习的框架之下,所有计算都在GPU内进行,使得计算的速度和精度都有了大幅度提升。RPN和RoI pooling共用前面的卷积神经网络——将RPN嵌入原有网络,原有网络和RPN一起预测,大大地减少了参数量和预测时间。
算法思路:首先对整张图片进行卷积计算,得到卷积特征,然后利用RPN进行候选框选择,再返回卷积特征图取出候选框内的卷积特征利用ROI提取特征向量最终送入全连接层进行精确定位和分类。简言之:RPN+Fast R-CNN=Faster R-CNN。
在RPN中引入了anchor的概念,feature map中每个滑窗位置都会生成
k
个anchor,然后判断anchor覆盖的图像是前景还是背景,同时回归Bounding box(Bbox)的精细位置,预测的Bbox更加精确。以论文为例,每个滑窗(论文采用3*3卷积核通过滑窗提取候选框)对应的每个特征区域同时预测输入图像3种尺度及3种长宽比(1:1,1:2,2:1)的候选框,也就是9个anchor。
R-CNN家族各算法的检测速度对比:
YOLO
上文将Two stage 流派的主要算法简单梳理了一下,我们来看一下目标检测算法的发展简图。
在Two stage流派发展至高潮时,以YOLO为代表的One stage流派诞生了,One stage主要关注检测速度(FPS大大提升)。由于笔者的项目更加关注检测精度,因此对One stage流派研究不多,此处仅简述其核心观点。
YOLO 的全称是You Only Look Once,其核心思想就是利用整张图作为网络的输入,直接在输出层回归 bounding box(边界框) 的位置及其所属的类别。R-CNN系列通过Bbox回归调整边框的位置和大小,既然反正最后都是要调整的,干嘛还要先费劲去寻找候选区呢,大致有个区域范围就行了,所以YOLO就这么干了。
YOLO并没有真正去掉候选区,而是采用了预定义的预测区,也就是将图片划分为 7*7=49 个网格(grid)。如果某个 object 的中心落在这个网格中,则这个网格就负责预测这个 object。每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49*2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。每个 bounding box 除了要回归自身的位置之外,还要附带预测一个置信度。其中,bounding box的置信度 = 该bounding box内存在对象的概率 * 该bounding box与该对象实际bounding box的IOU。
论文中,输出是一个 7*7*30 的张量(tensor)。 7*7 就对应着输入图像的 7*7 网格,30维向量 = 20个对象的概率 + 2个bounding box * 4个坐标 + 2个bounding box的置信度。
值得注意的是,YOLO的bounding box虽然像Faster R-CNN的Anchor(一个grid的2个Anchor),但有所不同,YOLO并没有预先设置2个bounding box的大小和形状。这里采用的bounding box,有点不完全算监督算法,而是像进化算法。YOLO的2个bounding box事先并不知道会在什么位置,只有经过前向计算,网络会输出2个bounding box。具体的请参考其他资料。其他内容诸如损失函数等等,也请参考其他资料。YOLO的进一步改进,如YOLO v2、YOLO v3等,都是在YOLO v1的基础上进行优化,此处暂不作介绍。
SSD
本部分节选自:目标检测算法之SSD
SSD最大的特点是:采用了多尺度的特征图,用不同尺度的特征图检测不同尺度的物体。
SSD核心设计理念:
1、采用多尺度特征图用于检测。CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来逐步降低特征图大小,不同大小的特征都用来做检测:比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。
2、采用卷积进行检测。与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。从效率上来看,替换掉FC层,可以减少大量参数,节约时间和空间。
3、设置先验框。与YOLO的自适应bounding box不同,SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框。
由于采用卷积而非FC层对特征图进行检测,SSD本质上是在多尺度特征图上密集采样检测。
SSD算法框架(与YOLO对比)
另外,还有诸如RetinaNet、R-FCN,及采用FPN的各类算法等方法,本文不作介绍了。另外,对于小目标检测、点检测等细粒度任务,上述方法不一定可以达到很高的精度,可以尝试根据自己的应用场景调整算法思路,也可尝试其他目标检测算法或语义分割类算法。
本文暂时比较简略,以后有空再进一步补充梳理。
参考资料:
边框回归:BoundingBox-Regression(BBR)
边框回归(Bounding Box Regression)详解