目标检测综述

本文作者 刘畅,公众号计算机视觉life编辑成员

前言

图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。 其中“定位”的意思是判断汽车在图片中的具体位置。
img
近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这可以在下图中看到。
img
本文对常见目标检测算法进行简要综述,并最后总结了目标检测算法方向的一些大V方便大家学习查看。

1. R-CNN

目标检测有两个主要任务:物体分类和定位,为了完成这两个任务,R-CNN借鉴了滑动窗口思想, 采用对区域进行识别的方案,具体是:

  1. 输入一张图片,通过指定算法从图片中提取 2000 个类别独立的候选区域(可能目标区域)
  2. 对于每个候选区域利用卷积神经网络来获取一个特征向量
  3. 对于每个区域相应的特征向量,利用支持向量机SVM 进行分类,并通过一个bounding box regression调整目标包围框的大小

1.1. 提取候选区域

R-CNN目标检测首先需要获取2000个目标候选区域,能够生成候选区域的方法很多,比如:

  1. objectness
  2. selective search
  3. category-independen object proposals
  4. constrained parametric min-cuts(CPMC)
  5. multi-scale combinatorial grouping
  6. Ciresan
    R-CNN 采用的是 Selective Search 算法。简单来说就是通过一些传统图像处理方法将图像分成很多小尺寸区域,然后根据小尺寸区域的特征合并小尺寸得到大尺寸区域,以实现候选区域的选取。

1.2. 提取特征向量

对于上述获取的候选区域,需进一步使用CNN提取对应的特征向量,作者使用模型AlexNet (2012)。(需要注意的是 Alexnet 的输入图像大小是 227x227,而通过 Selective Search 产生的候选区域大小不一,为了与 Alexnet 兼容,R-CNN 采用了非常暴力的手段,那就是无视候选区域的大小和形状,统一变换到 227x227 的尺寸)。
那么,该网络是如何训练的呢?训练过程如下:

  1. 有监督预训练:训练网络参数
    • 样本:ImageNet
    • 这里只训练和分类有关的参数,因为ImageNet数据只有分类,没有位置标注
    • 图片尺寸调整为227x227
    • 最后一层:4097维向量->1000向量的映射。
  2. 特定样本下的微调 :训练网络参数
    • 样本:
      RCNN样本
    • 采用训练好的AlexNet模型进行PASCAL VOC 2007样本集下的微调,学习率=0.001(PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签)
    • mini-batch为32个正样本和96个负样本(由于正样本太少)
    • 修改了原来的1000为类别输出,改为21维【20类+背景】输出。

1.3. SVM分类

通过上述卷积神经网络获取候选区域的特征向量,进一步使用SVM进行物体分类,关键知识点如下:

  1. 使用了一个SVM进行分类:向SVM输入特征向量,输出类别得分
  2. 用于训练多个SVM的数据集是ImageNet数据
  3. 将2000×4096维特征(2000个候选框,每个候选框获得4096的特征向量)与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,每个种类训练一个SVM,则有20个SVM),获得2000×20维矩阵表示每个建议框是某个物体类别的得分
  4. 分别对上述2000×20维矩阵中每列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些候选框;
    RCNN分类
    SVM训练:
  • 样本:

    RCNN-SVM训练

  • 由于SVM是二分类器,需要为每个类别训练单独的SVM;

  • SVM训练时,输入正负样本是在AlexNet CNN网络输出的4096维特征向量,输出为该类的得分

  • 由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本

1.4 边框修正

使用一个回归器进行边框回归:输入为卷积神经网络pool5层的4096维特征向量,输出为x、y方向的缩放和平移,实现边框的修正。在进行测试前仍需回归器进行训练。
回归器训练

  • 样本:

    RCNN边框回归样本
    在2014年R-CNN横空出世的时候,颠覆了以往的目标检测方案,精度大大提升。对于R-CNN的贡献,可以主要分为两个方面:

    1. 使用了卷积神经网络进行特征提取
    2. 使用bounding box regression进行目标包围框的修正
      但是,我们来看一下,R-CNN有什么问题:
    3. 耗时的selective search,对一张图像,需要花费2s
    4. 耗时的串行式CNN前向传播,对于每一个候选框,都需经过一个AlexNet提取特征,为所有的候选框提取特征大约花费47s
    5. 三个模块(CNN特征提取、SVM分类和边框修正)是分别训练的,并且在训练的时候,对于存储空间的消耗很大

