二阶段目标检测算法(RCNN 家族)是目标检测中最经典的算法之一,有 R-CNN -> Fast R-CNN -> Faster R-CNN,每一代的变化以及目的性都明确,也是目标检测领域二阶段检测必会的算法之一。
如果想对目标检测有粗略的了解请查看这两篇文章:
目标检测综述
目标检测快速入门(含YOLO V1原理详解)
深度学习在目标检测应用
R-CNN 算法在 2014 年提出,可以说是历史性的算法,将深度学习应用于目标检测领域,相较于之前的目标检测方法,提升多达 30% 以上,大大提高了目标检测效果,改变了目标检测领域的研究方向。
早在 2010 年,深度学习已经初露锋芒,为什么在 2014 年目标检测才可以说正式应用深度学习技术呢?
这要从目标检测的场景以及目的上来分析。将问题简化一下,假设现在在做猫和狗的检测,要从图片中找到猫和狗的位置并且知道是什么分类。对于人工智能问题,往下细分可以分到 2 个方向,分类问题和回归问题。识别一张图片是猫还是狗是比较容易的事情,也可以准确的说是分类问题。
但是寻找到图片中不确定是否含有以及不确定具体数量的猫和狗的具体位置,这样的一个问题算作哪个类别呢?分类和回归问题都不好往上面靠,下面再把问题拆分一下。
目标检测中的分类与回归问题
假设,现在已经有框了,如图 1 所示,根据 4 个检测框内是否包含狗做分类,包含待检测目标越完整、背景越少则概率越高,下图中显然蓝色更加合适。
图1 目标检测示意
用蓝色的检测框来代表检测的物体还有个问题,就是这个框还有些许的偏差,离“完美”的检测框还是有一些距离,下面可以对我们的检测框进行矫正回归,如图 2 所示。白色的框是“完美检测框”,我们希望蓝色的检测框向白色的检测框从形状和位置上靠近,在某些特殊条件下,这种变换满足线性的变化,将边框的矫正问题转变成一个回归问题。
图2 边框矫正示意图
现在目标检测问题得到了解决,前提是已经存在可能存在待检测物体的预选框,剩下的问题是如何产生这些预选框。
R-CNN 算法就是采用上面所述的解决思路,采用的是选择性搜索 (Selective Search) 算法来选择预选框。
选择性搜索 (Selective Search) 提取候选区域
选择性搜索 (Selective Search) 是对上文中的选择区域过程进行的一个优化。Selective Search 算法在 13 年提出,这个算法其实是借鉴了层次聚类的思想,将层次聚类的思想应用到区域的合并上面。
首先使用 Felzenszwalb 等人在其论文 “Efficient Graph-Based Image Segmentation ” 中描述的方法生成输入图像的初始子候选区域。
然后将较小的相似区域递归组合为较大的相似区域。这里使用贪婪算法将相似的区域组合成更大的区域。
所谓贪婪算法就是从一组区域中,选择两个最相似的区域,将它们合并为一个较大的区域,重复上述步骤进行多次迭代,直至数量为我们想得到的候选区域数量。
选择性搜索的思想是基于图像中物体可能具有某些相似性或者连续性,因此采用子区域合并的方法进行提取候选边界框,合并过程根据子区域之间的颜色、纹理、体积等相似性进行区域合并,最后合并成我们想要的数量,然后再对子区域做外切矩形,得到的矩形就是候选区域。
图3 Selective Search示意图
R-CNN:Region with CNN feature (Region proposals + CNN)
R-CNN 算法流程可以分为 4 步:
使用选择性搜索 (Selective Search) 从图像中提取 1k-2k 个区域,将其称为候选区域。
将这 2000 个大小可能不同的候选区域处理成固定大小 (227,227),然后输入到卷积神经网络中做图像特征提取,生成 4096 维特征图作为第二步输出。
将特征图输入到一组 SVM 中,对候选区域是否存在要检测的目标进行分类,每个 SVM 都是一个二分类器,负责判断是否是存在某一个类 (yes/no),也就是说有多少个分类就有多少个SVM分类器。
除了预测候选区域内是否包含检测目标,该算法还预测四个值,这些值是偏移值,以提高边界框的精度。
图4 RCNN示意图
统一候选区域尺寸
通过前面的内容,可以在图片中找出想得到的候选区域,这个候选区域不一定都是同样的大小,如果进行简单的缩放到同一尺寸,会造成不同的拉扯程度,同一张图片选出的候选框进行了不同程度的变形会对结果造成影响。
选择性搜索最终产出的是矩形,论文中对矩形的缩放尝试了两种方式:各向同性缩放、各向异性缩放。
图5 RCNN-图像尺寸统一处理示意图
上图 5 中 B 列,直接在原始图片中,把边界扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用候选框中的颜色进行填充;C 列,先沿边框进行剪裁,然后用固定颜色填充成正方形,这个固定颜色为候选框内颜色均值;D 列方法很简单,不管候选区域的宽高比,直接进行缩放。
在此基础上,作者还尝试了加入 padding 处理,示意图中第一、三行是使用了padding=0 的效果,第二、四行使用了 padding=16 的效果。经过测试发现,使用各向异性缩放结合 padding=16 的精度最高,使 mAp 提高了 3 到 5 个百分点。
在网络结构方面,R-CNN 对比现在流行的网络显得略微“单薄”。方案选择上面有 2 个选择:Alexnet 与 VGG16。从表现来说 VGG16 的表现效果会更好一些,VGG16 有较小的卷积核以及较小的步长,泛化能力更强,但是计算量是 Alexnet 的 7 倍。
Fast R-CNN:Towards Real-Time Object Detection with Region Proposal Networks
站在现在的目标检测技术角度去看 R-CNN,可能会觉得这个模型表现的并不是很好,设计的也不够合理,但是在当时 R-CNN 将深度学习引入检测领域,一举将 PASCAL VOC 上的检测率从 35.1% 提升到 53.7%。
R-CNN 也存在着非常大的问题,首先三个模型在训练的方面会是个比较大的挑战,其次也是最主要的就是效率问题,计算 Region Proposals 和 features 平均所花时间:13s/image on a GPU;53s/image on a CPU。最后 2000 个左右的候选区域都需要经过网络处理,这就加大了计算代价。
已经定位了 R-CNN 的计算瓶颈,那么解决方法也就应运而生,R-CNN 的同一作者解决了R-CNN 的一些缺点并提出了新的算法,该算法称为 Fast R-CNN。
Fast R-CNN 算法发表于 2015 年,在同样使用 VGG16 网络作为 Backbone 的情况下,与 R-CNN 相比训练速度快 9 倍,推理时间快了 200 多倍,在 Pascal VOC 数据集上准确率也从 62% 提升到了66%。
整体思路类似于 R-CNN 算法,与之不同的是,不再用候选区域选出来再传入网络中,Fast R-CNN 将输入图像直接提供给 CNN 结构来生成卷积特征图,在原图中使用 SS(Selective Search) 算法提取候选区域,映射到特征图上形成特征矩阵,这样看似简单的调整顺序,从需要对 1k-2k 张图像提取特征转变成只需要对一张图像提取特征,极大的减少了执行时间。
但是新的问题也出来了,对特征图进行预选区域选择后产出的“小特征图”大小不一,无法一下放入网络中进行处理与预测。Fast R-CNN 借鉴了 SPP Net 的设计来解决这个问题。
SPP:Spatial Pyramid Pooling(空间金字塔池化)
SPP-Net 是出自 2015 年发表在 IEEE 上的论文:《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》,SPP 是其中核心的设计。
CNN 一般都有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。
所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行 crop(crop 就是从一个大图抠出网络输入大小的 patch,比如 227×227),或 warp(把一个边界框 bounding box 的内容 resize 成 227×227)等一系列操作以统一图片的尺寸大小,比如 224×224(ImageNet)、32×32(LenNet)等。
在 R-CNN 中,因为取出的区域大小各自不同,所以需要将每个 Region Proposal 缩放(warp)成统一的 227x227 的大小并输入到 CNN。但 warp/crop 这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度。如图 6 所示,原本“瘦高”的灯塔,warp 之后体型“发福”了。
图6 图像伸缩示意图
SPP Net 开拓了新的思路,原来的思路是在进入 CNN 中之前,将图像统一尺寸,而 CNN 本身可以适应任何尺寸,那么何不尝试在 CNN 结构之后再加入某种结构使后面的全连接层可以接收到固定的输出呢?
下图便是 R-CNN 与 SPP Net 检测流程的对比:
图7 R-CNN与SPP Net流程对比
在卷积结构与 FC 层之间介入金字塔池化层,保证下一层全连接层的输入固定。换句话说,在普通的 CNN 结构中,输入图像的尺寸往往是固定的(比如 224×224 像素),输出则是一个固定维数的向量。SPP Net 在普通的 CNN 结构中加入了 ROI 池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。
Fast R-CNN 中的 ROI Pooling
Fast R-CNN 使用 ROI Pooling 结构将 CNN 结构输出统一成 7×7 的结构,这个过程并不复杂,如图 8 所示,左面假设是特征图(为了可视化使用图像代替),将特征图划分成 7×7 的网格 ,对每一个网格用 Max Pooling 得到 7×7的 结构,图中使用一个 channel 数据示例,实际计算中对每个 channel 做如下处理。
图8 ROI Pooling示意图
在训练过程中,并不是所有 SS 算法获取的候选框都被使用,相对于选择的 1k-2k 个候选框,只需要其中的一小部分, 从中选择正样本和负样本,正样本指包含需要检测的目标,而负样本不包含需要检测的目标,也就是背景。
为什么要分正样本与负样本,对于选择出的 1k-2k 个候选区域,绝大部分只会有很小的一部分里面包含需要检测的物体,大部分都是背景,如果全部使用包含图像的样本进行训练,会对网络产生不好的影响。区分正负样本的条件是与 GT 的 IOU 大于 0.5 的为正样本,反之为负样本。
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Faster R-CNN 的设计思路
经过前面两个网络的积累 (Fast R-CNN 与 R-CNN),Ross B.Girshick 在 2016 年提出了新的改进版算法 Faster R-CNN,尽管 Fast R-CNN 已经对 R-CNN 的速度进行了大幅度的优化,但是在其结构中还是有明显的瓶颈,Fast R-CNN 的整体结构并不紧凑,先使用卷积神经网络结构进行特征提取,筛选候选区域再进行预测。
在 Faster R-CNN 中,引入了 Region Proposal Network(RPN),RPN 网络与检测网络共享完整的图像卷积特征,从而大大降低了 region proposal 的代价。RPN 是一个 FCN 结构的网络,可以同时预测每个位置上的对象范围和对象得分。RPN 网络不是单独的网络而是融合在整个网络之中,这样更容易训练出好的效果。
图9 Faster R-CNN结构图
代码结构
除了 RPN 结构,Faster R-CNN 与 Fast R-CNN 结构一致,这里不再过多的介绍基础,在前期对 Faster R-CNN 有初步的认识即可,下面给出 Faster R-CNN 实现的代码结构图。
图10 Faster R-CNN代码结构
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !