目录

  • 前言
    • 目标检测近年里程碑
    • 深度学习目标检测
  • 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年来的图像检测和识别的历史,可以发现,目标检测的实现,已经从传统的图像技术 逐渐进入深度学习驱使和全面应用。从最早的闻名于耳的SIFTHOG,已经逐渐演变成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.

算法分为如下几个大步:

  1. 生成原始的区域集R(利用felzenszwalb算法)
  2. 计算区域集R里每个相邻区域的相似度S={s1,s2,…}
  3. 找出相似度最高的两个区域,将其合并为新集,添加进R
  4. 从S中移除所有与第3步中有关的子集
  5. 计算新集与所有子集的相似度
  6. 跳至第三步,不断循环,合并,直至S为空(到不能再合并时为止)

整体计算过程 , 相关流程伪代码参见如下:

Tips:
补充说明一下.

  1. 使用selective search method 提取roi的做法, 是由J.R.R. Uijlings 的论文最早提出来的, 是传统视觉处理的代表之作.

详细的参见 [SS-Method]论文/项目 Selective search for object recognition. | [IJCV, 2013] |[pdf] |[matlab code]
或者 链接地址

这个论文其实本身也是在前人 Felzenszwalb图像分割 基础上的改进

  1. R-CNN的结构几乎和<Selective search for object recognition> 的都是非常类似的, 区别就是RCNN中提取图像特征的方式已经不是什么HOG,SIFT了, 而采用的是CNN网络; 并且有一个线性回归对于bound box的校正
  2. 读到这个论文的时候, 真的感觉天下文章一大抄, 改点东西就能发顶刊

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层的作用.

  1. 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详解 | 两阶段目标检测代表相关推荐

  1. Densenet论文解读 深度学习领域论文分析博主

    深度学习领域论文分析博主 博客链接: https://my.csdn.net/u014380165 其中一篇文章: DenseNet算法详解: https://blog.csdn.net/u01438 ...

  2. 我愿称之为史上最全的深度学习面经总结(附答案详解)

    作者丨马东什么@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/391954665 编辑丨极市平台 最近参加社招,面试基本是问项目,然后问项目里的算法所以这里还是按照实 ...

  3. [深度学习概念]·实例分割模型Mask R-CNN详解

    实例分割模型Mask R-CNN详解 基础深度学习的目标检测技术演进解析 本文转载地址 Mask R-CNN是ICCV 2017的best paper,彰显了机器学习计算机视觉领域在2017年的最新成 ...

  4. 史上最全的深度学习面经总结(附答案详解)

    以下文章来源于:马东什么@知乎 作者:马东什么 原文链接:https://zhuanlan.zhihu.com/p/391954665 本文仅用于学术分享,如有侵权,请联系后台作删文处理 导读 本文很 ...

  5. 汇总 | 深度学习中图像语义分割基准数据集详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 汇总图像语义分割那些质量最好的数据集与常用benchmark数据集 ...

  6. 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...

  7. 【深度学习】GAN生成对抗网络原理详解(1)

    一个 GAN 框架,最少(但不限于)拥有两个组成部分,一个是生成模型 G,一个是判别模型 D.在训练过程中,会把生成模型生成的样本和真实样本随机地传送一张(或者一个 batch)给判别模型 D.判别模 ...

  8. 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection

    本文介绍一篇两阶段的3D目标检测网络:Voxel R-CNN,论文已收录于AAAI 2021. 这里重点是理解本文提出的 Voxel RoI pooling. 论文链接为:https://arxiv. ...

  9. 基于深度学习的新闻摘要生成算法实现与详解(Encoder-Decoder框架模型)

    目录 摘要: 文本摘要生成概述: Encoder-Decoder模式思想: 数据集描述: 模型构建与代码描述(LSTM+Attention) 总结: 参考文献: 摘要: 摘要是文本的主要内容和核心思想 ...

最新文章

  1. 解决Eclipse安装Genymotion插件后抛异常的Bug
  2. addroid 自定义布局
  3. 一个多线程死锁案例,如何避免及解决死锁问题
  4. oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化
  5. 第十一届蓝桥杯省赛C++组试题 第3题 求阴影面积
  6. merge语句_SQL Server MERGE语句概述和示例
  7. Linux 命令行历史及其history
  8. 软件项目管理案例教程韩万江课后习题答案第四版
  9. 电商平台拼多多详情接口API数据获取示例
  10. 大型粒子对撞机已被上面叫停了!何祚庥:希望杨振宁李政道有生之年重归于好...
  11. android 获取邮箱账号,android获取google邮箱
  12. 《楚门的世界》观后感
  13. Qt QAxObject操作excel文件过程总结
  14. python常用的第三方库
  15. 搭建.NET CORE MVC + EF CORE 的Demo
  16. 反脆弱·从不确定性中获益---管理?
  17. 操作分区表对global和local索引的影响
  18. Kali Linux三种网络攻击方法总结(DDoS、CC和ARP欺骗)
  19. 美国经济学教授Tyler Cowen:互联网正在动摇美国私有制根基
  20. casio科学计算机算mod余数,如何计算卡西欧fx-991ES计算中的Mod b

热门文章

  1. 网络诊断工具之—路由追踪tracert命令
  2. python环境下paillier同态密码库踩坑记录
  3. 华为认证网络工程师认证考试笔试题
  4. JAVA Json数据转换实体对象
  5. 厦门大学845数据结构考研参考书目
  6. pymysql连接mysql数据库try_pymysql操作mysql数据库
  7. 自己写一个数据库连接工具类
  8. STM32基础(11)ADC模数转换
  9. 2.3 高密度散点图
  10. javascript将JSON数据导出为Excle表格