faster rcnn resnet_RCNN, Fast R-CNN 与 Faster RCNN理解及改进方法

RCNN

这个网络也是目标检测的鼻祖了。其原理非常简单,主要通过提取多个Region Proposal(候选区域)来判断位置,作者认为以往的对每个滑动窗口进行检测算法是一种浪费资源的方式。在RCNN中,不再对所有的滑动窗口跑算法,而是只选择一些窗口,在少数窗口上运行CNN。

流程是:

  1. 输入图像
  2. 利用selective search对图像生成1K~2K的候选区域(region proposal),这个量比传统的算法要少得多。具体一点,选出region proposal的方法是运行图像分割算法,对于分割算法跑出来的块,把它作为可能的region proposal输出。
  3. 提取特征:将region proposal resize为统一大小,送进去掉了softmax的CNN,对每个候region proposal提取特征
  4. 对区域进行分类:对从CNN output出来的特征向量送进每一类的SVM分类, 如果我有十个类别,那么每个region proposal要跑10个SVM,得到类别。这里为什么要用SVM而不是softmax,有一种说法是为了解决样本不均衡的问题,另外是早期神经网络还不如现在这样发达,当时SVM还是比较领先的分类器。
  5. 修正:对CNN output的特征向量(这个特征向量和第4步中拿去喂给SVM的是一个向量)做回归(左上角右下角的四个坐标),修正region proposal的位置。

d8d18629280b29ec1201a43e21cd7975.png

Fast R-CNN

前面聊的这个RCNN吧,有几点问题:

  1. 可以明显地感受到它的计算量是非常大的,毕竟要对每个候选区域都进行特征计算。
  2. 冗余计算太多了,毕竟候选区域高度重叠。
  3. 同时又不是端到端的训练,还麻烦。
  4. 内存占用:需要储存多个SVM分类器和bounding box 回归器
  5. 对输入图片的大小有硬性要求

这种情况下,二代目fast R-CNN出现了,它的流程是:

  1. 将任意size的图片输入CNN,得到特征图。在RCNN中,先生成region proposals再做卷积,相当于做了多次卷积,浪费时间。
  2. 对原始图片使用selective search算法得到约2k region proposals(相当于RCNN的第一步)
  3. 在特征图中找到每一个region proposals对应的特征框。在ROI池化层中将每个特征框池化到统一大小
  4. 统一大小的特征框经过全连接层得到固定大小的特征向量,分别进行softmax分类(使用softmax代替了RCNN里面的多个SVM分类器)和bbox回归

Fast R-CNN组合了classification和regression, 做成single Network,实现了端到端的训练,实际上它相对RCNN最大的改进是抛弃了多个SVM分类器和bounding box回归器的做法,一起输出bbox和label, 很大程度上提升了原始RCNN的速度。

b5c1d8c597a89b79ade882a26a0db834.png

这里出现了一个新的概念,ROI Polling,很重要,是考点,解释一下:

ROI Pooling(Region of Interest)

它的输入是特征图,输出则是大小固定的channel x H x W的vector。ROI Pooling是将一个个大小不同的region proposals,映射成大小固定的(W x H)的矩形框。它的作用是根据region proposals的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和输出回归框操作。它可以加速处理速度。这个ROI Pooling在下面的Faster RCNN也会出现,它的作用是类似的,就是将region proposals池化成同样大小的vector,便于传入后续分类网络。

ROI Pooling有两个输入,一个是图片进入CNN后的特征图,另一个是区域的边框。ROI 的输出是一个region_nums x channels x W x H的向量。

说到这里耶解释一下ROI Pooling的进阶版本ROI Align。

ROI Pooling在池化的时候需要对浮点数边界int化,这样会存在一定的偏差。在特征图比原始图片尺寸小的情况下,一点点的精度损失映射到原始图片上就存在很大的像素点差别。而ROI Align就是取消了取整的操作,使用双线性内插的方法获得坐标未浮点数的像素点上的图像数值。

Faster RCNN

