【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
目录
- 前言
- 目标检测近年里程碑
- 深度学习目标检测
- 1 R-CNN简介
- 1.1 何为R-CNN?
- 1.2 摘要
- 1.2.1 论文综述
- 1.2.2 优点汇总
- 1.2.3 缺点汇总
- 2. RCNN网络结构解析
- 2.1 整体结构概览
- 2.1.1 过程介绍:
- 2.1.2 详述过程:
- 2.2 对于输入图片提取ROI ---- selective search method
- 2.3 warped ROI
- 2.4 主干网络结构back bone --- AlexNet & vgg
- 2.5 classfication --- SVM
- 2.6 regression
- 4. 实验过程和结论
- 4.1 关于fine-turning 与否的优劣比较
- 4.2 目标特性敏感性讨论
- Reference
前言
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]
2.目标检测历史回顾:
3.[SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |
[pdf]
|[matlab code]
4 SS-python代码讲解
5[论文解读] 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition>
6 [SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |
[pdf]
|[matlab code]
7 bounding box regression
【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表相关推荐
- Densenet论文解读 深度学习领域论文分析博主
深度学习领域论文分析博主 博客链接: https://my.csdn.net/u014380165 其中一篇文章: DenseNet算法详解: https://blog.csdn.net/u01438 ...
- 我愿称之为史上最全的深度学习面经总结(附答案详解)
作者丨马东什么@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/391954665 编辑丨极市平台 最近参加社招,面试基本是问项目,然后问项目里的算法所以这里还是按照实 ...
- [深度学习概念]·实例分割模型Mask R-CNN详解
实例分割模型Mask R-CNN详解 基础深度学习的目标检测技术演进解析 本文转载地址 Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成 ...
- 史上最全的深度学习面经总结(附答案详解)
以下文章来源于:马东什么@知乎 作者:马东什么 原文链接:https://zhuanlan.zhihu.com/p/391954665 本文仅用于学术分享,如有侵权,请联系后台作删文处理 导读 本文很 ...
- 汇总 | 深度学习中图像语义分割基准数据集详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 汇总图像语义分割那些质量最好的数据集与常用benchmark数据集 ...
- 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...
- 【深度学习】GAN生成对抗网络原理详解(1)
一个 GAN 框架,最少(但不限于)拥有两个组成部分,一个是生成模型 G,一个是判别模型 D.在训练过程中,会把生成模型生成的样本和真实样本随机地传送一张(或者一个 batch)给判别模型 D.判别模 ...
- 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection
本文介绍一篇两阶段的3D目标检测网络:Voxel R-CNN,论文已收录于AAAI 2021. 这里重点是理解本文提出的 Voxel RoI pooling. 论文链接为:https://arxiv. ...
- 基于深度学习的新闻摘要生成算法实现与详解(Encoder-Decoder框架模型)
目录 摘要: 文本摘要生成概述: Encoder-Decoder模式思想: 数据集描述: 模型构建与代码描述(LSTM+Attention) 总结: 参考文献: 摘要: 摘要是文本的主要内容和核心思想 ...
最新文章
- 解决Eclipse安装Genymotion插件后抛异常的Bug
- addroid 自定义布局
- 一个多线程死锁案例,如何避免及解决死锁问题
- oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化
- 第十一届蓝桥杯省赛C++组试题 第3题 求阴影面积
- merge语句_SQL Server MERGE语句概述和示例
- Linux 命令行历史及其history
- 软件项目管理案例教程韩万江课后习题答案第四版
- 电商平台拼多多详情接口API数据获取示例
- 大型粒子对撞机已被上面叫停了!何祚庥:希望杨振宁李政道有生之年重归于好...
- android 获取邮箱账号,android获取google邮箱
- 《楚门的世界》观后感
- Qt QAxObject操作excel文件过程总结
- python常用的第三方库
- 搭建.NET CORE MVC + EF CORE 的Demo
- 反脆弱·从不确定性中获益---管理?
- 操作分区表对global和local索引的影响
- Kali Linux三种网络攻击方法总结(DDoS、CC和ARP欺骗)
- 美国经济学教授Tyler Cowen:互联网正在动摇美国私有制根基
- casio科学计算机算mod余数,如何计算卡西欧fx-991ES计算中的Mod b