原文链接

R-CNN简介

R-CNN提出于2014年,应当算是卷积神经网络在目标检测任务中的开山之作了,当然同年间还有一个overfeat算法,在这里暂不讨论。

在之后的几年中,目标检测任务的CNN模型也越来越多,实时性与准确率也越来越好,但是最为经典的模型还是很值得学习的。

那么下面就正式开始吧:

对于R-CNN模型,个人是这样理解,它其实是将4个应用于不同任务的已有的算法很好的结合了起来,最终在目标检测任务中取得了不错的效果,这种结合更像是偏向于工程的方法,而不是在算法上的一种突破,当然在后续的Fast-RCNN与Faster-RCNN中模型逐步完善并整合成为一个模型,但是在R-CNN中是没有的。

所以R-CNN由4个部分构成,它们分别是:

1.区域建议算法(ss)
2.特征提取算法(AlexNet)
3.线性分类器(线性SVM)
4.边界框修正回归模型(Bounding box)

区域建议算法:

首先是区域建议(Region Proposal)算法,这个东西在CNN之前就已经有了,而且算法不止一种,ss(selective search)算法是比较著名的一个,此外还有EdgeBox,MSER,MCG等等算法。

那么ss算法在R-CNN中有什么用呢?这要从目标检测任务开始谈起,在一副图像中要实现目标检测任务,一种最简单的思路是如果建立滑动窗,对每次滑动窗提取出来的图像做分类,如果分类结果恰好是目标的话,就实现了检测啦,目标的属性由分类器给,目标的位置由滑动窗给。但是考虑到一次滑动遍历产生的子图像数量就不小了,同时还有不同步长和窗口尺寸的情况,此时产生的待分类图像是非常多的,这种方式显然没什么实用价值,于是就有了ss算法,一种根据图像自身信息产生推荐区域的算法,它大概会产生1000-2000个潜在目标区域,照比滑动遍历的方式,这个数量已经减少了很多了。

特征提取算法:

这里的特征提取算法其实就是卷积神经网络,R-CNN中使用的是AlexNet,但是作者(Ross)并没有把AlexNet当做分类器来使用,而是只用了网络的特征层做ss算法输出的图像的特征提取工作,然后第7层特征给了SVM分类器,第五次特征给了Bounding Box回归模型。

线性分类器:

R-CNN使用了线性SVM分类器,这个没啥好说的,机器学习中很牛的算法了,需要说明的是,目标检测任务是有分类的功能的,比如一个任务是检测猫和狗,那么除了要框出猫和狗的位置之外,也需要判断是猫还是狗,这也是SVM在R-CNN中的作用。所以待检测物体有几类,那么就应该有几个二分类的SVM分类器,在上面的例子中,就需要两个二分类分类器了,分别是“猫-非猫”模型和“狗-非狗”模型,在R-CNN中,分类器有20个,它的输入特征是AlexNet提取到的fc7层特征。

边界框修正回归模型:

Bounding box也是个古老的话题了,计算机视觉常见任务中,在分类与检测之间还有一个定位任务,在一副图像中只有一个目标,然后把这个目标框出来,用到的就是Bounding box回归模型。

在R-CNN中,Bounding box的作用是修正ss推荐的区域的边界,输入的特征是AlexNet的第五层特征,与SVM分类器一样,它也是每一个类别都有一个模型,一共20个。

在上面,我们分别介绍了R-CNN的四个部分和他们的作用,可以看到,其实都是之前的东西,但是R-CNN的成功之处在于找到一种训练与测试的方法,把这四个部分结合了起来,而准确率大幅提升的原因在于CNN的引入。我们参考下HOG+SVM做行人检测的方法,HOG就是一种手工特征,而在R-CNN中换成了CNN提取特征。

所以个人的看法是理解R-CNN的关键不在于上面提到的四个算法本身,而是它们在R-CNN到底是怎么训练和测试的!

R-CNN的训练

R-CNN训练了CNN,SVM与Bounding box三个模型,因为ss算法用不着训练,哈哈~~

ss在生成了1000-2000个推荐区域之后,就和训练任务没啥关系了,训练样本是由ss区域生成出来的子图构建起来的。
而且三个部分的训练时**的,并没有整合在一起。

1.训练CNN