在Fast RCNN的基础上,Faster RCNN在性能上又有了进步。Faster RCNN将特征抽取(feature extraction),proposal提取,bounding box regression,classification都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。对比起它哥哥Fast-RCNN, 其实最重要的一点就是使用RPN(下面会详细解说)来代替原来使用分割算法生成候选框的方式,极大的提升了检测框生成速度。总地来说,Faster RCNN对Fast RCNN的改进点在于获得region proposals的速度要快很多。

具体来说,它的网络结构长这样:

7d5744e5cb2b72c860d0e1dd2308d4b5.png
  1. 提取特征:输入固定大小的图片,进过卷积层提取特征图feature maps
  2. 生成region proposals: 然后经过Region Proposal Networks(RPN)生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box 回归修正anchors获得精确的proposals(候选区域)。
  3. ROI Pooling: 该层的输入是feature maps和proposals,综合这些信息后提取proposal feature maps
  4. Classification: 将Roi pooling生成的proposal feature maps分别传入softmax分类和bounding box regression获得检测物体类别和检测框最终的精确位置。

具体一点的图长这样:

7f7c066c0e46f16fb70334b81c007408.png

Region Proposal Network(RPN)

Faster-RCNN的巨大优势主要在于第二步Region Proposal Networks(RPN)的设计。传统的Selective Search方法生成检测框都很耗时。而使用RPN生成就会快很多,我们来看看RPN的原理叭

RPN的作用是用来提取候选框的,类似于前面介绍的RCNN的第一步Selective Search它的网络结构基于神经网络,但是输出的是包含二元softmax和bbox回归的多任务模型。RPN网络的输入是前面CNN output的feature maps。我们在feature map上做一个大小为3x3的滑窗操作, 得到一个channel是256维的特征图,尺寸与input的特征图相同,维度是256*H*W。对这个256维的向量,我们分别做两次1x1卷积操作,一个得到2k score, 一个得到4k coordinates。这个2k score只区分是不是目标,输出候选区域属于前景(物体)和背景的分数,这里注意,这里的分类只区分是否包含目标,至于所包含目标的类别,是Faster-RCNN最后的分类网络干的事情。4k coordinates指的是对原图坐标的偏移。

0bc77fc344667a479588aa8217093c84.png

那么这个k又是什么东西呀?这里有一个anchor的概念,也是RPN的核心之一。论文预先设定好生成9个anchors。我们前面说到对于feature map, 我们有一个3*3的滑窗操作。对于每次滑窗所划到的3x3的区域,就以该区域中心点为坐标,生成9个anchor。anchor它的本质是,将相同尺寸的输入,得到不同尺寸的输出。它们的中心相同,但是有不同的长宽比和尺度。这9个anchor, 中心坐标一样,但是大小各不相同,如下图:

13100505d7f71b3ac4fdad4e58442cbb.png

而上文提到的k就是anchors的数量,所以2k个分数就是9个anchors的共18个分数,36个坐标。对于每个anchor, 计算anchor与ground-truth bounding boxes的IoU,大于0.7则判定为有目标,小于0.3则判定为背景,介于0.3-0.7,则设为0,不参与训练

这么说完可能还是有点模糊,我们来看看RPN的代价函数:

代价函数有两部分,对应着RPN的两条路线,即是否包含目标和bbox的坐标与anchor坐标的回归误差。注意回归误差这一项中,L与p相称,也就是说,如果anchor不包含目标,那么box输出位置是不算误差的,对于

,只计算
判定为有目标的anchor。总的来说
,就是交叉熵,分类的损失;
,计算每个anchor分配的四个坐标和ground truth的坐标的偏移量,用的是L1范数。看一下pytorch的官方实现你就懂了:
self

插嘴一句,我们现在在做目标检测基本是用YOLO了,贼快,Faster RCNN虽然已经Faster了还是YOLO快!当然region proposals的概念很值得了解,YOLO的缺点是在检测小目标时难以得到精确的定位。

Faster R_CNN改进方法

