本文链接:
一, 研究意义
卷积神经网络 (CNN) 由于其强大的特征提取能力, 近年来被广泛用于计算机视觉领域. 1998 年 Yann LeCun 等提出的 LeNet-5 网络结构, 该结构使得卷积神经网络可以端到端的训练, 并应用于文档识别. LeNet-5 结构是 CNN 最经典的网络结构, 而后发展的卷积神经网络结构都是由此版本衍生而来.
在过去六年中, 由于深度学习和卷积网络的发展和进步, 基于图像的目标检测和分类能力已经大大提高. 而目标检测是计算机视觉领域一个重要的研究方向, 是众多高级任务的必备前提, 包括场景理解, 事件识别等. 目前, 目标检测也广泛用于安全监控, 自动驾驶, 人机交互, 增强现实等众多领域. 目标检测对计算机视觉和产业界实际应用都有十分重要的意义.
然而, 由于视角, 遮挡, 姿态等因素引起目标发生形变, 导致目标检测成为一个具有挑战性的任务. 设计高准确率高效率的目标检测算法仍具有重大意义.
二, 研究现状
如今, 基于卷积神经网络的目标检测已经超越传统目标检测方法, 成为当前目标检测的主流方法. 本文根据卷积神经网络的使用方式, 将基于卷积神经网络的目标检测分为两大类: 基于分类的卷积神经网络目标检测和基于回归的卷积神经网络目标检测.
1. 基于分类的卷积神经网络目标检测
基于分类的 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 框架内.
1.3 Faster-RCNN
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 提取之后, 有效保留小尺度的特征. 分辨率有一定限制, 同样检测速度还是较慢.
1.4 Mask RCNN
把原有的 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.
以上方法由于使用了特定的方法提取候选区, 替代以滑动窗口方法遍历搜索的方式, 需要候选区的数量较少, 使基于卷积神经网络的目标检测在准确度和速度上都得到了较大提升. 然而这些方法非常依赖候选区提取方法的准确度, 如果检测场景复杂且目标不明显, 候选区提取方法很难捕获到目标附近的区域, 导致检测不到目标.
2 基于回归的卷积神经网络目标检测
针对目标检测重新设计卷积神经网络的结构, 提出了将卷积神经网络作为回归器, 把整幅待检测图像看成一个候选区, 直接输入卷积神经网络, 回归目标在待检测图像中的位置信息. 其中最具有代表性的是 YOLO 算法和 SSD 算法.
2.1 YOLO 算法
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 的定位不准确也是很大的问题.
2.2 SSD 算法
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. 计算复杂度. 目标检测算法计算复杂度取决于特征提取网络的前向传播计算时间. 网络特征表达能力与网络深度存在较强关系, 一般而言, 在一定深度范围内, 网络越深, 表达能力越强, 目标检测算法性能越好, 但计算开销随之增大.
除此之外, 深度卷积神经网络需要大量的人工标注数据进行训练, 训练数据的获得对于目标检测算法同样至关重要.
来源: http://www.bubuko.com/infodetail-3286613.html