Faster-rcnn详解「建议收藏」

Faster-rcnn详解「建议收藏」论文题目:FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks论文链接:论文链接论文代码:Matlab版本点击此处,Python版本点击此处作为一个目标检测领域的baseline算法,Faster-rcnn值得你去仔细理解里面的细节,如果你能深入的了解这些,我相信你会受益匪浅。…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

论文题目:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

论文链接论文链接

论文代码:Matlab版本点击此处,Python版本点击此处

 

作为一个目标检测领域的baseline算法,Faster-rcnn值得你去仔细理解里面的细节,如果你能深入的了解这些,我相信你会受益匪浅。

那么,我们还是按照总分总的顺序给大家剖析它吧。(看图吧)

Faster-rcnn详解「建议收藏」

                                                                   图1 Faster-rcnn架构图(理解版)

Faster-rcnn详解「建议收藏」

图2 Faster-rcnn架构图(精简版)

Faster-rcnn详解「建议收藏」

图3 Faster-rcnn架构图(细节版)

一、目标检测的总体框架

Faster-rcnn详解「建议收藏」

图4 目标检测框架图

观察图4,你可以发现目标检测的框架中包含4个关键模块,包括region proposal(生成ROI)、feature extraction(特征提取网络)、classification(ROI分类)、regression(ROI回归)。而faster-rcnn利用一个神经网络将这4个模块结合起来,训练了一个端到端的网络。通过观察图1、图2、图3,我们可以得到如下的结论:Faster-rcnn主要包括4个关键模块,特征提取网络、生成ROI、ROI分类、ROI回归

1. 特征提取网络:它用来从大量的图片中提取出一些不同目标的重要特征,通常由conv+relu+pool层构成,常用一些预训练好的网络(VGG、Inception、Resnet等),获得的结果叫做特征图;

2. 生成ROI:在获得的特征图的每一个点上做多个候选ROI(这里是9),然后利用分类器将这些ROI区分为背景和前景,同时利用回归器对这些ROI的位置进行初步的调整;

3. ROI分类:在RPN阶段,用来区分前景(于真实目标重叠并且其重叠区域大于0.5)和背景(不与任何目标重叠或者其重叠区域小于0.1);在Fast-rcnn阶段,用于区分不同种类的目标(猫、狗、人等);

4. ROI回归:在RPN阶段,进行初步调整;在Fast-rcnn阶段进行精确调整;

总之,其整体流程如下所示

 

  • 首先对输入的图片进行裁剪操作,并将裁剪后的图片送入预训练好的分类网络中获取该图像对应的特征图;
  • 然后在特征图上的每一个锚点上取9个候选的ROI(3个不同尺度,3个不同长宽比),并根据相应的比例将其映射到原始图像中(因为特征提取网络一般有conv和pool组成,但是只有pool会改变特征图的大小,因此最终的特征图大小和pool的个数相关);
  • 接着将这些候选的ROI输入到RPN网络中,RPN网络对这些ROI进行分类(即确定这些ROI是前景还是背景)同时对其进行初步回归(即计算这些前景ROI与真实目标之间的BB的偏差值,包括Δx、Δy、Δw、Δh),然后做NMS(非极大值抑制,即根据分类的得分对这些ROI进行排序,然后选择其中的前N个ROI);
  • 接着对这些不同大小的ROI进行ROI Pooling操作(即将其映射为特定大小的feature_map,文中是7×7),输出固定大小的feature_map
  • 最后将其输入简单的检测网络中,然后利用1×1的卷积进行分类(区分不同的类别,N+1类,多余的一类是背景,用于删除不准确的ROI),同时进行BB回归(精确的调整预测的ROI和GT的ROI之间的偏差值),从而输出一个BB集合。 

 

二、Faster-rcnn中的核心问题

 

1. 提出了“RPN”网络,在提高精度的同时提高了速度;

2. RPN网络和Fast-rcnn网络的特征共享与训练;

3. 使用了ROI Pooling技术 ;

4. 使用了NMS技术;

 

三、细节详解

1. 锚点

即特征图上的最小单位点,比如原始图像的大小是256×256,特征提取网络中含有4个pool层,然后最终获得的特征图的大小为 256/16 x 256/16,即获得一个16×16的特征图,该图中的最小单位即是锚点,由于特征图和原始图像之间存在比例关系,在特征图上面密集的点对应到原始图像上面是有16个像素的间隔,如下图所示:

Faster-rcnn详解「建议收藏」

图5 原始图像中对应的锚点

2. 候选的ROI

针对每一个锚点,然后根据不同的尺度(128、256、512pixel)和不同的长宽比(1:1、0.5:1、1:0.5)产生9个BB,如下图所示,对于16×16的特征图,最终产生16x16x9个候选的ROI。

Faster-rcnn详解「建议收藏」

图6 左侧:锚点、中心:特征图空间单一锚点在原图中的表达,右侧:所有锚点在原图中的表达

 