Faster R-CNN从2015年被提出,后来也出现了不少改进方法,下面列举一些方向,有兴趣可以再去深入研究:

  • 提取特征网络的改进:使用ResNet代替原来的VGG提取特征,效果显著
  • RPN升级版本:FPN
  • ROI升级:PS_RPI
  • R-FCN
  • Mask R-CNN
  • DeepText
  • 训练过程中的hard-example finetune,可参见:视觉分类任务中处理不平衡问题的loss比较 - Daniel2333的博客 - CSDN博客
  • A-Fast-RCNN, 这篇文章引入了GAN, 在某些数据集上精度增加

参考文献

晓雷:RCNN- 将CNN引入目标检测的开山之作

最帅的大厨:RCNN-> SPP net -> Fast RCNN -> Faster RCNN

Fast R-CNN论文详解 - WoPawn的博客 - CSDN博客

CNN目标检测(一):Faster RCNN详解

RPN 解析 - lanran2的博客 - CSDN博客

目标检测 - Faster R-CNN 中 RPN 原理

RPN 解析 - lanran2的博客 - CSDN博客

目标检测 - Faster R-CNN 中 RPN 原理

Faster-RCNN算法精读 - hunterlew的专栏 - CSDN博客

详解 ROI Align 的基本原理和实现细节

Faster R-CNN 深入理解 && 改进方法汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言字符串定界符,关于c ++:按字符分割字符串

