这是13年的文章《Rich feature hierarchies for accurate object detection and semantic segmentation》,网上虽然很多文章写过,但是有些很乱,有些不详细,自己也花了不少时间看原文和各种博客,想写篇详细的自己记录下并分享出来。

先介绍几个物体检测的相关知识

不同于分类问题,物体检测可能会存在多个检测目标,这不仅需要我们判别出各个物体的类别,而且还要准确定位出物体的位置

下面图片上有猫,有狗,还有小黄鸭,这是多物体检测:

物体检测算法常用到的概念

下面我们讲解一下在物体检测算法中常用到的几个概念:Bbox,IoU,非极大值抑制。

Bounding Box(bbox)

bbox是包含物体的最小矩形,该物体应在最小矩形内部,如上图红色框蓝色框和绿色框。

物体检测中关于物体位置的信息输出是一组(x,y,w,h)数据,其中x,y代表着bbox的左上角(或者其他固定点,可自定义),对应的w,h表示bbox的宽和高.一组(x,y,w,h)可以唯一的确定一个定位框。

Intersection over Union(IoU)

对于两个区域R和R′,则两个区域的重叠程度overlap计算如下:
O(R,R′)=|R∩R′|/|R∪R′|

在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本。

非极大值抑制(Non-Maximum Suppression又称NMS)
非极大值抑制(NMS)可以看做是局部最大值的搜索问题,NMS是许多计算机视觉算法的部分。如何设计高效的NMS算法对许多应用是十分关键的,例如视频跟踪、数据挖掘、3D重建、物体识别以及纹理分析等。

这里我们主要针对非极大值抑制在物体检测上的应用,非极大值抑制就是把不是极大值的抑制掉,在物体检测上,就是对一个目标有多个标定框,使用极大值抑制算法滤掉多余的标定框。

下图一个小猫有多个红框标定:

使用非极大值抑制算法后:

介绍完上面的一些基础知识后开始正式介绍R-CNN

下图标为slow R-CNN是因为这图是介绍fast rcnn的ppt,所以最初的R-CNN叫作slow R-CNN


如上图所示,R-CNN这个物体检查系统可以大致分为四步进行:
1.获取输入图像
2.提取约2000个候选区域
3.将候选区域分别输入CNN网络(这里需要将候选图片进行缩放)
4.将CNN的输出输入SVM中进行类别的判定

上述四个步骤是一个大致的过程,而且是一个检测的过程,实际上训练过程比较麻烦,下面开始详细介绍。

一、候选区域的提取

这部分有很多传统的方法可以选择,本文为了和之前的物体检测算法进行对比,选择了selective search方法

二、缩放候选区域

因为CNN对输入图像的大小有限制,所以在将候选区域输入CNN网络之前,要将候选区域进行固定尺寸的缩放。
缩放分为两大类(该部分在原文附录A):

1)各向同性缩放,长宽放缩相同的倍数

  • tightest square with context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分用原始图片中的相应像素填补,如下图(B)所示
  • tightest square without context:
    把region proposal的边界进行扩展延伸成正方形,灰色部分不填补,如下图©所示

2)各向异性缩放, 长宽放缩的倍数不同
不管图片是否扭曲,长宽缩放的比例可能不一样,直接将长宽缩放到227*227,如下图(D)所示

在放缩之前,作者考虑,在region proposal周围补额外的原始图片像素(pad p)。上图中,第一层p=0,第二层p=16。

最后试验发现,采用各向异性缩放并且p=16的时候效果最好。

三、测试方法

测试时其实分两个结果
1.分类
在测试的时候,先对带检测图像提取出约2000个候选区域,将每个区域都进行缩放,然后将缩放后的图片输入CNN进行特征提取,对CNN输出的特征用SVM进行打分(每类都有一个SVM,21类就有21个SVM分类器),对打好分的区域使用NMS即非极大抑制(每类都单独使用)。

这里SVM怎么打分的这些细节没有细讲,只是简单的说检测的时候使用20004096维度的特征矩阵与4096N的SVM参数矩阵相乘(N为所要分的类别数),我也没看过原码,所以也不太清楚,知道的可以讨论一下。

到这里分类就完成了,但是得到的位置只是候选区在图像中的位置,而候选区的位置并不一定就是ground truth,即检测目标的真实位置。

2.定位(回归)
将CNN对候选区域提取出的特征输入训练好的线形回归器中,得到更为精确的位置定位,具体情况会在下面训练方法中详细介绍。但要明确的是,这些回归器是按照类来训练的,即每类分类完后进行回归。

四、训练方法

1.预训练
训练的时候,文章用了个trick,他先用ILSVRC2012数据库训练Alexnet,训练的时候目标时图片分类,因为ILSVRC2012数据库没有bbox的标定数据。这步称为预训练。

2.fine-tuning
这种方法也是当数据量不够的时候,常用的一种训练方式,即先用别的数据库训练网络,然后再用自己的数据库微调训练(fine-tuning)。微调期间,定义与ground truth的IoU大于0.5的候选区域为正样本,其余的为负样本。
这里训练时,网络输出要有所改变,因为分类问题,网络输出为N+1,其中N为正样本的类别数,1为背景。
对于VOC,N=20,对于ILSVRC2013, N=200。

3.目标分类
因为最终目标分类是通过SVM进行分类的,而不是通过网络框架中的softmax分类的。

下面先说一下在SVM的训练中,正负样本的定义,为什么这样定义,然后再说一下为什么不直接用softmax输出的结果而是再训练SVM来进行分类的。

1)SVM正负样本的定义,为什么fine-tuning与SVM正负样本定义不一样?
在训练SVM时,正样本为groundtruth,负样本定义为与ground truth的IoU小于0.3的候选区域为负样本,介于0.3与0.7之间的样本忽略。
fine-tuning时担心过拟合的原因,要扩大正样本的样本量,所以定义比较宽松,但是SVM是最终用于分类的分类器,而且SVM原理就是最小的距离最大化,越难分的数据越有利于SVM的训练,所以对样本的定义比较严格。

2)为什么不直接用softmax的输出结果?
因为在训练softmax的时候数据本来就不是很准确,而SVM的训练使用的是hard negative也就是样本比较严格,所以SVM效果会更好。

4.回归器训练
回归器是线性的,输入为Alexnet pool5的输出。
bbox回归认为候选区域和ground-truth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近ground-truth,这里近似认为可以线性关系)

训练回归器的输入为N对值,{(Pi,Gi)}i=1,2,...,N\{(P^i, G^i)\}_{i=1,2,...,N}{(Pi,Gi)}i=1,2,...,N​,分别为候选区域的框坐标和真实的框坐标,下面在不必要时省略i。这里选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本.

从候选框P到预测框G^\hat{G}G^的基本思路如下:

因为我们在分类之后得到候选框P (Px,Py,Pw,Ph)(P_{x}, P_{y}, P_{w}, P_{h})(Px​,Py​,Pw​,Ph​),其中PxP_{x}Px​和PyP_{y}Py​为候选框的中心点,PwP_{w}Pw​和PhP_{h}Ph​为候选框的宽高,下面介绍中所有框的定位都用这种定义,即x和y表示中心点坐标,w和h表示框的宽高。知道候选框的表示,那么只要估计出出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了

1)先求平移量(Δx,Δy)

Δx=Pwdx(P)P_{w}d_{x}(P)Pw​dx​(P) , Δy=Phdy(P)P_{h}d_{y}(P)Ph​dy​(P)

即R-CNN论文里面的:
Gx^=Pwdx(P)+Px\hat{G_{x}}=P_{w}d_{x}(P)+P_{x}Gx​^​=Pw​dx​(P)+Px​,Gy^=Pwdy(P)+Py\hat{G_{y}}=P_{w}d_{y}(P)+P_{y}Gy​^​=Pw​dy​(P)+Py​

2)算尺度放缩量(Sw,Sh)(S_{w},S_{h})(Sw​,Sh​)
Sw=Pwdw(P),Sh=Phdh(P)S_{w}=P_{w}d_{w}(P), S_{h}=P_{h}d_{h}(P)Sw​=Pw​dw​(P),Sh​=Ph​dh​(P)
Gw^=Pwexp(dw(P)),Gh^=Phexp(dh(P))\hat{G_{w}}=P_{w}exp(d_{w}(P)), \hat{G_{h}}=P_{h}exp(d_{h}(P))Gw​^​=Pw​exp(dw​(P)),Gh​^​=Ph​exp(dh​(P))

我们要学习的是dx(P),dy(P),dw(P),dh(P)d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)dx​(P),dy​(P),dw​(P),dh​(P)这四个变换,就可以得到估计框了。

这四个变换可以用下列公式表示:
d∗(P)=w∗TΦ5(P)d_{*}(P) = w^{T}_{*}\Phi_{5}(P)d∗​(P)=w∗T​Φ5​(P)
上式中Φ5(P)\Phi_{5}(P)Φ5​(P)为Alexnet pool5输出的特征,所以要求dx(P),dy(P),dw(P),dh(P)d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)dx​(P),dy​(P),dw​(P),dh​(P)这四个变换,只需求出w∗Tw^{T}_{*}w∗T​即可。

该回归器的损失函数为:
w∗=arg⁡min⁡w^∗∑in(t∗i−w^∗TΦ5(Pi))2+λ∥w^∗∥2w_{*}=\mathop{\arg\min}_{\hat{w}_{*}}\sum_{i}^{n}(t^{i}_{*}-\hat{w}^{T}_{*}\Phi_{5}(P^{i}))^2+\lambda\|\hat{w}_{*}\|^2w∗​=argminw^∗​​∑in​(t∗i​−w^∗T​Φ5​(Pi))2+λ∥w^∗​∥2
上式中的t∗it^{i}_{*}t∗i​可以通过如下公式求出:
tx=(Gx−Px)/Pwt_{x}=(G_{x} - P_{x})/P_{w}tx​=(Gx​−Px​)/Pw​
ty=(Gy−Py)/Pht_{y}=(G_{y} - P_{y})/P_{h}ty​=(Gy​−Py​)/Ph​
tw=log(Gw/Pw)t_{w}=log(G_{w}/P_{w})tw​=log(Gw​/Pw​)
th=log(Gh/Ph)t_{h}=log(G_{h}/P_{h})th​=log(Gh​/Ph​)
所以通过输入的特征值训练,从而求出w^∗\hat{w}_{*}w^∗​,就可以得到回归器