2. Fast R-CNN

面对R-CNN的缺陷,Ross在2015年提出的Fast R-CNN进行了改进,下面我们来概述一下Fast R-CNN的解决方案:

img

  1. 首先还是采用selective search提取2000个候选框RoI
  2. 使用一个卷积神经网络对全图进行特征提取
  3. 使用一个RoI Pooling Layer在全图特征上摘取每一个RoI对应的特征
  4. 分别经过为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出)
    Fast R-CNN通过CNN直接获取整张图像的特征图,再使用RoI Pooling Layer在特征图上获取对应每个候选框的特征,避免了R-CNN中的对每个候选框串行进行卷积(耗时较长)。

2.1 RoI Pooling Layer

对于每个RoI而言,需要从共享卷积层获取的特征图上提取对应的特征,并且送入全连接层进行分类。因此,RoI Pooling主要做了两件事,第一件是为每个RoI选取对应的特征,第二件事是为了满足全连接层的输入需求,将每个RoI对应的特征的维度转化成某个定值。RoI Pooling示意图如下所示:ROI-POOLING

如上图所示,对于每一个RoI,RoI Pooling Layer将其映射到特征图对应位置,获取对应特征。另外,由于每一个RoI的尺度各不相同,所以提取出来的特征向量region proposal维度也不尽相同,因此需要某种特殊的技术来做保证输入后续全连接层的特征向量维度相同。ROI Pooling的提出便是为了解决这一问题的。其思路如下:

  • 将region proposal划分为目标H×W大小的分块

  • 对每一个分块中做MaxPooling(每个分块中含有多个网格,每个分块获取一个特征值)

  • 将所有输出值组合起来便形成固定大小为H×W的feature map

    pooling_sections
    out
    Fast R-CNN的贡献可以主要分为两个方面:

  1. 取代R-CNN的串行特征提取方式,直接采用一个CNN对全图提取特征(这也是为什么需要RoI Pooling的原因)。
  2. 除了selective search,其他部分都可以合在一起训练。
    Fast R-CNN也有缺点,体现在耗时的selective search还是依旧存在。

3. Faster R-CNN

Faster R-CNN 取代selective search,直接通过一个Region Proposal Network (RPN)生成待检测区域,这么做,在生成RoI区域的时候,时间也就从2s缩减到了10ms。下图是Faster R-CNN整体结构。

img
由上图可知,Faster R-CNN由共享卷积层、RPN、RoI pooling以及分类和回归四部分组成:

  1. 首先使用共享卷积层为全图提取特征feature maps
  2. 将得到的feature maps送入RPN,RPN生成待检测框(指定RoI的位置),并对RoI的包围框进行第一次修正
  3. RoI Pooling Layer根据RPN的输出在feature map上面选取每个RoI对应的特征,并将维度置为定值
  4. 使用全连接层(FC Layer)对框进行分类,并且进行目标包围框的第二次修正。
    尤其注意的是,Faster R-CNN真正实现了端到端的训练(end-to-end training)。Faster R-CNN最大特色是使用了RPN取代了SS算法来获取RoI,以下对RPN进行分析。

3.1 RPN

经典的检测方法生成检测框都非常耗时,如OpenCV adaboost使用滑动窗口+图像金字塔生成检测框;或如R-CNN使用SS(Selective Search)方法生成检测框。而Faster R-CNN则抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
首先来看看RPN的工作原理:

img
上图展示了RPN网络的具体结构。可以看到RPN网络实际分为2条支线,上面一条支线通过softmax来分类anchors获得前景foreground和背景background(检测目标是foreground),下面一条支线用于计算anchors的边框偏移量,以获得精确的proposals。而最后的proposal层则负责综合foreground anchors和偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
anchor:
简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的目标框(即anchor)。这9种初始anchor包含三种面积(128×128,256×256,512×512),每种面积又包含三种长宽比(1:1,1:2,2:1)。示意图如下所示:

