前言
R-CNN论文地址/ 代码, 参见文末Reference 1
目标检测近年里程碑
上图,回顾近20年来的图像检测和识别的历史,可以发现,目标检测的实现,已经从传统的图像技术 逐渐进入深度学习驱使和全面应用。从最早的闻名于耳的SIFT
、HOG
,已经逐渐演变成anchor free & anchor based
的深度学习范式。尤其是AlexNet
在一骑绝尘夺冠之后,将深度学习应用到目标检测领域成为大家竞相开展的学术热点。其中最值得一提的就是 和何凯明
大神齐名的另一个大神Ross Girshick
。他在deep learning object detect的开山之作(2014) 就是---- R-CNN.
深度学习目标检测
来自首尔国立大学的 Lee hoseong 开源了 「deep learning object detection」 GitHub 项目,列举了近些年来深度学习-目标检测重要论文。其他论文可参考上图。后续我也会逐渐在本专栏详细描述。
项目链接是: https://github.com/hoya012/deep_learning_object_detection#2014
1 R-CNN简介
1.1 何为R-CNN?
引用论文的解释:
Since we combine region proposals with CNNs, we call our method R-CNN:
Regions with CNN features.
白话来说,就是 作者在进行目标检测的时候,首次提出将目标位置候选框(region proposals, R
)和使用深度学习框架(CNN
)进行特征提取相结合的方法,并且检测效果较好,遂取名R-CNN
.
1.2 摘要
1.2.1 论文综述
1.2.2 优点汇总
作者认为的最大的优势
是在当时(2014年)对于检测目标精读的大幅提升、甚至是正确率最强(mAP@VOC 2012 = 53.3% / mAP@ILSVRC2013 detection dataset = 31.4%)
作者认为最大的2 个亮点:
- (1)使用state-of-art CNN应用到目标检测进行定位和分割(精度在同类模型比较下当时已是最优)
- (2)在训练方法上,也是提出了新的fine-tuning技术优化方法
1.2.3 缺点汇总
次年,作者RBG更新的的Fast RCNN也陈述了RCNN以及类似模型的缺点:
具体来说,就是:
(1) 训练是个多流程的过程.
先要fine-tuning 主干网络(Alexnet)
以便能提取对应分类的图像特征, 然后训练SVM
以便于适配从主干网络提取特征后能实行分类的功能呢, 最后还要训练线性回归模型
以便于实现找到bounding box的功能.
tips: 补充说明
这些过程因为是传统图像处理(使用svm, 而不是softmax; 线性回归也是一般的线性拟合,不是深度学习)和深度学习(Alexnet)结合, 所以不适用深度学习的反向传播能同时更新各个模块的权重, 所以需要每个模块单独训练,最后组合起来.
(2) 训练过程在空间和时间上损耗比较大
因为(1)的原因, 在进行svm / bounding box regression
训练之前, 输入的特征需要提前保存到硬盘上. 也就是Alexnet
训练完成之后, 在进行特征提取,然后保存到硬盘上,以便于后续的训练过程能够开展. 这个过程比较花时间和空间了.
(3) 检测过程特别慢
在GPU上, 如果主干网络使用VGG(VGG准确率 > Alexnet), 检测一张图片的时间超级长, 大约需要47秒!!!
2. RCNN网络结构解析
2.1 整体结构概览
论文中整体过程如上图所示,描述基本可以大致了解。
2.1.1 过程介绍:
这个过程大致可以分成3 个阶段:
step 1: 提取2k 个region proposals ( selective search(SS method)+ warped img) |
|
|
|
|
V
step 2: 将region proposals (目标物体候选框)送入主干网络(VGG or Alexnet)提取feature map(图像特征) |
|
|
|
|
V
step 3: 利用feature map 通过 SVM实现分类+ 通过bounding box regression实现定位(输出目标对应的x,y,w,h) |
为了具体描述,可以用一个更形象的图来更详细地描述一下整体结构:
2.1.2 详述过程:
(1)输入: 固定图片
(2)提取roi: 使用 selective search(SS method)
方法,提取2k候选目标框
(3)warped ROI: 使用特定方法resize不同尺寸的候选目标框(ROI)到固定尺寸(227 x 227)
(4)特征提取: 使用AlexNet提取这2k固定尺寸的候选框中图像特征(每个ROI 最终是4096维度)
(5)class & regression : 针对提取的图像特征,利用训练的多个线性SVM
进行分类判断(每一个类别都有一个svm, 判断属于该类别与否); 利用训练的线性回归模型
(bounding-box regression)拟合目标框坐标(x,y,w,h).(每一个类别都有一个线性回归模型, 用于拟合具体的坐标)
整个过程还是利用传统图像方法(SS method /SVM
)和深度学习技术结合(AlexNet
),是从传统走向深度学习的转型之作。
2.2 对于输入图片提取ROI ---- selective search method
输入一张图片, 首先需要做的就是尽可能多的找到目标所在的候选框位置,当时非常流行的方法就是selective search
具体参见 [论文解读] 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition>
selective search
的主要思路:
输入一张图片,首先通过图像分割的方法(如大名鼎鼎的felzenszwalb算法
)获得很多小的区域,然后对这些小的区域不断进行合并(通过相似性公式计算, 相邻区域相似度最高的合并),一直到无法合并为止。此时这些原始的小区域和合并得到的区域的就是我们得到的初始的ROI的bounding box.
算法分为如下几个大步:
- 生成原始的区域集R(利用felzenszwalb算法)
- 计算区域集R里每个相邻区域的相似度S={s1,s2,…}
- 找出相似度最高的两个区域,将其合并为新集,添加进R
- 从S中移除所有与第3步中有关的子集
- 计算新集与所有子集的相似度
- 跳至第三步,不断循环,合并,直至S为空(到不能再合并时为止)
整体计算过程 , 相关流程伪代码参见如下:
Tips:
补充说明一下.
- 使用
selective search method
提取roi的做法, 是由J.R.R. Uijlings
的论文最早提出来的, 是传统视觉处理的代表之作.
详细的参见 [SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |[pdf]
|[matlab code]
或者 链接地址
这个论文其实本身也是在前人 Felzenszwalb图像分割
基础上的改进
- R-CNN的结构几乎和
<Selective search for object recognition>
的都是非常类似的, 区别就是RCNN中提取图像特征的方式已经不是什么HOG,SIFT了, 而采用的是CNN网络; 并且有一个线性回归对于bound box的校正 - 读到这个论文的时候, 真的感觉天下文章一大抄, 改点东西就能发顶刊
2.3 warped ROI
因为当时的CNN网络要求,输入图片必须是尺寸大小固定的, 所以使用CNN主干网络提取网络特征的之前,需要对于SS
提取的ROI
做一下变化/使之变成尺寸固定的ROI
.
(送入AlexNet的话,输入图片的大小需要227 x 227)
作者当时提供的几种方法:
方法1:tightest square with context
使用一定尺度的正方形bounding box,略微扩大背景内容.(例如图片原来是100x200 -> 250 x 250).如果没有填满的话,使用图像平均值填满(在送入CNN网络之前,减去该平均值)
方法2:tightest square without context
就是原始的长方形bounding box
方法3:warp
就是将原始长方形resize到固定尺寸
注意:
每一个图像的第一行,是原始bounding box没有填充的情况, 即是p=0;
第二行,是原始图像先填充padding,然后在按照方法1-3进行操作,p=16
当然方法还有众多, paper中也是说这个可以留作后续的点继续拓展, 只是对于这3中方案选择最优.
结论: 方案3 使用padding的方法, mAP高于其他方案3-5个点.作为最终warped img方法.
2.4 主干网络结构back bone — AlexNet & vgg
关于用来提取特征的主干网络, 其实paper中也做了一下实验对比:
Tips:
T-Net : 指的是AlexNet
O-Net: 指的是 VGG16
BB: 表示的是增加使用paper中提到的bounding box regressor去修正, 没有写BB的则是仍然使用SS
提供的最初的bounding box
通过上表, 可以发现使用VGG确实要比AlexNet提高了整体上的准确度,mAP
从58.2% -> 66%. 但是所使用的时间确实提高了大约7倍!!(VGG网络在当时的GPU上运行, 可能消耗了巨大的运行成本了)
结论: 作者最终的选择是, backbone使用 AlexNet
2.5 classfication — SVM
这个就是利用线性SVM(判断是否属于该类别), 对于back bone提取的4096-d图像特征, 进行每个类别的分类. 如果有N个类别, 则有 N+1 个类别(都不属于的话, 就是背景,所以是N+1) 需要训练SVM.
这就有人要问了, 为啥不使用softmax 作为 fc之后分类的判断依据, 还再多加一个SVM训练呢?
paper上作者的回答也很简单, 因为使用 softmax进行分类的话, 在同样情况下, VOC2007 上的mAP会跌 (SVM: 54.2% vs Softmax: 50.9% )
为啥使用 softmax mAP会降低呢?
paper上作者猜测可能跟 训练backbone(使用image-net结果进行fine-tuning), 训练SVM中的positive / negtive 定义不同有关系.
使用softmax的话, 那做分类的时候, 关于positive / negtive样本(正/负样本)就是训练backbone的定义一样了. 关于负样本的话, 送入softmax的就不是"hard negetive"的了,而是一般的negtive了. 可能减弱了分类能力.
fine-tuning 过程中positive / negtive 和 SVM训练的时候, 定义有啥不同?
fine-tuning
:
ROI和各个类别的ground truth的IOU > 0.5 都算作 positive;
其他的都当做background, 即negtive
SVM
:
只是ground truth当做positive;
和ground truch IOU <0.3, 才被当做negtive;(如果>0.3,会被忽略)
补充说明:
此处训练SVM明显是借鉴了< Selective search for object recognition>
, 那边文章
positive: 就是ground truth,
negtive: overlap 20%-50% with ground truth
-------------------以下是个人理解-----------------------------------
这样的负样本是hard negetive
, 是非常确定的假正样本
, 送入训练的话理论上应该是能提升识别正负样本的能力的. 因为训练SVM就只是判断一个类别是某个类别或者不是, 要比softmax同时判别几个类别的效果在一定情况下是要好一些的;并且softmax中定义的negetive有大量数据, 而且又不是非常的hard negtive, 所以对于分类能力上会减弱.
2.6 regression
看完以上分析, 你在对比paper中的公式, 也许会好理解很多:
表示P映射到G的最终的bounding box的公式
G: ground truth bounding box
P: proposal bounding box
使用最小二乘法, 让G 和G_hat差值最小, 从而取得相关的映射权重参数, 就是过程,
最终的求取权重的公式:
其中 t_star
表达的内容如下:
其他的符号表示内容:
4. 实验过程和结论
这篇paper还是进行了大量的实验和对比的, 除了上面提到的几个实验结果(关于backbone选择/ resize方法), 我个人觉得最主要的是关于fine-turning方法的比较, 也是比较有启示性.
4.1 关于fine-turning 与否的优劣比较
说明:
(FT):使用fine-turning
(BB) :使用bounding box校正
(fc7) :提取的图像特征是从Full-connect 7层开始
从上图可以观察到:
1 mAP准确性:
R-CNN FT fc7 BB
>
R-CNN FT fc7
>
R-CNN FT fc6
>
R-CNN FT pool5
>
R-CNN fc6
>
R-CNN fc7
>
R-CNN FT pool5
>
传统的图像处理技术
2. Table 2 rows 1-3
(没有经过FT, 普通训练出来的RCNN)
结果可以看出, 从 fc7之后的提取图像特征的效果是恶化了的(R-CNN fc6
>
R-CNN fc7
) , 并且直接从pooling 层提取的特征, 最终结果和从fc6, 或者fc7提取的特征的结果差不多.
结论: fc7
层以后的fc
层参数大约有 16.8 million, 占比29%, 这些其实都可以移除掉不使用(对于提取特征单方面来看的话);
参数比占比 6%卷基层
(pooling层以前), 作用远远大约fc层
的作用.
Table 2 rows 4-6
(使用image-net 进行FT训练出来的RCNN)
可以看到mAP一下子提升了8个点, 到了54.2%. 这个远远要比改变提取层(pool/fc6/fc7)位置提高的多.
结论:这个大部分的功劳应该是卷基层的作用.
即 FT能够更快/ 更好地 提升卷积普通层的效果.
4.2 目标特性敏感性讨论
结论:
fine-tune并未 改变减少图片的敏感度的但是却大幅度高 图像的表现性;
提升了最高、最低 子集的表现在 对于高宽比、 bb-area方面;
提高了在遮挡、截断、限定框区域、高宽比、视点 、部分可见性的鲁棒性
还有不少实验和验证, 不再赘述. 感谢去的可以去拜读原文.
Reference
-
1.[R-CNN]论文/代码 Rich feature hierarchies for accurate object detection and semantic segmentation | [CVPR’ 14] |
[pdf]
[official code - caffe]
-
3.[SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |
[pdf]
|[matlab code]
-
5[论文解读] 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition>
-
6 [SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |
[pdf]
|[matlab code]