CNN是在ImageNet上pre-train的AlexNet模型,在R-CNN中进行fine-tune,fine-tune的过程是将AlexNet的Softmax改为任务需要的类别数,然后还是当做一个分类模型来训练,训练样本的构建使用ss生成的子图,当这些图与实际样本的框(Ground-truth)的IoU大于等于0.5时,认为是某一个类的正样本,这样的类一共有20个;IoU小于0.5时,认为是负样本。然后就可以AlexNet做pre-train了,pre-train之后AlexNet的Softmax层就被扔掉了,只剩下训练后的参数,这套参数就用来做特征提取。

2.训练SVM

之前提到了,SVM的输入特征是AlexNet fc7的输出,然后SVM做二分类,一个有20个SVM模型。那么对于其中某一个分类器来说,它的正样本是所有Ground-truth区域经过AlexNet后输出的特征,负样本是与Ground-truth区域重合IoU小于0.3的区域经过AlexNet后输出的特征,特征和标签确定了,就可以训练SVM了。

3.训练Bounding box回归模型
Bounding box回归模型也是20个,还是拿其中一个来说,它的输入是AlexNet conv5的特征,注意这里的20指的是类的个数,但是对一个Bounding box来说,它有4套参数,因为一个Bounding box回归模型分别对4个数做回归,这4个数是表征边界框的四个值,模型的损失函数如下:

其中i是样本个数,就是4个数,他们分别是x,y,w,h,其中(x,y)是中心位置,(w,h)是宽和高;P是ss给出来的区域,它由Px,Py,Pw,Ph四个数决定,这个区域经过AlexNet后再第五层输出特征,然后在特征每一个维度前都训练一个参数w,一组特征就有一组w,随4组做回归就有4组w;最后一个数就是t,它同样有4个数tx,ty,tw,th,是这样计算出来的:

而G就是经过修正后的边界框,它还是4个数Gx,Gy,Gw,Gh。通过上面的公式可以看到,t是边界框的偏差。
最后就是到底什么样的ss区域能够作为输入,在这里是IoU大于0.6的。
用一句话总结Bounding box回归模型就是:对于某一个类的回归模型而言,用IoU>0.6的ss区域经过卷积后作为输入特征,用同一组特征分别训练4组权值与之对应,对边界框四个属性值分别做回归。

经过上面三个**的部分,R-CNN的训练就完成了,可以看到,确实是非常麻烦,这不仅仅体现在速度慢上,过程也及其繁琐,因为每一步都需要重新构建样本。

R-CNN的测试
经过训练的R-CNN就可以拿来做测试了,测试过程还是可以一次完成的,它有下面几步:
1.ss算法提取1000-2000个区域;
2.对所有的区域做归一化,为了CNN网络能接受;
3.用AlexNet网络提出两套特征,一个是fc7层的,一个是con5层的;
4.对于一个fc7区域的特征,分别过20个分类器,看看哪个分类器给的分数最高,以确定区域的类别,并把所有的区域一次操作;
5.对上述所有打好label的区域使用非极大值抑制操作,以获取没有冗余(重叠)的区域子集,经过非极大值抑制之后,就认为剩下的所有的区域都是最后要框出来的;
6.重新拿回第5步剩下的区域con5层的特征,送入Bounding box模型,根据模型的输出做出一次修正;
7.根据SVM的结果打标签,根据修正的结果画框;
8.结束!!!!!!

R-CNN性能评价
R-CNN的出现使计算机视觉中的目标检测任务的性能评价map出现了质的飞跃:

但是R-CNN也有一个很致命的缺陷,超长的训练时间和测试时间:
训练时间需要84个小时,如果说训练时间还不是那么重要的话,那么单张图片的测试时间长达47s,这个缺陷使R-CNN失去了实用性,好在后续的各种算法对其进行了改进,这个我们后面在提。

补充
1.非极大值抑制在这里不介绍了;
2.如何根据Bounding box模型的输出做出修正:
模型输出是四个值的偏差(比例),那么根据如下公式就能够得到最后的位置

第五个公式就是Bounding box模型。

转载于:https://blog.51cto.com/13934153/2175267