img
由于共享特征图的大小约为40×60,所以RPN生成的初始anchor的总数约为20000个(40×60×9)。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。进而去判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,以及为属于前景的anchor进行第一次坐标修正。

img
判断前景或背景:
对于所有的anchors,首先需要判断anchor是是否为前景。对于第一个问题,RPN的做法是使用SoftmaxLoss直接训练,在训练的时候排除掉了超越图像边界的anchor;
边框修正:
如图绿色表示的是飞机的实际框标签(ground truth),红色的表示的其中一个候选区域(foreground anchor),即被分类器识别为飞机的区域,但是由于红色区域定位不准确,这张图相当于没有正确检测出飞机,所以我们希望采用一种方法对红色的框进行微调,使得候选区域和实际框更加接近:

img
对于目标框一般使用四维向量来表示(x,y,w,h)(x,y,w,h) ,分别表示目标框的中心点坐标、宽、高,我们使用AA 表示原始的foreground anchor,使用GG 表示目标的ground truth,我们的目标是寻找一种关系,使得输入原始的Anchor AA 经过映射到一个和真实框GG 更接近的回归窗口G′G′ ,即:

  • 给定:

  • 寻找一种变换FF ,使得



    img
    那么如何去计算F 呢?这里我们可以通过平移和缩放实现

  • 平移:

  • 缩放:


    上面公式中,我们需要学习四个参数,分别是


    其中


    表示的两个框中心距离的偏移量
    当输入的anchor A与G相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对目标框进行微调(注意,只有当anchors A和G比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了)。
    接下来就是如何通过线性回归获得


    线性回归就是给定输入的特征向量X ,学习一组参数W,使得线性回归的输出WX和真实值Y 的差很小。对于该问题,输入X是特征图,我们使用ϕ 表示,同时训练时还需要A到G变换的真实参数值:


    输出是


    那么目标函数可以表示为:


    其中ϕ(A) 是对应anchor的特征图组成的特征向量,ww 是需要学习的参数,d(A) 是得到预测值(表示x*,y,w,*h,也就是每一个变换对应一个上述目标函数),为了让预测值和真实值差距最小,代价函数如下:


    函数优化目标为:


    需要说明,只有在G和A比较接近时,才可近似认为上述线性变换成立,下面对于原文中,A与G之间的平移参数和尺度因子为:


    在得到每一个候选区域anchor A的修正参数之后,我们就可以计算出精确的anchor,然后按照物体的区域得分从大到小对得到的anchor排序,然后提出一些宽或者高很小的anchor(获取其它过滤条件),再经过非极大值抑制抑制,取前Top-N的anchors,然后作为proposals(候选框)输出,送入到RoI Pooling层。
    那么,RPN怎么实现呢?这个问题通过RPN的本质很好求解,RPN的本质是一个树状结构,树干是一个3×3的卷积层,树枝是两个1×1的卷积层,第一个1×1的卷积层解决了前后景的输出,第二个1×1的卷积层解决了边框修正的输出。来看看在代码中是怎么做的:



    从如上代码中可以看到,对于RPN输出的特征图中的每一个点,一个1×1的卷积层输出了18个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=18。另一个1×1的卷积层输出了36个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=36。那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。在作者进行RPN网络训练的时候,只使用了上述两类anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了128个前景anchor与128个背景anchor。

3.3. 分类和定位

Faster R-CNN中的RoI Pooling Layer与 Fast R-CNN中原理一样。在RoI Pooling Layer之后,就是Faster R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别(人,车,马等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以损失函数描述如下:


上式中u>=1表示RoI边框修正是对于非背景的RoI而言的,实验中,上式的λ取1。
在训练分类器和RoI边框修正时,步骤如下所示:

  1. 首先通过RPN生成约20000个anchor(40×60×9)。
  2. 对20000个anchor进行第一次边框修正,得到修订边框后的proposal。
  3. 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
  4. 忽略掉长或者宽太小的proposal。
  5. 将所有proposal按照前景分数从高到低排序,选取前12000个proposal。
  6. 使用阈值为0.7的NMS算法排除掉重叠的proposal。
  7. 针对上一步剩下的proposal,选取前2000个proposal进行分类和第二次边框修正。
    总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Faster R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),Faster R-CNN的总的loss函数描述如下:

