深度学习 之 目标检测算法 RCNN、Fast RCNN、Faster RCNN 的基本思想

目录

前言

传统目标检测

基于“Region proposal”的目标检测算法

基于深度学习的目标检测算法

OverFeat

R-CNN: R-CNN系列的开山之作

Fast R-CNN: 共享卷积运算

Faster R-CNN: 两阶段模型的深度化


前言

图像分类检测分割是计算机视觉领域的三大任务。即图像理解的三个层次:

  1. 分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别(string)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是最权威的评测集,每年的ILSVRC催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务。
  2. 检测(Detection)。分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得这一目标的类别信息位置信息。相比分类,检测给出的是对图片前景背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因而,检测模型的输出是一个列表,列表的每一项使用一个数据组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。
  3. 分割(Segmentation)。分割包括语义分割(semantic segmentation)和实例分割(instance segmentation),前者是对前背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。

普通的深度学习监督算法主要用来做分类,分类的目标是识别出下图中左一是一只猫。而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位目标检测等任务。其中目标定位是不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记,如下图左二所示。而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位。如下图左三,得到的结果是几只不同的动物,他们的位置如下图左三中不同颜色的框所示。最后一张图即分割。

简单来说,分类、定位和检测的区别如下:

  • 分类:是什么?
  • 定位:是什么?在哪里?(单个目标)
  • 检测:分别是什么?在哪里?(多个目标)

传统目标检测

目标检测对于人类来说并不困难,通过对图片中不同颜色模块的感知很容易定位并分类出其中目标物体,但对于计算机来说,面对的是RGB像素矩阵,很难从图像中直接得到狗和猫这样的抽象概念并定位其位置,再加上有时候多个物体和杂乱的背景混杂在一起,目标检测更加困难。但这难不倒科学家们,在传统视觉领域,目标检测就是一个非常热门的研究方向,一些特定目标的检测,比如人脸检测和行人检测已经有非常成熟的技术了。普通的目标检测也有过很多的尝试,但是效果总是差强人意。

传统的目标检测一般使用滑动窗口的框架,主要包括三个步骤

  1. 利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;
  2. 提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征等;
  3. 利用分类器进行识别,比如常用的SVM模型。

目标检测模型的主要性能指标是检测准确度速度,对于准确度,目标检测要考虑物体的定位准确度,而不单单是分类准确度。一般情况下,two-stage算法在准确度上有优势,而one-stage算法在速度上有优势。准确度(accuracy)和速度(speed)是一对矛盾体,如何更好地平衡它们一直是目标检测算法研究的一个重要方向。

基于“Region proposal”的目标检测算法

Region Proposal(候选区域),预先找出图中目标可能出现的位置,利用图像中的纹理、边缘、颜色等信息,保证在选取较少窗口(几千甚至几百个)的情况下保持较高的召回率(IoU,Intersection-over-Union)。

  • IoU 的定义

物体检测需要定位出物体的bounding box,如下图所示,不仅要定位出车辆的bounding box,还要识别出bounding box里面的物体就是车辆。由于算法不可能百分百跟人工标注的数据完全匹配,故存在一个定位精度评价公式:IoU(介于0-1之间)用于评价 bounding box 的定位精度。IoU越高,预测框的位置越准确。因而,在评估预测框时,通常会设置一个IoU阈值(如0.5),只有当预测框与真实框的IoU值大于这个阈值时,该预测框才被认定为真阳性(True Positive, TP),反之就是假阳性(False Positive,FP)。

IoU定义了两个bounding box的重叠度,如下图所示:

矩形框A、B的重合度 IoU 计算公式为:

                                                            IoU=(A\cap B)/(A\cup B)

也就是矩形框A、B的重叠面积占A、B 并集的面积比例:

                                                            IoU=S_{I}/(S_{A}+S_{B}+S_{I})

Region Proposal 方法比传统的滑动窗口方法获取的质量要更高。

常用的Region Proposal 方法有:Selective Search(SS,选择性搜索)、Edge Boxes(EB)。

基于Region Proposal 目标检测算法的步骤如下:

目标检测的第一步是要做区域提名(Region Proposal),也就是找出可能的感兴趣区域(Region Of Interest, ROI)。

边框回归(Bouding Box Regression):是对RegionProposal进行纠正的线性回归算法,目的是为了让Region Proposal提取到的窗口与目标窗口(Ground Truth)更加吻合。

区域提名可能的方法有:

  1. 滑动窗口。滑动窗口本质上就是穷举法,利用不同的尺度和长宽比把所有可能的大大小小的块都穷举出来,然后送去识别,识别出来概率大的就留下来。很明显,这样的方法复杂度太高,产生了很多的冗余候选区域,在现实当中不可行。
  2. 规则块。在穷举法的基础上进行了一些剪枝,只选用固定的大小和长宽比。这在一些特定的应用场景是很有效的,比如拍照搜题APP小猿搜题中的汉字检测,因为汉字方方正正,长宽比大多比较一致,因此用规则块做区域提名是一种比较合适的选择。但是对于普通的目标检测来说,规则块依然需要访问很多的位置,复杂度高。
  3. 选择性搜索。从机器学习的角度来说,前面的方法召回是不错了,但是精度差强人意,所以问题的核心在于如何有效地去除冗余候选区域。其实冗余候选区域大多是发生了重叠,选择性搜索利用这一点,自底向上合并相邻的重叠区域,从而减少冗余。

区域提名并不只有以上所说的三种方法,实际上这块是非常灵活的,因此变种也很多。

