卷积神经网络(CNN)由于其强大的特征提取能力,近年来被广泛用于计算机视觉领域。1998年Yann LeCun等提出的LeNet-5网络结构,该结构使得卷积神经网络可以端到端的训练,并应用于文档识别。LeNet-5结构是CNN最经典的网络结构,而后发展的卷积神经网络结构都是由此版本衍生而来。
在过去六年中,由于深度学习和卷积网络的发展和进步,基于图像的目标检测和分类能力已经大大提高。而目标检测是计算机视觉领域一个重要的研究方向,是众多高级任务的必备前提,包括场景理解,事件识别等。目前,目标检测也广泛用于安全监控,自动驾驶,人机交互,增强现实等众多领域。目标检测对计算机视觉和产业界实际应用都有十分重要的意义。
然而, 由于视角、遮挡、姿态等因素引起目标发生形变, 导致目标检测成为一个具有挑战性的任务。设计高准确率高效率的目标检测算法仍具有重大意义。
如今, 基于卷积神经网络的目标检测已经超越传统目标检测方法, 成为当前目标检测的主流方法。本文根据卷积神经网络的使用方式,将基于卷积神经网络的目标检测分为两大类: 基于分类的卷积神经网络目标检测和基于回归的卷积神经网络目标检测。
基于分类的CNN也可以成为two-stage检测算法,传统目标检测方法包含预处理、窗口滑动、特 征提取、特征选择、特征分类、后处理等步骤,而卷积神经网络本身具有特征提取、特征选择和特征分类的功能。那么,可以 直接利用卷积神经网络对每个滑动窗口产生的候选区进行二分类,判断其是否为待检测目标。本文将这类方法称为基于分 类的卷积神经网络目标检测。相比于传统目标检测的六个步骤,基于分类的卷积神经网络目标检测只有: 窗口滑动,产生候选区域(region proposals),对候选区域图像分 类,后处理三个步骤,而且窗口滑动和后处理都是固定的方法。因此,该类方法的研究重点在于如何提升卷积神经网络的特征 提取能力、特征选择能力以及特征分类能力,以提高图像识别的准确度。这类算法的典型代表是基于region proposal的R-CNN系算法,如R-CNN,Fast R-CNN,Faster R-CNN等;
1.1 R-CNN
R-CNN是基于region proposal方法的目标检测算法系列奠基之作,其先进行区域搜索,然后再对候选区域进行分类。在R-CNN中,选用Selective search方法来生成候选区域,这是一种启发式搜索算法。它先通过简单的区域划分算法将图片划分成很多小区域,然后通过层级分组方法按照一定相似度合并它们,最后的剩下的就是候选区域(region proposals),它们可能包含一个物体。示意图如下:
对于一张图片,R-CNN基于selective search方法大约生成2000个候选区域,然后每个候选区域被resize成固定大小(227×227)并送入一个CNN模型中,使用AlexNet来提取图像特征,最后得到一个4096维的特征向量。然后这个特征向量被送入一个多类别SVM分类器中,预测出候选区域中所含物体的属于每个类的概率值。每个类别训练一个SVM分类器,从特征向量中推断其属于该类别的概率大小。为了提升定位准确性,R-CNN最后又训练了一个边界框回归模型。训练样本为(P,G),其中P=(Px,Py,Pw,Ph)为候选区域,而G=(Gx,Gy,Gw,Gh)为真实框的位置和大小。G的选择是与P的IoU最大的真实框,回归器的目标值定义为:
在做预测时,利用上述公式可以反求出预测框的修正位置。R-CNN对每个类别都训练了单独的回归器,采用最小均方差损失函数进行训练。
R-CNN是非常直观的,就是把检测问题转化为了分类问题,但是,由于R-CNN使用计算复杂度极高的selective search提取候区域,并使用SVM来进行分类,并不是一个端到端的训练模型。R-CNN模型在统一候选区的大小后才能进行特征提取和特征分类。并且提取的候选框会在特征提取的时候会进行重复计算。
1.2 Fast-RCNN
Fast-RCNN为了解决特征提取重复计算问题而诞生,并且Fast-RCNN巧妙的将目标识别与定位放在同一个CNN中构成Multi-task模型。
Fast-RCNN先用Selective Search找出候选框,’而后整张图过一次CNN,然后用RoI Pooling,将对应候选框的部分做采样,得到相同长度的特征,又经过两层全连接层之后得到最终的特征。接着产生两个分支,一个分支给此特征分类,另一个分支回归此特征的候选框偏移。Fast-RCNN将分类和回归任务融合在一个模型中。
首先介绍Fast-RCNN核心算法模块,即RoI Pooling。基于图像分类任务的卷积神经网络首先将图片重新缩放并才裁剪到固定大小,如AlexNet和ResNet将图片缩放到256尺度并裁剪至224×224大小,然后将裁剪后的图像输入至网络训练。但对于检测任务,图像大小对检测性能有重要的影响。假设输入224×224大小的图像,则很有可能目标对象会因为分辨率过低而无法检测。Fast-RCNN的图像输入并不对图像大小限制,而实现这一点的关键所在,就是RoI Pooling网络层。RoIPooling层在任意尺度的卷及网络特征层,针对每一个候选框在特征层的映射区域提取固定尺度的特征,通过设置不同尺度的RoI Pooling可以提取多尺度特征。RoIPooling实现原理简单而言就是通过设定固定尺度计算出每一次采样的网格大小,然后最大值采样即可。RoI Pooling使用最大池化将任何有效的感兴趣区域内的特征转换为具有H×W(例如,7×7)的固定空间范围的小特征图,其中H和W是RoI Pooling层超参数,独立于任何特定的ROI。Fast-RCNN定义RoI是一个矩形窗口。每个ROI由定义其左上角(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义。RoI Max Pooling通过将h×w的ROI窗口转换成大小为h/H×w/W的子窗口的HxW网格,然后将每个子窗口中的值最大存储到相应的输出网格单元中。RoI Pooling是SPP-Net中使用的空间金字塔层的特殊情况,其中只有一个金字塔层。然后RoI pooling层得到的特征图送入几个全连接层中,并产生新的特征向量,这些特征向量分别用于一个softmax分类器(预测类别)和一个线性回归器上(用于调整边界框位置)来进行检测。在实现上是使用两个不同的全连接层,第一个全连接层有N+1个输出(N是类别总数,1是背景),表示各个类别的概率值;第二个全连接层有4N个输出,表示坐标回归值(tx,ty,tw,th),这个与R-CNN是一样的,每个类别都预测4个位置坐标值。
Fast R-CNN与R-CNN的另外的一个主要区别点是采用了softmax分类器而不是SVM分类器,而且训练过程是单管道的,因为Fast R-CNN将分类误差和定位误差合并在一起训练,定位误差采用smooth L1 而不是R-CNN中的L2。因此,整个网络可以端到端的训练。
Fast-RCNN提出之后,基于深度学习的目标检测框架问题已经非常清晰,就是能不能把潜在候选区域的提取纳入CNN框架内。Faster-RCNN就是基于此点并提出Region Proposal Net将潜在候选区域提取纳入CNN框架内。
Faster-RCNN模型引入了RPN(Region Proposal Network)直接产生候选区域。Faster-RCNN可以看成是RPN和Fast RCNN模型的组合体,即Faster-RCNN = RPN + Fast-RCNN。
对于RPN网络,先采用一个CNN模型(一般称为特征提取器)接收整张图片并提取特征图。然后在这个特征图上采用一个N×N(文中是3×3)的滑动窗口,对于每个滑窗位置都映射一个低维度的特征(如256-d)。然后这个特征分别送入两个全连接层,一个用于分类预测,另外一个用于回归。对于每个窗口位置一般设置k个不同大小或比例的先验框(anchors,default bounding boxes),这意味着每个位置预测k个候选区域(region proposals)。对于分类层,其输出大小是2k,表示各个候选区域包含物体或者是背景的概率值,而回归层输出4k个坐标值,表示各个候选区域的位置(相对各个先验框)。对于每个滑窗位置,这两个全连接层是共享的。因此,RPN可以采用卷积层来实现:首先是一个n×n卷积得到低维特征,然后是两个1×1的卷积,分别用于分类与回归。
RPN采用的是二分类,仅区分背景与物体,但是不预测物体的类别,即class-agnostic。由于要同时预测坐标值,在训练时,要先将先验框与ground-truth box进行匹配,原则为:(1)与某个ground-truth box的IoU最高的先验框;(2)与某个ground-truth box的IoU值大于0.7的先验框,只要满足一个,先验框就可以匹配一个ground-truth,这样该先验框就是正样本(属于物体),并以这个ground-truth为回归目标。对于那些与任何一个ground-truth box的IoU值都低于0.3的先验框,其认为是负样本。RPN网络是可以单独训练的,并且单独训练出来的RPN模型给出很多region proposals。由于先验框数量庞大,RPN预测的候选区域很多是重叠的,要先进行NMS(non-maximum suppression,IoU阈值设为0.7)操作来减少候选区域的数量,然后按照置信度降序排列,选择top-N个region proposals来用于训练Fast R-CNN模型。RPN的作用就是代替了Selective search的作用,但是速度更快,因此Faster R-CNN无论是训练还是预测都可以加速。
Faster-RCNN遵循如下训练过程:
第一步:使用ImageNe上预训练的模型初始化特征提取网络并训练RPN网络;
第二步:使用在ImageNet上预训练的模型初始化Fast-RCNN特征特征提取网络,使用步骤一中训练好的RPN网络产生的候选框作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
第三步:使用步骤二的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN,Fast-RCNN共享的特征提取网络参数的学习率设为0,即使学习RPN网络所特有的参数,固定特征提取网络。到此步,两个网络已经共享了所有的公共的卷积层;
第四步:仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,继续训练,微调Fast-RCNN特有的网络层,到此为止,RPN与Fast-RCNN网络完全共享参数,使用Fast-RCNN即可同时完成候选框提取和目标检测功能。
其问题主要在于对小尺度目标检测性能较差,不能有效的将候选区域的特征在深度CNN提取之后,有效保留小尺度的特征。分辨率有一定限制,同样检测速度还是较慢。
把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。同时,这个网络结构比较容易实现和训练,速度为5fps,可以很方便的应用到其他的领域,像目标检测,分割,和人物关键点检测等,并且比现有的算法效果都要好。
实例分割的难度在于要先对一张图片所有的目标进行正确的检测同时还要对每个示例进行分割。检测的目的是把每一个单个目标分类然后用bounding box标定出来,而实例分割的目的是区分每一个像素为不同的分类而不用区别不同的目标。Mask R-CNN使用了全连接卷积网络(FCN)来完成这个预测。这需要训练数据必须有像素级别的标注,而不是简单的边框。
Faster R-CNN:包含两个部分,提出RPN区域,找到目标框,对ROI进行分类。核心思想就是把图片区域内容送给深度网络,然后提取出深度网络某层的特征,并用这个特征来判断是什么物体,把背景也当成一种类别,故如果是判断是不是20个物体时,实际上在实现是判断21个类。最后再对是物体的区域进行微微调整。
Mask Representation:mask 对输入目标的空间布局进行编码。使用m*m的矩阵对每一个ROI进行预测而不是使用向量去进行预测,这样可以保证ROI当中的空间信息不会损失。
ROI Align:RoI Pooling就是实现从原图区域映射到卷积区域最后pooling到固定大小的功能,把该区域的尺寸归一化成卷积网络输入的尺寸。在归一化的过程当中,会存在ROI和提取的特征不重合现象出现,作者提出了ROI Align,使用ROI Align层对提取的特征和输入之间进行校准。 避免对每一个ROI边界或者块进行数字化。使用双线性内插法计算在ROI 块当中固定的四个采样位置得到的输入特征值并对结果进行融合。
因为FCN会精确预测每个像素的类别,就是输入图片中的每个像素都会在标注中对应一个类别。对于输入图片中的一个锚框,我们可以精确的匹配到像素标注中对应的区域。但是RoI池化是作用在卷积之后的特征上,其默认是将锚框做了定点化。例如假设选择的锚框是(x,y,w,h),且特征抽取将图片变小了16倍,就是如果原始图片是256×256,那么特征大小就是16×16。这时候在特征上对应的锚框就是变成了(x/16,y/16,h/16,w/16)。如果x,y,w,h中有任何一个不被16整除,那么就可能发生错位。同样,如果锚框的长宽不被池化大小整除,那么同样会定点化,从而带来错位。
通常这样的错位只是在几个像素之间,对于分类和边框预测影响不大。但对于像素级别的预测,这样的错位可能会带来大问题。RoI Align层类似于RoI池化层,但是去除掉了定点化步骤,就是移除了所有 。如果计算得到的锚框不是刚好在像素之间,那么我们就用四周的像素来线性插值得到这个点上的值。
对于一维情况,假设我们要计算x点的值f(x),那么我们可以用x左右的整点的值来插值:
我们实际要使用的是二维差值来估计f(x,y),我们首先x轴上差值得到f(x,y)和f(x,y+1),然后根据这两个值来差值得到f(x,y)。
Network Architecture :
分成三个部分,第一个是主干网络用来进行特征提取,第二个是头结构用来做边界框识别(分类和回归),第三个就是mask预测用来对每一个ROI进行区分。主干网络使用的是50层的深度残差网络ResNet50。
以上方法由于使用了特定的方法提取候选区,替代以滑动窗口方法遍历搜索的方式,需要候选区的数量较少,使基于卷积神经网络的目标检测在准确度和速度上都得到了较大提升。然而这些方法非常依赖候选区提取方法的准确度,如果检测场景复杂且目标不明显,候选区提取方法很难捕获到目标附近的区域,导致检测不到目标。
针对目标检测重新设计卷积神经网络的结构,提出了将卷积神经网络作为回归器,把整幅待检测图像看成一个候选区,直接输入卷积神经网络,回归目标在待检测图像中的位置信息。其中最具有代表性的是YOLO算法和SSD算法。
Yolo算法,其全称是You Only Look Once: Unified, Real-TimeObject Detection。Yolo算法采用一个单独的CNN模型实现end-to-end的目标检测,整个系统如图所示:首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比R-CNN算法,其是一个统一的框架,其速度更快,而且Yolo的训练过程也是end-to-end的。
YOLO的CNN网络将输入的图片分割成S×S网格,然后每个单元格负责去检测那些中心点落在该格子内的目标。每个单元格会预测B个边界框(bounding box)以及边界框的置信度(confidence score)。所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。前者记为Pr(object),当该边界框是背景时(即不包含目标),此时Pr(object)=0。而当该边界框包含目标时,Pr(object)=1。边界框的准确度可以用预测框与实际框(ground truth)的IOU(intersection over union,交并比)来表征,记为IOU(truth/pred) 。因此置信度可以定义为Pr(object)*IOU(truth/pred) 。YOLO的置信度是两个因子的乘积,预测框的准确度也反映在里面。边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。这样,每个边界框的预测值实际上包含5个元素:(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是置信度。
对于分类问题,对每一个单元格其还要给出预测出C个类别概率值,其表征的是由该单元格负责预测的边界框其目标属于各个类别的概率。但是这些概率值其实是在各个边界框置信度下的条件概率,即 Pr(class|object)。不管一个单元格预测多少个边界框,其只预测一组类别概率值,这是YOLO算法的一个缺点,在后来的改进版本中,YOLO9000是把类别概率预测值与边界框是绑定在一起的。同时,我们可以计算出各个边界框类别置信度(class-specific confidence scores):
边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏,一般会根据类别置信度来过滤网络的预测框。
YOLO的优点,Yolo采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以Yolo算法比较简洁且速度快。第二点由于Yolo是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。另外,Yolo的泛化能力强,在做迁移时,模型鲁棒性高。
YOLO的缺点,首先Yolo各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,Yolo的表现会不如人意。Yolo对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。Yolo的定位不准确也是很大的问题。
SSD全称 :Single Shot MultiBox Detector。在R-CNN系列模型里。Region Proposal和分类是分作两块来进行的。SSD则将其统一成一个步骤来使得模型更加简单并且速度更快。YOLO与SSD可以一步到位完成检测。相比YOLO,SSD采用CNN来直接进行检测,而不是像Yolo那样在全连接层之后做检测。它跟Faster R-CNN主要有两点不一样,1,对于锚框,不再首先判断它是不是含有感兴趣物体,再将正类锚框放入真正物体分类。SSD里我们直接使用一个C+1类分类器来判断它对应的是哪类物体,还是只是背景。我们不再有额外的回归器对边框再进一步预测,而是直接使用单个回归器来预测真实边框。2,SSD不只是对卷积神经网络输出的特征做预测,它会进一步将特征通过卷积和池化层变小来做预测。这样达到多尺度预测的效果。
(1)采用多尺度特征图用于检测
多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,如图下图所示,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。
(2)采用卷积进行检测
与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m×n×p的特征图,只需要采用3×3×p这样比较小的卷积核得到检测值。
(3)设置先验框
在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如下图所示,可以看到每个单元使用了5个不同的先验框,图片中不同物体采用最适合它们形状的先验框来进行训练。
(4)预测物体类别
对每一个锚框我们需要预测它是不是包含了我们感兴趣的物体,还是只是背景。使用一个3×3的卷积层来做预测,加上pad=1使用它的输出和输入一样。同时输出的通道数是num_anchors*(num_classes+1),每个通道对应一个锚框对某个类的置信度。假设输出是Y,那么对应输入中第n个样本的第(i,j)像素的置信值是在Y[n,:,i,j]里。具体来说,对于以(i,j)为中心的第a个锚框。通道 a*(num_class+1) 是其只包含背景的分数,通道 a*(num_class+1)+1+b 是其包含第b个物体的分数。
(5)预测边界框
因为真实的边界框可以是任意形状,我们需要预测如何从一个锚框变换成真正的边界框。这个变换可以由一个长为4的向量来描述。同上一样,我们用一个有num_anchors * 4通道的卷积。假设输出是Y,那么对应输入中第 n 个样本的第 (i,j) 像素为中心的锚框的转换在Y[n,:,i,j]里。具体来说,对于第a个锚框,它的变换在a*4到a*4+3通道里。
目标函数和常见的 Object Detection 的方法目标函数相同,分为两部分:计算相应的 default box 与目标类别的置信度以及相应的bounding box回归结果。
诸如R-CNN一类的依赖于候选的方法,由于使用了特定的方法提取候选区,替代以滑动窗口方法遍历搜索的方式,需要候选区的数量较少,使基于卷积神经网络的目标检测在准确度和速度上都得到了较大提升。然而这些方法非常依赖候选区提取方法的准确度,如检测场景复杂且目标不明显,候选区提取方法很难捕获到目标附近的区域,导致检测不到目标。目前都是通过实验来证明卷积神经网络的有效性,训练参数的设置大多依靠经验和实践,缺乏理论指导和量化分析; 另一方面,需要针对目标检测设计更加合理的网络结构,结合回复式神经网络提升检测效率,实现多尺度多类别的目标检测。R-CNN,Fast-RCNN,Faster-RCNN等,目标检测的准确度和精度具有优势,但是很耗时,速度较慢。而类似于SSD好YOLO等算法,其速度快,但是精度性能相对较差。
主要挑战存在如下几点:
1.小尺度目标检测。对于基于深度卷积神经网络的目标检测,由于深度网络顶层神经元感受野较大,对于小尺度目标信息保存较不完整,故而小尺度目标检测性能不高。
2.计算复杂度。目标检测算法计算复杂度取决于特征提取网络的前向传播计算时间。网络特征表达能力与网络深度存在较强关系,一般而言,在一定深度范围内,网络越深,表达能力越强,目标检测算法性能越好,但计算开销随之增大。
除此之外,深度卷积神经网络需要大量的人工标注数据进行训练,训练数据的获得对于目标检测算法同样至关重要。