R-CNN 系列算法是目标检测 two-stage 类的代表算法,本文将从 问题背景,创新点,框架模块,训练流程,检测流程五个方面比较,了解它们的的发展历程,以及发展原因。
一、任务描述
目标检测是为了解决图像里的物体是什么,在哪里的问题。输入一幅图像,输出的是图像里每个物体的类别和位置,其中位置用一个包含物体的框表示。
需要注意,我们的目标,同时也是论文中常说的感兴趣的物体,指我们关心的类别(行人检测只检测人,交通检测只关心交通工具等),或者数据集包含的类别,并不是图像里所有的物体都是目标,比如建筑,草坪也是物体,但他们常常是背景。
从计算机视觉的角度看,目标检测是分类+定位,从机器学习的角度看,目标检测是分类+回归。
二、设计思路
今天介绍的 R-CNN 系列算法,都基于深度学习,它们把目标检测大致分为四部分完成:
- 先从整幅图里选取最可能有物体的一些候选区域,这些区域一般用长方形框表示,这一步能缩小寻找范围
- 既然用到深度学习,那就需要学习图像的深层特征,这里我们只关心上一步选出区域的图像特征,提取的特征可用于分类回归任务
- 分类就是常规的分类方法,不过这里是多分类
- 第一步给的候选框经过筛选后,不一定精准,还需要根据 ground truth 作调整
- 分类和定位任务可以同时训练,也可以依次训练
三、名词解释
- Selective Search:一种产生候选区的方法,没有用到深度学习,需要在 CPU 上训练,比较耗时,简称 SS。
- Region proposal:直译为成区域建议(有些别扭),就是生成候选区的过程,类似于比赛前的海选,其中的 region 是矩形区。方法有 Selective Search,论文中产生 2000 个候选区,下面简称这部分产生的区域为候选区。
- Bounding box:直译为边界框,就是最后输出定位的那个矩形框。严格来说,分为人工标注的 ground truth 和 predicted 两种类型。有时候简称为 BB。
- Region of interest(ROI):感兴趣的区域,有时候论文把 region proposal 产生的区域叫 ROI。
- Non maximum suppression(NMS):非极大值抑制,简称为 NMS 算法,其思想是搜素局部最大值,抑制极大值,在目标检测的目的是输出最合适的边界框。
- Fully connected layer:全连接层,我下面简写为 FC 层。
- Feature map:卷积层的输出,可翻译为特征图。
四、比较说明
下面我将从问题背景,创新点,框架模块,训练流程,检测流程五个方面比较介绍他们的发展过程。我更侧重它们的宏观思路,而没有介绍具体细节,也没有涉及实验和代码。
五、发展历程
首先用一张图说明三个架构的区别。
可以看出,他们的发展是从训练分散到统一的过程,开始还需要借助外部的模块 SS,后来可以构造一个联合框架。
从训练的角度,开始的训练是多阶段的(multi-satge:生成候选区→提取特征→分类→定位),后来的训练中,提取特征+分类+定位一次性完成。
从是否需要 region proposal 的角度,它们都是需要的,是 region based 方法,统称为 two-stage 方法,而其他方法如 YOLO 不需要这个阶段,是 one-stage 方法。
1. R-CNN
问题背景——
传统视觉特征 SIFT 和 HOG 用于检测系统,性能提升缓慢
CNN 用于分类效果好,能否提升检测性能
创新点——
把 CNN 用于生成 region proposal,用 CNN 提取的特征代替 SIFT 和 HOG 这些传统特征;
采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题。
框架模块——
生成候选区模块
提取特征的 CNN 模块
用于分类的 SVM 模块
修正边界框模块
训练流程——
有监督的预训练:在大型辅助数据集(ILSVRC2012 classification)上进行 CNN 预训练,得到一个分类器(CNN)
特定领域的微调:根据检测任务微调 CNN,把最后 1000 维的分类层替换成 N+1 维的分类层(N 是检测数据集的类别数,1 是背景)
SVM 分类器训练:由于SVM是二分类器,需要为每个类别训练单独的SVM。对于某一类,一片区域包含该类物体为正样本,不包含为负样本。如何判断是否为正?设定 IOU 阈值,低于阈值的为负样本
边界框回归训练:提高定位精度
检测流程——
输入一张多目标图像
采用 selective search 算法提取约 2000 个建议框,对区域 / 框变形
处理后的区域/框输入 CNN 提取特征
对区域进行分类,用非极大抑制提取分数最高(最可能的类)的框
对框进行回归修正,选择分数最高的框
2. Fast R-CNN
问题背景——
R-CNN 的训练是多阶段的(multi-stage):预训练 CNN→针对检测微调→训练分类器→训练边界框回归器
R-CNN 的时间空间消耗大:为了训练 SVM 分类器和边界框回归器,每个区域的特征都要提取出来,并且存到磁盘上
R-CNN 检测慢:检测时需要提取每个区域的特征,但生成的区域有重叠,所以计算也有重叠。
创新点——
与 R-CNN、SPPnet 相比有更高的检测精度(mAP)
训练是单阶段的(single-stage),损失是多任务的(multi-task),指把预训练的 CNN 针对检测任务微调后,分类和回归任务能一起完成
训练可以更新所有网络层
特征缓存不需要磁盘存储
框架模块——
与R-CNN 模块大致相同,相比 R-CNN 模块有一些改变。
网络输入:图片组以及每幅图片的一组 RoI
CNN 模块:最后一个最大池化层由 RoI 池化层代替
分类模块:Fast R-CNN 使用 softmax classifier,R-CNN 和 SPPnet 使用 one-vs-rest linear SVMs。
分类和定位:CNN 网络的最后一个全连接层和 softmax 替换为两个同级层,R-CNN 是独立的两个模块,需要单独训练
训练流程——
有监督的预训练,得到 CNN
特定领域的微调:首先改变模型,就是上面提到的输入改变,CNN 的 ROI 池化引入,还有分类回归模块的改变;
接着,输入图片和区域后,就能实现端到端的多任务训练,不需要单独训练分类和回归模块。
检测流程——
输入一张多目标图像
采用 selective search 得到的预选区域
用卷积层和池化层处理这幅图片,生成 feature map;
对于每个候选区域,用一个 RoI 池化层从上一层的 feature map 中提取定长的特征向量;
同时完成分类回归任务:每个 feature vector 送入一系列全连接层,这些全连接层最后会分支成 two sibling output layers: 一个可以在K个对象类以及一个笼统的“背景”类上生成 softmax 概率估计;另一层为 K 个对象类中的每一个输出四个实数值(编码精确的边界框位置)。
与 R-CNN 相比
R-CNN 先用 SS 从图片生成候选区(然后图片就不用了),把候选区输入CNN 提取特征,因为生成的区域有重叠,所以计算重复;Fast R-CNN 先用 SS 从图片生成 候选区,兵分两路,先把整幅图输入 CNN 一次性提取特征生成特征图,对于每个候选区,用一个 RoI 池化层从上一层的 特征图中提取定长的特征向量。
R-CNN 对分类和回归模块分别训练,Fast R-CNN 网络末尾采用并行的两个全连接层,可同时输出分类结果和边界框的回归结果,实现了端到端的多任务训练。
3. Faster R-CNN
问题背景——
继Fast R-CNN后,在CPU上实现的区域建议算法 Selective Search、EdgeBoxes 等成了物体检测速度提升上的最大瓶颈。
创新点——
设计 Region Proposal Networks(RPN),利用 CNN 卷积操作后的特征图生成候选区,代替了Selective Search、EdgeBoxes 等方法,速度上提升明显;
训练 Region Proposal Networks 与检测网络(Fast R-CNN)共享卷积层,大幅提高网络的检测速度。
框架模块——
PRN + Fast R-CNN
Fast R-CNN 生成候选区域需要外部的 SS 模块,而 Faster R-CNN 是一个统一的模块,region proposal 部分由 PRN 完成
训练流程——
四步交替训练:
训练PRN:使用 ImageNet-pre-trained model 初始化,针对 region proposal 任务微调
用第一步得到的 PRN 训练 Fast R-CNN:其中 Fast R-CNN 也用 ImageNet-pre-trained model 初始化(此时两个网络还没有共享特征)。
用 Fast R-CNN 初始化 PRN:固定共享的卷积层,仅微调 RPN 特有的层(此时两个网络开始共享)
在保持共享卷积层固定不变的情况下,微调 Fast R-CNN 的特有层。(两个网络共享相同的卷积层并形成统一的网络)
检测流程——
输入一张多目标图像
图像经过 CNN 网络生成特征图
特征图分两路,一路经过 PRN 得到候选区域(经过 NMS ),另一路继续向后传播。
上一步得到的高维特征图和区域建议同时输入 RoI 池化层,提取对应区域建议的特征
区域特征通过全连接层后,输出该区域的分类得分以及回归后的 bounding-box
本文转自:segmentfault.com - CatOneTwo,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:https://segmentfault.com/a/1190000022632647