3. RPN网络 — 用来对特征图上面产生的多个ROI进行区分和初步定位

Faster-rcnn详解「建议收藏」

图7 RPN映射过程

RPN(如图3所示) 是用完全卷积的方式高效实现的,用基础网络返回的卷积特征图作为输入。首先,我们使用一个有 512个通道和 3×3 卷积核大小的卷积层,然后我们有两个使用 1×1 卷积核的并行卷积层,其通道数量取决于每个点的锚点数量。

对于分类层,我们对每个锚点输出两个预测值:它是背景(不是目标)的分数,和它是前景(实际的目标)的分数。

对于回归或边框调整层,我们输出四个预测值:Δx、Δy、Δw、Δh我们将会把这些值用到锚点中来得到最终的建议。

4.  ROI Pooling 

ROI Pooling的作用是通过最大池化操作将特征图上面的ROI固定为特定大小的特征图(7×7),以便进行后续的分类和包围框回归操作。

存在的问题

由于预选ROI的位置通常是有模型回归得到的,一般来说是浮点数,而赤化后的特征图要求尺度固定,因此ROI Pooling这个操作存在两次数据量化的过程。1)将候选框边界量化为整数点坐标值;2)将量化后的边界区域平均分割成kxk个单元,对每个单元的边界进行量化。事实上,经过上面的两次量化操作,此时的ROI已经和最开始的ROI之间存在一定的偏差,这个偏差会影响检测的精确度。

Faster-rcnn详解「建议收藏」

图8 ROI Pooling解释

下面我们用直观的例子具体分析一下区域不匹配问题,如图所示,这是一个Faster-rcnn检测框架。输入一张800×800的图片,图片中有一个665×665的BB中框这一只狗。图片经过特征提取网络之后,整个图片的特征图变为800/32 * 800/32,即25×25,但是665/32=20.87,带有小数,ROI Pooling直接将它量化为20。在这里引入了一次偏差。由于最终的特征映射的大小为7×7,即需要将20×20的区域映射成7×7,矩形区域的边长为2.86,又一次将其量化为2。这里再次引入了一次量化误差。经过这两次的量化,候选ROI已经出现了严重的偏差(如图中绿色部分所示)。更重要的是,在特征图上差0.1个像素,对应到原图上就是3.2个像素。

5. ROI Pooling后的检测网络

Faster-rcnn详解「建议收藏」

图9 检测网络

如上图所示,在获得7x7x512的特征映射之后,通过Flatten操作将其展开为一维向量,然后经过两个全连接层对其进行分类和回归。一个有 N+1 个单元的全连接层,其中 N 是类的总数,另外一个是背景类。一个有 4N 个单元的全连接层。我们希望有一个回归预测,因此对 N 个类别中的每一个可能的类别,我们都需要 Δx、Δy、Δw、Δh。

6. NMS(非极大值抑制)

由于锚点经常重叠,因此建议最终也会在同一个目标上重叠。为了解决重复建议的问题,我们使用一个简单的算法,称为非极大抑制(NMS)。NMS 获取按照分数排序的建议列表并对已排序的列表进行迭代,丢弃那些 IoU 值大于某个预定义阈值的建议,并提出一个具有更高分数的建议。总之,抑制的过程是一个迭代-遍历-消除的过程。如下图所示:

 

  • 将所有候选框的得分进行排序,选中最高分及其所对应的BB;

Faster-rcnn详解「建议收藏」

图10

 

  • 遍历其余的框,如果它和当前最高得分框的重叠面积大于一定的阈值,我们将其删除。

Faster-rcnn详解「建议收藏」

图11

 

  • 从没有处理的框中继续选择一个得分最高的,重复上述过程。

Faster-rcnn详解「建议收藏」

图12

6. 损失函数计算

对于每个锚点,首先在后面接上一个二分类softmax,有2个score 输出用来表示这是一个前景还是一个背景的概率 (p_i),然后再接上一个bounding box的regressor 输出代表这个锚点的4个坐标位置(t_i),因此RPN的总体Loss函数可以定义为 :

Faster-rcnn详解「建议收藏」

其中Lcls表示分类loss,这里使用两类别(前景还是背景)的log loss;Lreg表示回归loss,这里使用的是Smooth-L1;

Faster-rcnn详解「建议收藏」

i表示第i个锚点,当锚点是正beiji样本时 p_i^* =1 ,是负样本则为0 。 t_i^* 表示 一个与正样本锚点相关的ground true box坐标 (每个正样本锚点 只可能对应一个ground true box: 一个正样本锚点 与某个grand true BB对应,那么该锚点与ground true box 的IOU要么是所有anchor中最大,要么大于0.7) 。

x,y,w,h分别表示box的中心坐标、宽和高;x,x_a,x^* 分别表示 predicted box, anchor box, and ground truth box ,如下图所示;t_i 表示predict box相对于anchor box的偏移量;t_i^* 表示ground true box相对于anchor box的偏移量,学习的目标就是让前者接近后者的值。