深度学习目标检测(object detection)系列(一) R-CNN相关推荐

  1. [Intensive Reading]目标检测(object detection)系列(九) YOLOv3:取百家所长成一家之言

    目标检测系列: 目标检测(object detection)系列(一) R-CNN:CNN目标检测的开山之作 目标检测(object detection)系列(二) SPP-Net:让卷积计算可以共享 ...

  2. 同r做一个窗口_目标检测(Object Detection):R-CNN/SPPnet/R-FCN/Yolo/SSD

    这篇文章我是Survey目标检测(Object Detection)系列论文的一个总结. 包括R-CNN系列.SPP-net.R-FCN.YOLO系列.SSD.DenseBox等. 基本概念 目标识别 ...

  3. keras faster物体检测_全网 | 深度学习目标检测算法(精选12篇)

    太多的公众号每天的文章是否让你眼花缭乱?刷了好多文章,发现大都是转来转去?今天我在全网公众号里为大家精选主题为深度学习目标检测算法的文章12篇,其中包括综述,R-CNN,SPP-Net,Fast R- ...

  4. 深度学习目标检测方法综述

    参考:https://blog.csdn.net/Standing_On_Giant/article/details/60333329 参考:https://blog.csdn.net/xiaohu2 ...

  5. 深度学习目标检测详细解析以及Mask R-CNN示例

    深度学习目标检测详细解析以及Mask R-CNN示例 本文详细介绍了R-CNN走到端到端模型的Faster R-CNN的进化流程,以及典型的示例算法Mask R-CNN模型.算法如何变得更快,更强! ...

  6. 值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(下)

    作者 | 黄浴 来源 | 转载自知乎专栏自动驾驶的挑战和发展 [导读]在近日发布的<值得收藏!基于激光雷达数据的深度学习目标检测方法大合集(上)>一文中,作者介绍了一部分各大公司和机构基于 ...

  7. 动手学深度学习——目标检测 SSD R-CNN Fast R-CNN Faster R-CNN Mask R-CNN

    来源:13.4. 锚框 - 动手学深度学习 2.0.0-beta1 documentation 目标检测:锚框算法原理与实现.SSD.R-CNN_神洛华的博客 目录 目标检测简介 目标检测模型 ​编辑 ...

  8. 深度学习目标检测 RCNN F-RCNN SPP yolo-v1 v2 v3 残差网络ResNet MobileNet SqueezeNet ShuffleNet

    深度学习目标检测--结构变化顺序是RCNN->SPP->Fast RCNN->Faster RCNN->YOLO->SSD->YOLO2->Mask RCNN ...

  9. 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表

    目录 前言 目标检测近年里程碑 深度学习目标检测 1 R-CNN简介 1.1 何为R-CNN? 1.2 摘要 1.2.1 论文综述 1.2.2 优点汇总 1.2.3 缺点汇总 2. RCNN网络结构解 ...

最新文章

  1. .Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译
  2. Samba 系列(九):将 CentOS 7 桌面系统加入到 Samba4 AD 域环境中
  3. echarts 自适应高度_web 报表工具如何自适应
  4. oracle操作字符串:拼接、替换、截取、查找
  5. Linux下C语言的调试--转
  6. php 获取网卡mac
  7. matlab激光散斑散射半径测量,激光散斑测量2011412225741
  8. button Show most popular product
  9. Java EE CDI限定词:快速浏览
  10. 修改主从服务器,搭建BIND主从服务器
  11. 机器学习11-不平衡数据之采样
  12. 项目管理系统--设计篇--第五篇
  13. List集合去重的三种方法
  14. PHP学习路线图(2021年最新版)
  15. Windows提权之本地提权-信息搜集
  16. win7计算机出现空白图标,win7系统电脑任务栏右下角图标空白的解决方法
  17. LOJ#6198. 谢特 SAM+启发式合并+01trie
  18. 【文智背后的奥秘】系列篇——关键词智能提取
  19. 基于不同IP地址下的虚拟主机配置以及基于不同端口下的虚拟主机配置
  20. 小白学机器学习西瓜书-第三章对数几率回归

热门文章

  1. 最小乘积生成树和最小乘积最大匹配
  2. Linux下使用system()函数一定要谨慎
  3. java基础初步总结
  4. 让系统命令man汉化
  5. Delphi与Ole,Word,Excel,查找与替换等
  6. 区块链的价值在于建立信任,而ICO却在摧毁信任
  7. swift开发之--UISearchBar的使用/UISearchController的使用
  8. 设计模式C#实现(十五)——命令模式
  9. 使用ArcGIS API for Silverlight实现地形坡度在线分析
  10. 重做日志文件(redo log file)和归档日志文件(archive log file)