#选择性搜索算法
输入: 一张图片 
输出:候选的目标位置集合L
算法:
1: 利用过切分方法得到候选的区域集合R = {r1,r2,…,rn}
2: 初始化相似集合S = ϕ
3: foreach 邻居区域对(ri,rj) do
4:     计算相似度s(ri,rj)
5:     S = S  ∪ s(ri,rj)
6: while S not=ϕ do
7:     得到最大的相似度s(ri,rj)=max(S)
8:     合并对应的区域rt = ri ∪ rj
9:     移除ri对应的所有相似度:S = S\s(ri,r*)
10:    移除rj对应的所有相似度:S = S\s(r*,rj)
11:    计算rt对应的相似度集合St
12:    S = S ∪ St
13:    R = R ∪ rt
14: L = R中所有区域对应的边框

从算法不难看出,R中的区域都是合并后的,因此减少了不少冗余,相当于准确率提升了,但是别忘了我们还需要继续保证召回率,因此算法1中的相似度计算策略就显得非常关键了。如果简单采用一种策略很容易错误合并不相似的区域,比如只考虑轮廓时,不同颜色的区域很容易被误合并。选择性搜索采用多样性策略来增加候选区域以保证召回,比如颜色空间考虑RGB、灰度、HSV及其变种等,相似度计算时既考虑颜色相似度,又考虑纹理、大小、重叠情况等。

总体上,选择性搜索是一种比较朴素的区域提名方法,被早期的基于深度学习的目标检测方法(包括Overfeat和R-CNN等)广泛利用,但被当前的新方法弃用了。

基于深度学习的目标检测算法

OverFeat

OverFeat是用CNN统一来做分类、定位和检测的经典之作,作者是深度学习大神之一——Yann Lecun在纽约大学的团队。OverFeat也是ILSVRC 2013任务3(分类+定位)的冠军得主。

OverFeat的核心思想有三点:

  1. 区域提名:结合滑动窗口和规则块,即多尺度(multi-scale)的滑动窗口;
  2. 分类和定位:统一用CNN来做分类和预测边框位置,模型与AlexNet类似,其中1-5层为特征抽取层,即将图片转换为固定维度的特征向量,6-9层为分类层(分类任务专用),不同的任务(分类、定位、检测)公用特征抽取层(1-5层),只替换6-9层;
  3. 累积:因为用了滑动窗口,同一个目标对象会有多个位置,也就是多个视角;因为用了多尺度,同一个目标对象又会有多个大小不一的块。这些不同位置和不同大小块上的分类置信度会进行累加,从而使得判定更为准确。

OverFeat的关键步骤有四步:

  1. 利用滑动窗口进行不同尺度的区域提名,然后使用CNN模型对每个区域进行分类,得到类别和置信度。不同缩放比例时,检测出来的目标对象数量和种类存在较大差异;
  2. 利用多尺度滑动窗口来增加检测数量,提升分类效果;
  3. 用回归模型预测每个对象的位置,从图4中来看,放大比例较大的图片,边框数量也较多;
  4. 边框合并。

Overfeat是CNN用来做目标检测的早期工作,主要思想是采用了多尺度滑动窗口来做分类、定位和检测,虽然是多个任务但重用了模型前面几层,这种模型重用的思路也是后来R-CNN系列不断沿用和改进的经典做法。当然Overfeat也是有不少缺点的,至少速度和效果都有很大改进空间,后面的R-CNN系列在这两方面做了很多提升。

深度学习的目标检测算法主要分为两类,如下图: 

R-CNN: R-CNN系列的开山之作

R-CNN的基本流程

Fast R-CNN: 共享卷积运算

fast R-CNN的基本流程

注意:Fast R-CNN的 Region Proposal 是在feature map之后做的,这样可以不用对所有的区域进行单独的CNN Forward步骤。

Fast R-CNN框架如下图:

Fast R-CNN框架与R-CNN有两处不同:

  1. 最后一个卷积层后加了一个ROI pooling layer;
  2. 损失函数使用了multi-task loss(多任务损失)函数,将边框回归直接加到CNN网络中训练。分类Fast R-CNN直接用softmax替代R-CNN用的SVM进行分类。

Fast R-CNN是端到端(end-to-end)的。

Faster R-CNN: 两阶段模型的深度化

Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。Faster R-CNN这篇论文着重解决了这个系统中的三个问题:
1. 如何设计区域生成网络;
2. 如何训练区域生成网络;
3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络。

在整个Faster R-CNN算法中,有三种尺度:

  1. 原图尺度:原始输入的大小。不受任何限制,不影响性能。
  2.  归一化尺度:输入特征提取网络的大小,在测试时设置,源码中opts.test_scale=600。anchor在这个尺度上设定。这个参数和anchor的相对大小决定了想要检测的目标范围。
  3.  网络输入尺度:输入特征检测网络的大小,在训练时设置,源码中为224*224。

Faster-R-CNN算法由两大模块组成:

  1. PRN候选框提取模块;
  2. Fast R-CNN检测模块。

其中,RPN是全卷积神经网络,用于提取候选框;Fast R-CNN基于RPN提取的proposal检测并识别proposal中的目标。


 

参考:https://mp.weixin.qq.com/s?__biz=MzU1MTk1MzU0Nw==&mid=2247483872&idx=1&sn=1cbcdbb2cf8c38351d78db9dec4640c3&chksm=fb883404ccffbd12bdced13e6540516a8061b524511a8a254c6f2d36047bb18ea094d1078ad7&mpshare=1&scene=23&srcid=1116xlSpr68G9Boj9gHwEoBP#rd

          https://blog.csdn.net/xiaohu2022/article/details/79600037

         https://blog.csdn.net/u012507022/article/details/52908811

拖了两天终于写完了,欢迎批评,虚心接受~

stay hungry, stay foolish~

猜你喜欢

转载自blog.csdn.net/weixin_42338058/article/details/84169079