Faster-rcnn详解「建议收藏」

图13 predicted box, anchor box, and ground truth box

 

7. 正负样本的划分

 

  • 对每个标定的ground true box区域,与其重叠比例最大的anchor记为 正样本 (保证每个ground true 至少对应一个正样本anchor);
  • 对1)剩余的anchor,如果其与某个标定区域重叠比例大于0.7,记为正样本(每个ground true box可能会对应多个正样本anchor。但每个正样本anchor 只可能对应一个grand true box);如果其与任意一个标定的重叠比例都小于0.3,记为负样本。
  • 对上面两步剩余的anchor,弃去不用;
  • 跨越图像边界的anchor弃去不用。

8. Faster-rcnn训练策略

Faster-rcnn详解「建议收藏」

图14 Faster-rcnn训练策略

 

  • 用ImageNet模型初始化,独立训练一个RPN网络;
  • 仍然用ImageNet模型初始化,但是使用上一步RPN网络产生的proposal作为输入,训练一个Fast-RCNN网络,至此,两个网络每一层的参数完全不共享;
  • 使用第二步的Fast-RCNN网络参数初始化一个新的RPN网络,但是把RPN、Fast-RCNN共享的那些卷积层的learning rate设置为0,也就是不更新,仅仅更新RPN特有的那些网络层,重新训练,此时,两个网络已经共享了所有公共的卷积层;
  • 仍然固定共享的那些网络层,把Fast-RCNN特有的网络层也加入进来,形成一个unified network,继续训练,fine tune Fast-RCNN特有的网络层,此时,该网络已经实现我们设想的目标,即网络内部预测proposal并实现检测的功能。

即进行交替训练,迭代2次的原因是作者发现多次的迭代并没有显著的改善性能。 

 

四、总结

Faster-rcnn是一个目标检测的baseline方法,值得你去仔细的研究,很建议你去实践一下,这样你可以更加清楚的了解到它的细节信息。

最后,给大家介绍一个很好用的网络可视化工具,专门用来可视化.prototxt文件,你可以将.prototxt文件中的内容复制到该链接点击打开链接,然后按下Shift+Enter,就可以看到漂亮的网络结构啦。如下所示:

Faster-rcnn详解「建议收藏」

图14 caffe可视化工具

 

参考文献:

[1] Faster R-CNN: Down the rabbit hole of modern object detection,链接地址

[2] CNN目标检测(一):Faster RCNN详解,链接地址

[3] Faster R-CNN,链接地址

[4] 详解 ROI Align 的基本原理和实现细节,链接地址

[5] NMS——非极大值抑制,链接地址

 

注意事项:

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家。

[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。

[3] 如果您在阅读本博客时遇到不理解的地方,希望可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。

[4] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

 

 

 

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185913.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • PostgreSQL 列转行问题

    PostgreSQL 列转行问题1测试表数据SELECT   relative_label_contentFROM   frk_s.label_cor_generelative_label_content——AABBCC 2列转行写法写法1:(string_agg)SELECT   frwybs,   string_agg(relative_label_co…

  • PostMan的安装和使用教程[通俗易懂]

    PostMan的安装和使用教程[通俗易懂]postman的下载官网:https://www.getpostman.com/downloads/创建账号或者用谷歌浏览器账号登录一个demo了解一下我做的是一个app,后台使用java做的,app通过ajax来请求后台,但是我不知道后台有没有请求成功!因此需要一个测试接口的东西测试我做的接口有没有问题我的app里面的ajax是这样写的api.aja…

  • 在Ubuntu 18.04上编译Linux内核

    在Ubuntu 18.04上编译Linux内核一、环境说明编译环境我选择了Ubuntu18.04的虚拟机,内核截止2018-10-14最新版为4.18.14,笔者即将编译这个版本请确保磁盘空间足够,笔者之前20G编译到最后空间不足,还得重来如果你想要查看您的空间大小或者扩充磁盘,请查看我的另一篇文章https://blog.csdn.net/qq_36290650/article/details/83057832二、编译步骤…

  • java iso8601 PT1M,iso8601

    java iso8601 PT1M,iso8601普通时间转ISO8601格式的时间publicstaticStringgetISO8601TimestampFromDateStr(Stringtimestamp){java.time.format.DateTimeFormatterdtf1=java.time.format.DateTimeFormatter.ofPattern(“yyyy-MM-ddHH:mm:ss”);Loc…

    2022年10月23日
  • vscode新建文件,默认为html[通俗易懂]

    vscode新建文件,默认为html[通俗易懂]虽然还没达到理想目标,不过还是有进步步骤如下图文字版打开vscode–选择文件–首选项–设置到达设置页面文件(14)–找到要复制代码–复制,在加个html效果如下图右下脚由纯文本变为html…

  • WPF中的资源(一) – 静态资源和动态资源

    WPF中的资源(一) – 静态资源和动态资源

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号