R-CNN全称为Region-CNN,它可以说是第一个成功地将深度学习应用到目标检测上的算法。后面提到的Fast R-CNN、Faster R-CNN全部都是建立在R-CNN的基础上的。

传统目标检测流程:

(1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)

(2)特征提取(SIFT、HOG等;形态多样性、光照变换多样性、背景多样性使得特征鲁棒性差)

(3)分类器分类(SVM、Adaboost)

一、RCNN思路(Selective Search + CNN + SVM)

R-CNN遵循传统目标检测的思路,同样采用,对每个框提取特征、图像分类、非极大值抑制四个步骤进行目标检测,只不过进行了部分的改进。

  • 经典的目标检测算法使用滑动窗法去依次判断所有可能的区域。而这里预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断,大大减少了计算量
  • 将传统的特征(如SIFT,HOG特征等)换成了深度卷积网络提取特征

&创新点

  1. 采用CNN网络提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力

  2. 采用大样本下有监督预训练+小样本微调的方式解决小样本难以训练甚至过拟合等问题

二、算法步骤

数据集采用pascal VOC,这个数据集的object一共有20个类别。首先用selective search方法在每张图像上选取约2000个region proposal,region proposal就是object有可能出现的位置。然后根据这些region proposal构造训练和测试样本,注意这些region proposal的大小不一,另外样本的类别是21个(包括了背景)

简要步骤如下:

(1)输入测试图像,利用选择性搜索selective search在图像中从下到上提取2000个左右的可能包含物体的候选区域Region Proposal

(2)先在每个建议框周围加上16个像素值为建议框像素平均值的边框,在直接变形为227x227的大小(Alexnet的尺寸)

(3)先将所有建议框像素减去该建议框像素平均值,将每个227x227输入Alexnet CNN网络获取4096维特征。2000个建议框的CNN特征组合成2000x4096维矩阵

(4)将2000x4096维特征与20个SVM组成权值矩阵4096x2000相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000x20维矩阵表示每个建议框是某个物体类别的得分

(5)对上述2000x20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框

(6)分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box

具体步骤如下:

步骤一:下载一个分类模型(Alexnet)

步骤二:对该模型做fine-tuning

  • 将分类数从1000改为21,比如20种物体 + 1个背景

  • 去掉最后一个全连接层

步骤三:特征提取

  • 提取图像的所有候选框(选择性搜索Selective Search)

  • 对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(对候选框提取到的特征)存到硬盘

步骤四:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别

每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative。

比如下图,就是狗分类的SVM

步骤五:使用回归器精细修正候选框位置:对每一个类,训练一个线性回归模型去判定这个框是否框的完美

&缺点

R-CNN第一步对原始图片通过Selective Search提取的候选框region proposal多大2000个左右,而这2000个候选框每个框度需要进行CNN提取特征 + SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都要47s

参考地址:

https://cloud.tencent.com/developer/news/281788

https://blog.csdn.net/wopawn/article/details/52133338

https://www.cnblogs.com/zyly/p/9246221.html

目标检测算法之R-CNN算法详解的更多相关文章

  1. 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)

    十月一的假期转眼就结束了,这个假期带女朋友到处玩了玩,虽然经济仿佛要陷入危机,不过没关系,要是吃不上饭就看书,吃精神粮食也不错,哈哈!开个玩笑,是要收收心好好干活了,继续写Faster-RCNN的代码 ...

  2. 目标检测之Faster-RCNN的pytorch代码详解(模型训练篇)

    本文所用代码gayhub的地址:https://github.com/chenyuntc/simple-faster-rcnn-pytorch  (非本人所写,博文只是解释代码) 好长时间没有发博客了 ...

  3. 目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)

    首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple- ...

  4. OpenCV: Canny边缘检测算法原理及其VC实现详解(转载)

    原文地址:http://blog.csdn.net/likezhaobin/article/details/6892176 原文地址:http://blog.csdn.net/likezhaobin/ ...

  5. Canny边缘检测算法原理及其VC实现详解(一)

    转自:http://blog.csdn.net/likezhaobin/article/details/6892176 图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个 ...

  6. Floyd算法(一)之 C语言详解

    本章介绍弗洛伊德算法.和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3 ...

  7. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  8. 二分算法题目训练(二)——Exams详解

    CodeForces732D——Exams 详解 Exam 题目描述(google翻译) Vasiliy的考试期限将持续n天.他必须通过m门科目的考试.受试者编号为1至m. 大约每天我们都知道当天可以 ...

  9. spfa算法及判负环详解

    spfa     (Shortest Path Faster Algorithm) 是一种单源最短路径的算法,基于Bellman-Ford算法上由队列优化实现. 什么是Bellman_Ford,百度内 ...

  10. Canny边缘检测算法原理及其VC实现详解(二)

    转自:http://blog.csdn.net/likezhaobin/article/details/6892629 3.  Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像 ...

随机推荐

  1. 目标检测----ImageAI使用

    1.开源项目  github地址  https://github.com/OlafenwaMoses/ImageAI 2.目标检测(Object Detection)入门概要 3.Pycharm中无法 ...

  2. ASP.NET Core中使用Unity5

    ⒈添加相关依赖 Install-Package Unity Install-Package Unity.RegistrationByConvention ⒉扫描项目接口实现类 using System ...

  3. [转]python3之日期和时间

    转自:https://www.cnblogs.com/zhangxinqi/p/7687862.html#_label6 阅读目录 1.python3日期和时间 2.时间元组 3.获取格式化的时间 4 ...

  4. Euclideanloss_layer层解析

    这里说一下euclidean_loss_layer.cpp关于该欧式loss层的解析,代码如下: #include <vector> #include "caffe/layers ...

  5. Bringing Native Performance to Electron

    Bringing Native Performance to Electron https://realm.io/blog/native-performance-electron-realm/ Rea ...

  6. 关于DateTime自带的AddSeconds等函数的坑

    在此记录一下今天在写一个进程查杀小程序时碰到的关于DateTime的问题:  第一次是用AddSeconds后的时间直接和DateTime.Now做相等判断. class Program { stat ...

  7. ubuntu 安装 eclipse 及其CDT

    CDT是在eclipse平台上进行c/c++程序开发的插件.首先安装eclipse平台. 1.在Ubuntu 16.04上查看 eclipse是否已经安装: eclipse 若已经安装,则会进入到ec ...

  8. 使用tomcat发布含有shtml文件的web程序

    平常都是使用html或jsp,当导入含有shtml的一个web项目时,向平常一样使用Jetty运行,访问到shtml文件时,直接在浏览器上显示出了源码. 查询,使用tomcat发布,修改tomcat的 ...

  9. Light OJ 1102

    题意: 给你一个数 N , 求分成 K 个数 (可以为 0 ) 的种数: 思路: 类似 在K个抽屉放入 N 个苹果, 不为0, 就是 在 n-1 个空隙中选 m-1个: 为 0, 就可以先在 K 个抽 ...

  10. 解决:Gitlab的developer角色的人没有push权限无法提交(转)

    问题 几位同事合作搞一些东西,打算在Gitlab上建一个仓库,然后协同开发.建好仓库后,将其他几位同事添加进来,角色分配为Developer. 之后提交初始代码到master分支后,他们用source ...