4. Mask R-CNN

Mask R-CNN可以分解为如下的3个模块:Faster-RCNN、RoI Align和Mask。算法框架如下:

img
图6 Mask R-CNN算法框架
算法步骤:

  • 首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;

  • 然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;

  • 接着,对这个feature map中的每一点设定预定个的RoI,从而获得多个候选RoI;

  • 接着,将这些候选的RoI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;

  • 接着,对这些剩下的RoI进行RoIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);

  • 最后,对这些RoI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。
    Mask R-CNN是一个非常灵活的框架,可以增加不同的分支完成不同的任务,可以完成目标分类、目标检测、语义分割、实例分割、人体姿势识别等多种任务,如下图所示。

    imgimg

4.1. ROI Align

Mask R-CNN使用RoIAlign取代了Faster RCNN中的RoIPooling,故下文对RoIPooling和RoIAlign进行分析与比较

img
如上图所示,RoI Pooling和RoIAlign最大的区别是:前者使用了两次量化操作,而后者并没有采用量化操作,使用了线性插值算法,具体的解释如下所示。
RoI Pooling

img
如上图所示,为了得到固定大小(7X7)的feature map,我们需要做两次量化操作:1)图像坐标 — feature map坐标,2)feature map坐标 — RoI feature坐标。我们来说一下具体的细节,如图我们输入的是一张800x800的图像,在图像中有两个目标(猫和狗),狗的BB大小为665x665,经过VGG16网络后,我们可以获得对应的feature map,如果我们对卷积层进行Padding操作,我们的图片经过卷积层后保持原来的大小,但是由于池化层的存在,我们最终获得feature map 会比原图缩小一定的比例,这和Pooling层的个数和大小有关。在该VGG16中,我们使用了5个池化操作,每个池化操作都是2x2Pooling,因此我们最终获得feature map的大小为800/32 x 800/32 = 25x25(是整数),但是将狗的BB对应到feature map上面,我们得到的结果是665/32 x 665/32 = 20.78 x 20.78,结果是浮点数,含有小数,但是我们的像素值可没有小数,那么作者就对其进行了量化操作(即取整操作),即其结果变为20 x 20,在这里引入了第一次的量化误差;然而我们的feature map中有不同大小的ROI&#

  • 165
    点赞
  • 1127
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
目标检测是计算机视觉领域的重要任务,主要目标是在图像或视频中识别和定位特定物体的位置。近年来,随着深度学习的发展,目标检测取得了显著的进展。 综述2023年的目标检测技术包括以下几个方面: 1. 单阶段目标检测方法:传统的目标检测方法通常需要多个阶段,例如先生成候选框,再对框中的物体进行分类。而单阶段目标检测方法将多个步骤合并为一个网络,直接输出物体类别和位置信息。2023年,单阶段目标检测方法如YOLO、SSD等仍然是研究热点。 2. 多尺度和金字塔特征:为了解决目标在图像中尺度变化带来的挑战,研究者提出了一些多尺度和金字塔特征的方法。这些方法通过在不同层次提取特征信息来检测不同尺度的目标。 3. 端到端训练:传统的目标检测方法通常需要多个阶段的训练,而端到端训练则是指直接从原始图像到目标检测结果的一次性训练。这种方法能够简化模型的设计和训练流程,并且在一定程度上提高检测性能。 4. 弱监督目标检测:弱监督目标检测是指只使用图像级别的标签进行训练,而不需要精确的目标位置标注。这种方法在数据标注成本高昂的情况下具有重要的应用价值。 5. 目标检测数据集的发展:目标检测算法的发展离不开大规模的标注数据集。2023年,已经存在的一些常用数据集如COCO、VOC等将会持续更新和扩充,并且可能会涌现出一些新的数据集。 总的来说,2023年的目标检测技术将继续朝着更高的性能、更高的效率和更广泛的应用方向发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值