RCNN,Fast RCNN,Faster RCNN 的前生今世:(2) R- CNN (3,2,1)
3、三次IOU 2、2次model run 1,一次深度神经网络
rcnn主要作用就是用于物体检测,就是首先通过selective search 选择2000个候选区域,这些区域中有我们需要的所对应的物体的bounding-box,然后对于每一个region proposal 都wrap到固定的大小的scale,227*227(AlexNet Input),对于每一个处理之后的图片,把他都放到CNN上去进行特征提取,得到每个region proposal的feature map,这些特征用固定长度的特征集合feature vector来表示。
最后对于每一个类别,我们都会得到很多的feature vector,然后把这些特征向量直接放到svm现行分类器去判断,当前region所对应的实物是background还是所对应的物体类别,每个region 都会给出所对应的score,因为有些时候并不是说这些region中所包含的实物就一点都不存在,有些包含的多有些包含的少,包含的多少还需要合适的bounding-box,所以我们才会对于每一region给出包含实物类别多少的分数,选出前几个对大数值,然后再用非极大值抑制canny来进行边缘检测,最后就会得到所对应的bounding-box啦.
整个架构如下图所示:
这篇paper中作者指出两个在inference的时候的关键点:第一:全部的参数在每种class类别都是共享的。第二点:和其他的方法相比较,我们最后的feature vector的维度都是相对较低的。
还有一个注意的地方:CNN中每层的参数都是如何训练出来的呢?首先:我们在ILSVRC 2012的数据集上进行分类训练,主要模拟的CNN模型是利用AlexNet进行分类,虽然最后的结果精度会有所降低,只是因为有些小小的改变而已,无伤大雅。这个过程是"pre-training"
如下图所示:
然后需要做的就是"fine-runing",主要就是对上面得到的model进行稍微的改动。首先改变了数据集的大小,前面用的数据集是比较大的,主要适用于进行分类,这里我们主要使用的是相对较小的,并且是通过selective search之后的region proposal 作为网络的输入。如果当前region proposal的IOU大于0.5,把他标记为positive,其余的是作为negtive,去训练detection网络。并且对SGD的参数进行的适当的修改。
这个时候,上面的model中训练好了,之后,就需要对每一个region proposal进行特征集合feature vector训练好了,得到了特征就可以对每一个得到的特征输入到SVM进行分类看看这个feature vector所对应的region proposal是需要的物体呢?还是无关的实物(background),排序,canny边界检测之后就得到了我们需要的bounding-box啦.
如下所示:
conclusion:
整个系统分为三个部分:
1.产生不依赖与特定类别的region proposals,这些region proposals定义了一个整个检测器可以获得的候选目标
2.一个大的卷积神经网络,对每个region产生一个固定长度的特征向量
3.一系列特定类别的线性SVM分类器。
2.1模块设计
- region proposals 作者指出近几年有很多的产生region proposals的方法,而RCNN中使用的是【J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selectivesearch for object recognition. IJCV, 2013.】和【X. Wang, M. Yang, S. Zhu, and Y. Lin. Regionlets for generic objectdetection. In ICCV, 2013.】中的方法。
- Feature extraction 对于region proposals的特征提取,作者使用的是caffe框架,所使用的模型是在Imagenet数据集上的Alexnet模型。因为卷积神经网络要求输入的图片都是一样尺寸的,所以在计算每个region proposals的特征前会对每个region都归到一样大
2.2测试阶段的检测
测试阶段,使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。
然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制去除相交的多余的框。
非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到一类的结果。作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性。
首先计算出所有窗口的面积,对所有窗口的分数进行从小到大排序取出最高分数的序号。循环计算1到次高分数窗口与最高分数窗口的交叉面积与两者间最小面积的比例,若超过overlap那么把这一窗口(1~~last中的窗口)抑制了。
2.3训练阶段
- 有监督预训练 作者使用caffe框架利用ILSVRC 2012的数据集(应该就是imagenet吧)对网络模型进行了训练,使网络模型中的参数都是经过训练过的参数,而不是刚开始那样随机初始化的参数
- 特定领域的fine-tuning 为了适应不同场合的识别需要,如VOC,对网络继续使用从VOC图片集上对region proposals归一化后的图片进行训练。网络只需要将最后的1000类的分类层换成21类的分类层(20个VOC中的类别和1个背景类),其他都不需要变。为了保证训练只是对网络的微调而不是大幅度的变化,网络的学习率只设置成了0.001。
- **计算每个region proposal与人工标注的框的IoU,IoU重叠阈值设为0.5,大于这个阈值的作为正样本,其他的作为负样本,然后在训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练(这么做的主要原因还是正样本图片太少了)
- 特定类别的分类器 对每个类都训练一个线性的SVM分类器,训练SVM需要正负样本文件,可以想象得到,刚好包含某一类物体的region proposal应该是正样本,完全不包含的region proposal应该是负样本,但是对于部分包含某一类物体的region proposal该如何训练呢,作者同样是使用IoU阈值的方法,这次的阈值为0.3,计算每一个region proposal与标准框的IoU,大于这个阈值的作为正样本,小于的作为负样本。由于训练样本比较大,作者使用了standard hard negative mining method(具体reference to hard negative mining of my blog)来训练分类器。
- 作者表示在补充材料中讨论了为什么fine-tuning和训练SVM时所用的正负样本标准不一样(0.5和0.3),以及为什么不直接用卷积神经网络的输出来分类而要单独训练SVM来分类(see the folowing bolg, and it will make it done) 。
总之感觉:r-cnn有点麻烦,他要先过一次classification得到分类的model,继而在得到的model上进行适当的改变又得到了detection的model,最后才开始在detection model cnn上进行边界检测。
好麻烦,因为rcnn首先需要在AlexNet上进行分类的训练model,得到AlexNet之后才能进行分类(Pretrained procedure->SoftMax2SVM)。分类之后在改一下AxlexNet model (fc: 1000->21)得到detection model(training)->(testing)
然后在上面利用SVM进行二分类判断当前的region有没有包含我们需要的物体(对结果进行排序,取前面的IOU最大的那几个(nms)),在对这些进行canny边缘检测,才可以得到bounding-box(then B-BoxRegression)。
简单地说:就是r-cnn需要两次进行跑cnn model,第一次得到classification的结果,第二次才能得到(nms+b-box regression)bounding-box。
但是r-cnn也不是一事无成,人家还是有自己的特点嘛,就提在原来的架构上提出为啥不用CNN来进行特征提取,而是用那些老套的sift,hog呢?当然科研界的大牛还是很厉害的啦,在r-cnn的基础上就提出了fast-rcnn,它解决了rcnn中跑了两次cnn才分别得到classification和bounding-box,牛掰之处在于ROI层的提出.
RCNN,Fast RCNN,Faster RCNN 的前生今世:(2) R- CNN (3,2,1)的更多相关文章
- Java NIO 的前生今世 之四 NIO Selector 详解
Selector Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一 ...
- 揭秘 BPF map 前生今世
揭秘 BPF map 前生今世 本文地址:https://www.ebpf.top/post/map_internal 1. 前言 众所周知,map 可用于内核 BPF 程序和用户应用程序之间实现双向 ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(2)R-CNN
Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作.作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于 ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(4) Fast RCNN 算法详解
继2014年的RCNN之后,Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度.在Github上提供了源码. 同样使用最大规模的网络,Fast ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(3) SPP - Net
SPP-Net是出自2015年发表在IEEE上的论文-<Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Reco ...
- 月光宝盒之时间魔法--java时间的前生今世
月光宝盒花絮 “曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜,等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此.如果可以给我一个机会再来一次的话,我会跟那个女孩子说我爱她,如果非要把这份爱加上 ...
- RCNN,Fast RCNN,Faster RCNN 的前生今世:(1) Selective Search
Selective Search for Object Recoginition 这篇论文是J.R.R. Uijlings发表在2012 IJCV上的一篇文章,主要介绍了选择性搜索(Selective ...
- RPC 原理的前生今世
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 在校期间大家都写过不少程序, ...
- 主动降噪技术(ANC)的前生今世--原理仿真
一 原理: 主动降噪就是通过反相检测麦克风的声音或噪声来减弱周围环境的噪声让扬声器出来的声音听起来更清晰.主动降噪技术的目标就是通过一个自适应滤波器把不想要的噪声反相从而把噪声约束到固定的范围内.该系 ...
随机推荐
- LeetCode 611. 有效三角形的个数(Valid Triangle Number)
611. 有效三角形的个数 611. Valid Triangle Number 题目描述 LeetCode LeetCode LeetCode611. Valid Triangle Number中等 ...
- KAFA架构及其基本概念
1.目标 - KAFA价格 在我们上一篇Kafka教程中,我们讨论了Kafka用例和应用程序.今天,在这个Kafka教程中,我们将讨论Kafka Architecture.在这篇Kafka Archi ...
- DolphinPHP(海豚框架)初步学习
由于工作原因需要学习DolphinPHP框架,在此记录一下! 首先交代下环境,我用的是phpStudy集成环境,然后海豚框架是最新的1.4.2版本 ok,接下来我们开始学习,最基础的,是我们需要将我们 ...
- Appium移动端测试--搭建测试环境
目录 文章目录如下 安装Android Studio及Android SDK 更改VDM默认存储路径 通过npm安装Appium Server 启动Appium GUI模式 Appium连接会话 Ap ...
- linux中用户环境变量问题
修改所有用户的环境变量:/etc/profile文件 只修改root用户的环境变量:~/.bashrc文件 只修改某个非root用户的环境变量:/home/非root用户名/.bashrc文件
- tkinter学习笔记_05
10.菜单 menuber import tkinter as tk root = tk.Tk() root.title("xxx") root.geometry('200x100 ...
- GitHub Action一键部署配置,值得拥有
最近由于自己的个人应用增加,每次都需要在服务器手动发布,觉得特别麻烦,所以想通过代码控制自动发布,直接选择了GitHub Action. GitHub Action持续集成服务,目前已经免费开放使用, ...
- Eclipse 安装反编译插件 Eclipse Class Decompiler
Eclipse Class Decompiler在线安装方法 https://blog.csdn.net/tangjinquan1157/article/details/77506015 Eclips ...
- NIO开发Http服务器(4):Response封装和响应
最近学习了Java NIO技术,觉得不能再去写一些Hello World的学习demo了,而且也不想再像学习IO时那样编写一个控制台(或者带界面)聊天室.我们是做WEB开发的,整天围着tomcat.n ...
- openwrt luci web分析
openwrt luci web分析 来源 https://www.jianshu.com/p/596485f95cf2 www/cbi-bin/luci #!/usr/bin/lua --cgi的执 ...