参考
1.http://www.robots.ox.ac.uk/~tvg/publications/talks/fast-rcnn-slides.pdf
2.https://blog.csdn.net/u011974639/article/details/78053203
3.https://blog.csdn.net/qq_17448289/article/details/52871461
4.https://blog.csdn.net/poorfriend/article/details/51604385

R-CNN文章详细解读相关推荐

  1. Faster R-CNN文章详细解读

    文章<Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks>是为了改进Fast R- ...

  2. 结绳法:文章详细解读(异步时钟设计的同步策略)(五)

    一.典型方法(双锁存器法)

  3. R回归模型输出结果详细解读:summary、call、residuals、Coefficients、Assessing Model Fit

    R回归模型输出结果详细解读:summary.call.residuals.Coefficients.Assessing Model Fit 目录 R回归模型输出结果详细解读:summary.call. ...

  4. CNN网络详细讲解,可视化图例解读

    写在前面 想了解CNN详细网络工作过程的,可以直接找到第二部分,如果大家觉得有什么不对的地方,非常感谢留言指教~感激不尽 1. CNN网络应用场景 对二维图像进行特征提取.可以和多种网络进行拼接,比如 ...

  5. 个性化联邦学习PFedMe详细解读(NeurIPS 2020)

    关注公众号,发现CV技术之美 本文介绍一篇 NeurIPS 2020 的论文『Personalized Federated Learning with Moreau Envelopes』,对个性化联邦 ...

  6. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)

    上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启.扫描.连接.断开.连接超时...一 ...

  7. 经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现)

    前言 在上一期中介绍了VGG,VGG在2014年ImageNet 中获得了定位任务第1名和分类任务第2名的好成绩,而今天要介绍的就是同年分类任务的第一名--GoogLeNet . 作为2014年Ima ...

  8. 经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)

    前言 今天我们一起来学习何恺明大神的又一经典之作: ResNeXt(<Aggregated Residual Transformations for Deep Neural Networks&g ...

  9. CutPaste: Self-Supervised Learning for Anomaly Detection and Localization 全文翻译+详细解读

    CutPaste: Self-Supervised Learning for Anomaly Detection and Localization 全文翻译+详细解读 文章速览 全文翻译及详细解释 0 ...

  10. 【原理+源码详细解读】从Transformer到ViT

    文章目录 参考文献 简介 Transformer架构 Position Encoding Self-attention Multi-head Self-attention Masked Multi-H ...

最新文章

  1. 「自然语言处理」如何快速理解?有这篇文章就够了!
  2. 使用tensorflow serving部署keras模型(tensorflow 2.0.0)
  3. linux-休眠命令
  4. 框架源码专题:springIOC的加载过程,bean的生命周期,结合spring源码分析
  5. php笔试有多少分钟,PHP研发工程师笔试题(半小时)
  6. python udp 直播_Python使用UDP协议实现局域网内屏幕广播
  7. 上海计算机二级vb题目,上海计算机二级VB试题(卷).doc
  8. 以太网和令牌环网的区别
  9. ultraISO方式制作win10安装U盘
  10. html怎么用2个caption不换行,caption怎么用
  11. Linux#Shell#if [ $# -ne 1 ];then 是什么意思?
  12. spark-streaming 编程(一)构建开发环境
  13. 2.leapmotion之开发指南
  14. QT:模仿腾讯会议(低配版)
  15. 计算机二级办公软件高级应用操作题,谁有计算机二级办公软件高级应用技术word操作题目啊?...
  16. 微信公众号如何添加文档附件【教程】
  17. java smtp.126.com_Java Mail---SMTP、POP3协议-DOS下手动收发邮件演示过程
  18. (循环串)Periodic Strings UVA - 455
  19. 失物招领|基于Web的校园失物招领系统的设计与实现
  20. 删除SQL Server数据库

热门文章

  1. php ipa 版本定制,自建IOS企业包ipa包 下载服务
  2. 新一代超低功耗STM32U5,到底有啥亮点?
  3. tic tac toe php,Python函数找出tic tac toe获胜者
  4. c#Winform自定义控件-目录
  5. 2E07-view-lists-Collapsed
  6. 计算机网络实验一(常见服务和静态IP设置)
  7. 【R语言入门】从R、RStudio安装到 条形图、折线图、散点图 等的图形绘制
  8. Jenkins 基础02 配置插件源
  9. 拒绝焦虑状态:TA爱我吗?
  10. GIS地图描边特效的实现