点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
本文转自:计算机视觉life
导读:目标检测(Object Detection)是计算机视觉领域的基本任务之一,学术界已有将近二十年的研究历史。近些年随着深度学习技术的火热发展,目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。从最初 年提出的 R-CNN、OverFeat,到后面的 Fast/Faster R-CNN、SSD、YOLO 系列,再到 年最近的 Pelee。短短不到五年时间,基于深度学习的目标检测技术,在网络结构上,从 two stage 到 one stage,从 bottom-up only 到 Top-Down,从 single scale network 到 feature pyramid network,从面向 PC 端到面向手机端,都涌现出许多好的算法技术,这些算法在开放目标检测数据集上的检测效果和性能都很出色。
本篇综述的出发点一方面是希望给检测方向的入门研究人员提供一个技术概览,帮助大家快速了解目标检测技术上下文;另一方面是给工业界应用人员提供一些参考,通过本篇综述,读者可以根据实际业务场景,找到合适的目标检测方法,在此基础上改进、优化甚至是进一步创新,解决实际业务问题。本文对其中的 27 篇论文进行介绍,这 27 篇论文涵盖了 以来,除 SSD、YOLO 和 R-CNN 系列之外的,所有引用率相对较高或是笔者认为具有实际应用价值的论文。R-CNN 系列、SSD 和 YOLO 相关的论文详解资源已经非常多,所以本文不再赘述。下图对这些方法进行了分类概括。
图1
下文中,我们针对每篇文章,从论文目标,即要解决的问题,算法核心思想以及算法效果三个层面进行概括。同时,我们也给出了每篇论文的出处,录用信息以及相关的开源代码链接,其中代码链接以作者实现和 mxnet 实现为主。
背景
图2
物体检测的任务是找出图像或视频中的感兴趣物体,同时检测出它们的位置和大小,是机器视觉领域的核心问题之一。
物体检测过程中有很多不确定因素,如图像中物体数量不确定,物体有不同的外观、形状、姿态,加之物体成像时会有光照、遮挡等因素的干扰,导致检测算法有一定的难度。进入深度学习时代以来,物体检测发展主要集中在两个方向:two stage 算法如 R-CNN 系列和 one stage 算法如 YOLO、SSD 等。两者的主要区别在于 two stage 算法需要先生成 proposal(一个有可能包含待检物体的预选框),然后进行细粒度的物体检测。而 one stage 算法会直接在网络中提取特征来预测物体分类和位置。
图3
基于深度学习的目标检测算法综述分为三部分:
Two/One stage 算法改进。这部分将主要总结在 two/one stage 经典网络上改进的系列论文,包括 Faster R-CNN、YOLO、SSD 等经典论文的升级版本。
解决方案。这部分我们归纳总结了目标检测的常见问题和近期论文提出的解决方案。
扩展应用、综述。这部分我们会介绍检测算法的扩展和其他综述类论文。
本综述分三部分,本文介绍第一部分。
创新内容、改进方向
Faster R-CNN 网络包括两个步骤:1. 使用 RPN(region proposal network) 提取 proposal 信息;2. 使用 R-CNN 对候选框位置进行预测和物体类别识别。本文主要介绍在 Faster R-CNN 基础上改进的几篇论文:R-FCN、R-FCN3000 和 Mask R-CNN。R-FCN 系列提出了 Position Sensitive(ps) 的概念,提升了检测效果。另外需要注明的是,虽然 Mask R-CNN 主要应用在分割上,但该论文和 Faster R-CNN 一脉相承,而且论文提出了 RoI Align 的思想,对物体检测回归框的精度提升有一定效果,故本篇综述也介绍了这篇论文。
R-FCN: Object Detection via Region-based Fully Convolutional Networks
论文链接:/abs/1605.06409
开源代码:/daijifeng001/R-FCN
录用信息:CVPR
论文目标
对预测特征图引入位置敏感分数图提增强征位置信息,提高检测精度。
核心思想
背景
Faster R-CNN 是首个利用 CNN 来完成 proposals 的预测的,之后的很多目标检测网络都是借助了 Faster R-CNN 的思想。而 Faster R-CNN 系列的网络都可以分成 2 个部分:
Fully Convolutional subnetwork before RoI Layer
RoI-wise subnetwork
第 1 部分就是直接用普通分类网络的卷积层来提取共享特征,后接一个 RoI Pooling Layer 在第 1 部分的最后一张特征图上进行提取针对各个 RoIs 的特征图,最后将所有 RoIs 的特征图都交由第 2 部分来处理(分类和回归)。第二部分通常由全连接层组层,最后接 2 个并行的 loss 函数:Softmax 和 smoothL1,分别用来对每一个 RoI 进行分类和回归。由此得到每个 RoI 的类别和归回结果。其中第 1 部分的基础分类网络计算是所有 RoIs 共享的,只需要进行一次前向计算即可得到所有 RoIs 所对应的特征图。
第 2 部分的 RoI-wise subnetwork 不是所有 RoIs 共享的,这一部分的作用就是给每个 RoI 进行分类和回归。在模型进行预测时基础网络不能有效感知位置信息,因为常见的 CNN 结构是根据分类任务进行设计的,并没有针对性的保留图片中物体的位置信息。而第 2 部分的全连阶层更是一种对于位置信息非常不友好的网络结构。由于检测任务中物体的位置信息是一个很重要的特征,R-FCN 通过提出的位置敏感分数图(position sensitive score maps)来增强网络对于位置信息的表达能力,提高检测效果。
网络设计
position-sensitive score map
图4
图 4 展示的是 R-FCN 的网络结构图,展示了位置敏感得分图 (position-sensitive score map) 的主要设计思想。如果一个 RoI 含有一个类别 c 的物体,则将该 RoI 划分为 k x k 个区域,分别表示该物体的各个相应部位。其每个相应的部位都由特定的特征图对其进行特征提取。R-FCN 在 、共享卷积层的最后再接上一层卷积层,而该卷积层就是位置敏感得分图 position-sensitive score map。其通道数 channels=k x k x (C+1)。C 表示物体类别种数再加上 1 个背景类别,每个类别都有 k x k 个 score maps 分别对应每个类别的不同位置。每个通道分别负责某一类的特定位置的特征提取工作。
Position-sensitive RoI pooling
位置敏感 RoI 池化操作了(Position-sensitive RoI pooling)如下图所示:
图5
该操作将每个 RoIs 分为 k x k 个小块。之后提取其不同位置的小块相应特征图上的特征执行池化操作,下图展示了池化操作的计算方式。
图6
得到池化后的特征后,每个 RoIs 的特征都包含每个类别各个位置上的特征信息。对于每个单独类别来讲,将不同位置的特征信息相加即可得到特征图对于该类别的响应,后面即可对该特征进行相应的分类。
position-sensitive regression
在位置框回归阶段仿照分类的思路,将特征通道数组合为 4 x k x k 的形式,其中每个小块的位置都对应了相应的通道对其进行位置回归的特征提取。最后将不同小块位置的四个回归值融合之后即可得到位置回归的响应,进行后续的位置回归工作。
网络训练
position-sensitive score map 高响应值区域
在训练的过程中,当 RoIs 包涵物体属于某类别时,损失函数即会使得该 RoIs 不同区域块所对应的响应通道相应位置的特征响应尽可能的大,下图展示了这一过程,可以明显的看出不同位置的特征图都只对目标相应位置的区域有明显的响应,其特征提取能力是对位置敏感的。
图 7
训练和测试过程
使用如上的损失函数,对于任意一个 RoI,计算它的 Softmax 损失,和当其不属于背景时的回归损失。因为每个 RoI 都被指定属于某一个 GT box 或者属于背景,即先让 GT box 选择与其 IoU 最大的那个 RoI,再对剩余 RoI 选择与 GT box 的 IoU>0.5 的进行匹配,而剩下的 RoI 全部为背景类别。当 RoI 有了 label 后 loss 就可以计算出来。这里唯一不同的就是为了减少计算量,作者将所有 RoIs 的 loss 值都计算出来后,对其进行排序,并只对最大的 128 个损失值对应的 RoIs 进行反向传播操作,其它的则忽略。并且训练策略也是采用的 Faster R-CNN 中的 4-step alternating training 进行训练。在测试的时候,为了减少 RoIs 的数量,作者在 RPN 提取阶段就将 RPN 提取的大约 2W 个 proposals 进行过滤:
去除超过图像边界的 proposals
使用基于类别概率且阈值 IoU=0.3 的 NMS 过滤
按照类别概率选择 top-N 个 proposals
在测试的时候,一般只剩下 300 个 RoIs。并且在 R-FCN 的输出 300 个预测框之后,仍然要对其使用 NMS 去除冗余的预测框。
算法效果
图 8
图 8 比较了 Faster-R-CNN 和 R-FCN 的 mAP 值和监测速度,采用的基础网络为 ResNet-101,测评显卡为 Tesla K40。
R-FCN-3000 at 30fps: Decoupling Detection and Classification
论文链接:/abs/1712.01802
开源代码:/
录用信息:/
论文目标
YOLO9000 将检测数据集和分类数据集合并训练检测模型,但 r-fcn-3000 仅采用具有辅助候选框信息的 ImageNet 数据集训练检测分类器。
如果使用包含标注辅助信息(候选框)的大规模分类数据集,如 ImageNet 数据集,进行物体检测模型训练,然后将其应用于实际场景时,检测效果会是怎样呢?how would an object detector perform on "detection"datasets if it were trained on classification datasets with bounding-box supervision?
核心思想
r-fcn-3000 是对 r-fcn 的改进。上文提到,r-fcn 的 ps 卷积核是 per class 的,假设有 C 个物体类别,有 K*K 个 ps 核,那么 ps 卷积层输出 K*K*C 个通道,导致检测的运算复杂度很高,尤其当要检测的目标物体类别数较大时,检测速度会很慢,难以满足实际应用需求。
为解决以上速度问题,r-fcn-3000 提出,将 ps 卷积核作用在超类上,每个超类包含多个物体类别,假设超类个数为 SC,那么 ps 卷积层输出 K*KSC 个通道。由于 SC 远远小于 C,因此可大大降低运算复杂度。特别地,论文提出,当只使用一个超类时,检测效果依然不错。算法网络结构如下:
图 9
上图可以看出,与 r-fcn 类似,r-fcn-3000 也使用 RPN 网络生成候选框(上图中虚线回路);相比 r-fcn,r-fcn-3000 的网络结构做了如下改进:
r-fcn-3000 包含超类(上图中上半部分)和具体类(上图中下半部分)两个卷积分支。
超类卷积分支用于检测超类物体,包含分类(超类检测)和回归(候选框位置改进)两个子分支;注意上图中没有画出用于候选框位置改进的 bounding-box 回归子分支;回归分支是类别无关的,即只确定是否是物体。
具体类卷积分支用于分类物体的具体类别概率,包含两个普通 CNN 卷积层。
最终的物体检测输出概率由超类卷积分支得到的超类类概率分别乘以具体类卷积分支输出的具体类别概率得到。引入超类和具体类两个卷积分支实现了“物体检测”和“物体分类”的解耦合。超类卷积分支使得网络可以检测出物体是否存在,由于使用了超类,而不是真实物体类别,大大降低了运算操作数。保证了检测速度;具体类分支不检测物体位置,只分类具体物体类别。
超类生成方式:对某个类别 j 的所有样本图像,提取 ResNet-101 最后一层 维特征向量,对所有特征项向量求均值,作为该类别的特征表示。得到所有类别的特征表示进行 K-means 聚类,确定超类。
算法效果
在 imagenet 数据集上,检测 mAP 值达到了 34.9%。使用 nvidia p6000 GPU,对于 375x500 图像,检测速度可以达到每秒 30 张。在这种速度下,r-fcn-3000 号称它的检测准确率高于 YOLO 18%。
此外,论文实验表明,r-fcn-3000 进行物体检测时具有较强的通用性,当使用足够多的类别进行训练时,对未知类别的物体检测时,仍能检测出该物体位置。如下图:
图 10
在训练类别将近 3000 时,不使用目标物体进行训练达到的通用预测 mAP 为 30.7%,只比使用目标物体进行训练达到的 mAP 值低 0.3%。
Mask R-CNN
论文链接:
/abs/1703.06870
开源代码:
/TuSimple/mx-maskrcnn
录用信息:CVPR
论文目标
解决 RoIPooling 在 Pooling 过程中对 RoI 区域产生形变,且位置信息提取不精确的问题。
通过改进 Faster R-CNN 结构完成分割任务。
核心思想
使用 RoIAlign 代替 RoIPooling,得到更好的定位效果。
在 Faster R-CNN 基础上加上 mask 分支,增加相应 loss,完成像素级分割任务。
概述
Mask R-CNN 是基于 Faster R-CNN 的基础上演进改良而来,不同于 Faster R-CNN,Mask R-CNN 可以精确到像素级输出,完成分割任务。此外他们的输出也有所不同。Faster R-CNN 输出为种类标签和 box 坐标,而 Mask R-CNN 则会增加一个输出,即物体掩膜 (object mask)。
网络结构介绍
Mask R-CNN 结构如下图:
图 11
Mask R-CNN 采用和 Faster R-CNN 相同的两个阶段,具有相同的第一层 (即 RPN),第二阶段,除了预测种类和 bbox 回归,并且并行的对每个 RoI 预测了对应的二值掩膜 (binary mask)。
Mask R-CNN 详细改进
RoIAlign
Faster R-CNN 采用的 RoIPooling,这样的操作可能导致 feature map 在原图的对应位置与真实位置有所偏差。如下图:
图 12
而通过引入 RoIAlign 很大程度上解决了仅通过 Pooling 直接采样带来的 Misalignment 对齐问题。
图 13:RoIPooling
图 14:RoIAlign
RoIPooling 会对区域进行拉伸, 导致区域形变。RoIAlign 可以避免形变问题。具体方式是先通过双线性插值到 14 x 14,其次进行双线性插值得到蓝点的值,最后再通过 max Pooling 或 average pool 到 7 x 7。
图 15
多任务损失函数
Mask R-CNN 的损失函数可表示为:
掩膜分支针对每个 RoI 产生一个 K x M xM 的输出, 即 K 个 M x M 的二值的掩膜输出。其中 K 为分类物体的类别数目。依据预测类别输出,只输出该类对应的二值掩膜,掩膜分支的损失计算如下示意图:
图 16
mask branch 预测 K 个种类的 M x M 二值掩膜输出。
依据种类预测分支 (Faster R-CNN 部分) 预测结果:当前 RoI 的物体种类为 i。
RoI 的平均二值交叉损失熵(对每个像素点应用 Sigmoid 函数)即为损失 。
此外作者发现使用 Sigmoid 优于 Softmax ,Sigmoid 可以避免类间竞争。
算法效果
图 17
体现了在 COCO 数据集上的表现效果。
One stage
提到 one stage 算法就必须提到 OverFeat,OverFeat 网络将分类、定位、检测功能融合在一个网络之中。随后的 YOLO 和 SSD 网络,都是很经典的 one stage 检测算法。
YOLO 论文作者对原始 YOLO 网络进行了改进,提出了 YOLO9000 和 YOLOv3。YOLO9000 号称可以做到更好,更快,更强。其创新点还包括用小规模(指类别)检测标注数据集 + 大规模分类标注数据集训练通用物体检测模型。YOLOv3 是作者的一个 technical report,主要的工作展示作者在 YOLO9000 上的改进。另外本综述还将介绍新论文 Object detection at 200 Frames Per Second,这篇论文在 YOLO 的基础上进行创新,能在不牺牲太多准确率的情况下达到 200FPS(使用 GTX1080)。
SSD 算法是一种直接预测 bounding box 的坐标和类别的 object detection 算法,利用不同分辨率卷积层的 feature map,可以针对不同 scale 的物体进行检测。本篇综述中主要介绍 DSSD(原始作者的改进版本)和 DSOD 这两篇论文。
YOLO9000: better, faster, stronger
论文链接:
/abs/1612.0824
开源代码:/pjreddie/darknet
/zhreshold/mxnet-yolo(MXNet 实现)
录用信息:CVPR
论文目标
论文目标是要解决包含大规模物体类别的实际应用场景中的实时目标检测。实际应用场景中,目标检测应满足两个条件:1. 检测速度满足实际场景需求;2. 覆盖物体类别满足实际场景需求。实际场景包含很多类别的物体,而这些类别物体的标注数据很难拿到,本论文提出使用小规模(指类别)检测标注数据集 + 大规模分类标注数据集训练通用物体检测模型。
核心思想
YOLO9000 是在 YOLO 基础上的改进,相比 YOLO,YOLO9000 号称可以做到更好,更快,更强。下面从这三个方面介绍 YOLO9000 如何做到这三点。YOLO 相关的论文解读可以参考:/p/25236464
更好
准确率提升。相比 R-CNN 系列,YOLOv1 的召回率和物体位置检测率较低,YOLO9000 做了如下七点改进对其进行提升。
加入 BN 层。在所有的卷积层后加入 BN 操作,去掉所有 dropout 层。
使用高分辨率训练得到的分类模型 pretrain 检测网络。YOLOv1 使用 224x224 训练得到的分类模型 pretrain,而 YOLO9000 直接使用 448x448 训练得到的分类模型 pretrain 检测网络。
使用卷积层预测 anchor box 位置。YOLOv1 基于输入图像的物理空间划分成 7x7 的网格空间,每个网格最多对应两个候选预测框,因此每张图像最多有 98 个 bounding box,最后接入全连接层预测物体框位置。而 YOLO9000 移除全连接层,使用 anchor box 预测候选框位置,大大增加了每张图片的候选框个数。这个改进将召回率由 81% 提高到 88%,mAP 由 69.5% 稍微降低到 69.2%。同时,由于去掉了全连接层,YOLO9000 可以支持检测时不同分辨率的图像输入。
kmeans 聚类确定候选框形状。使用 k-means 对训练数据集中的物体框的分辨率和比例进行聚类,确定 anchor box 的形状。为避免物体大小引起的统计误差,YOLO9000 使用 IoU 而不是欧氏距离来作为距离度量方式。
预测“候选框相对于图像的内部偏移”。以往 RPN 网络,通过回归候选框相对于当前 anchor box 的偏移来定位候选框的位置,由于偏移相对于 anchor box 外部,所以取值范围是不受限的,导致训练的时候难以收敛。因此 YOLO9000 采用与 YOLO 类似的方式,预测候选框相对于图像左上角的位置偏移,并将偏移量归一化到 0-1 区间,解决了训练难收敛问题。
使用更精细的特征。YOLOv1 提取 13x13 的特征层进行后续物体检测,对于小物体的检测效果并不友好。为解决这个问题,YOLO9000 将前一层 26x26 的特征与 13x13 层的特征进行通道 concatenation。如 26x26x512 的 feature map 被拆分成 13x13x2048,然后同后面的 13x13 特征层进行 concatenation。mAP 提升 1%。
多尺度图像训练。YOLO9000 采用不同分辨率的图像进行模型迭代训练,增强模型对多尺度图像的预测鲁棒性。
更快
YOLOv1 的 basenet 基于 GoogleNet 改进得到,计算复杂度大概是 VGG16 的 1/4,但在 imagenet 上 224x224 图像的 top-5 分类准确率比 vgg16 低 2%。YOLO9000 提出一个全新的 basenet,号称 darknet-19,包含 19 个卷积层和 5 个 max pooling 层,详细网络结构见论文,计算复杂度比 YOLOv1 进一步减少了 34%,imagenet 上 top-5 准确率提升了 3.2%。
更强
更强是指在满足实时性需求的前提下,能检测出的物体类别数更多,范围更大。YOLO9000 提出使用词树“wordtree”,将分类数据集和检测数据集合并,进行模型训练。反向传播时,检测样本的训练 loss 用于计算和更新整个网络的模型参数;而分类样本的训练 loss 仅用于更新与分类相关的网络层模型参数。这样以来,检测数据集训练网络学到如何检测出物体(是否是物体,位置),而分类数据集使得网络识别出物体类别。
算法效果
下图给出了 YOLOv2 和对比算法的准确率和运行时间的综合性能结果。可以看出 YOLOv2 在保证准确率的同时,可以达到超过 30fps 的图像检测速度。相比 SSD512 和 Faster R-CNN(使用 ResNet),YOLOv2 在准确率和运行性能上都更胜一筹(图中左边第一个蓝圈)。
图 18
YOLOv3: an incremental improvement
论文链接:/abs/1804.02767
开源代码:/pjreddie/darknet
录用信息:/
原文是 4 页 technical report, 年 4 月在 arxiv 放出
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三+上海交大+视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
如果觉得《综述 | 基于深度学习的目标检测算法》对你有帮助,请点赞、收藏,并留下你的观点哦!