我知道这是一个非常简单的问题,但我只想一次为自己解决我只想使用字符作为分割定界符将字符串分割成数组。 (很像C#著名的.Split()函数。我当然可以应用蛮力方法,但是我想知道是否有什么更好的方法了。)到目前为止,我已经搜索过&a…

vue 组件不受全局样式影响_组件库引入全局样式lib/style/index.css,会污染全局基础样式...

I have searched the issues of this repository and believe that this is not a duplicate.Version1.3.14Environmentmacos 10.14.6,chrome76.0.3809.100(正式版本),vue 2.6Reproduction linkSteps to reproduce在chrome extension 插件开发中使用ant-…

ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11

前面发了几个求助的帖子,希望有朋友能提供些Factory Talk View V11的安装和授权,但是一直没有什么回复,今天结合别人的经验,算是把授权安装搞定了,在这里发布出来,希望能帮助到更多的朋友,授权和…

c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输

一.项目要求Please choose one of following programing languages: C, C, Java, Python;本项目采用的是python3.6LFTP should use a client-server service model;本项目使用客户端-服务器的模式LFTP must include a client side program and a server side program; Client s…

jquery设置video的宽度_jquery html5 视频播放控制代码

jQuery HTML5 视频播放控制核心代码:您的浏览器不支持html5!$(video).click(function() {if ($(this).hasClass(pause) ) {$("video").trigger("play");$(this).removeClass(pause);$(this).addClass(play);} else {$("video&q…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!算术是什么意思数学什么是算术和算术和是正数的和,即绝对值的和,例如213.57,…

嘉兴python培训_嘉服集团

请下拉查看…… 嘉服集团工作简报2020年第10期 嘉服集团工作简报2020年第9期 嘉服集团工作简报2020年第8期 嘉服集团工作简报2020年第7期 嘉服集团工作简报2020年第6期 嘉服集团工作简报2020年第5期 嘉服集团工作简报2020年第4期 嘉服集团工作简报2020年第3期 嘉服集团工作简报…

steam有没有c语言软件,【图片】在steam吧你甚至可以讨论c语言_steam吧_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include /*包含字符串处理函数的头文件,可以直接调用现有的字符串处理的一系列函数了*/#includeusing namespace std;typedef struct //定义结构体{char score; /*编号*/char name[10]; /*姓名*/char num[15];…

c++ vscode 自动注释_WIN下vscode调试C/C++,从零开始生成helloworld项目【2018年6月29日】...

最近迷上了vscode这款编译器,小巧美观,用起来也很顺手,最主要的是全平台,正好最近要上手做Linux C客户端,以前没接触过linux,先拿它先在WIN上练练手。这几天在网上找了非常多的教程,win总是配不…

AVR单片机计算器C语言源程序,一个基于AVR单片机的计算器程序.doc

一个基于AVR单片机的计算器程序#include#include//延时函数的头文件#include // 中断函数的头文件#define uint unsigned int#define uchar unsigned char#define BIT(k) (1<#define DI PORTC //夜晶的数据输入端#define No_key 255//没有按键按下的返回值#define key_port …

python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...

作者 | 灰小猿责编 | 王晓曼出品 | CSDN博客最近在做项目开发的时候&#xff0c;跟小伙伴聊到修 Bug 这件事。嗯&#xff0c;对于一只没技术的程序猿来说&#xff0c;修 Bug 的确是一件让人头疼的事情&#xff0c;尤其是对于比较大型的项目开发&#xff0c;在变量较多的时候&am…

vue中传值和传引用_vue prop属性传值与传引用示例

vue prop属性传值与传引用示例vue组件在prop里根据type决定传值还是传引用。简要如下&#xff1a;传值&#xff1a;String、Number、Boolean传引用&#xff1a;Array、Object若想将数组或对象类型也以值形式传递怎么办呢&#xff1f;如下方式可以实现&#xff1a;// component-…

.sql文件_Mysql分组排序及Sql文件执行

最近在做一个临时项目&#xff0c;采用的是mysql开发&#xff0c;主要涉及两个问题&#xff1a;1.一个是传参问题&#xff1b;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义&#xff0c;特此记录一下。一.传参问题执行mysql文件&#xff0c;需要从外部传入参数时&…

laravel 异常捕获_Laravel框架捕获各种类型错误

Laravel 中的所有异常都由类App\Exceptions\Handler集中处理&#xff0c;这个类有两个方法&#xff1a;report 和 render。【report 方法】report 方法用于记录异常并将其发送给外部服务。默认情况下&#xff0c;report 方法只是将异常传递给异常基类并写入日志进行记录&#x…

android 动态库 后缀,Android Robolectric加载运行本地So动态库

前言Robolectric 是 Android 的单元测试框架&#xff0c;运行无需 Android 真机环境直接运行在 JVM 之上&#xff0c;所以在 test case 运行速度效率上有了很大提升&#xff0c;接近于 Java JUnit test(JUnit test > Robolectric ≫ androidTest)。不过框架本身并不支持 so …

java web输出语句到控制台_Java工程师(6).循环结构

搞清楚循环结构语句的执行效果与使用场景。程序中的循环流程程序中的循环流程试着编写程序实现下列功能&#xff1a;在控制台中输出100个Hello字符串。在控制台中输出从 1 到 100 的数字。… …循环结构的三要素循环结构必然包含如下三要素&#xff1a;循环变量 &#xff08;循…

sap生产工单报工_SAP系统PP (ProductionPlanning) 模块知识培训

SAP系统PP(ProductionPlanning)模块知识培训主要内容为支持生产系统规范使用SAP系统开展日常业务&#xff0c;掌握SAP系统常用操作和异常处理的方法&#xff0c;人力资源部在6月10日下午组织实施了一期《SAP系统PP模块知识》的培训。本次培训由信息技术部主管工程师解虎授课&am…

android加载百分比功能,android进度条怎么显示百分比

android布局文件里的ProgressBar长形进度条怎么自 在windows操作系统下Android studio按照如下步骤自动义ProgressBar长形进度条的样式。首先创建一个android项目&#xff0c;打开其中的XML布局文件&#xff0c;如下图&#xff1a;添加ProgressBar控件&#xff0c;如下图&#…

64位程序怎么判断指针是否有效_AArch64应用程序级编程模型

根据实现选择&#xff0c;体系结构支持多级执行特权&#xff0c;由从EL0到EL3的不同异常级别表示。EL0对应于最低的特权级别&#xff0c;通常被描述为无特权。应用层程序员模型是在EL0上执行软件的程序员模型。系统软件决定异常级别&#xff0c;因此决定软件运行的特权级别。当…

n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景

嘿&#xff0c;你有没有经历过&#xff0c;出门在外来大姨妈却没带M巾呢&#xff1f;尴尬丛生的你选择怎么做&#xff1f;现在&#xff0c;有了新选择&#xff0c;这也是今天我们迫不及待想要和你们介绍的新朋友—飞么盒子&#xff0c;由Faimes飞么品牌自主研发出品的卫生巾售卖…