Faster RCNN网络数据流总结

前言

在学习Faster RCNN时,看了许多别人写的博客。看了以后,对Faster RCNN整理有了一个大概的了解,但是对训练时网络内部的数据流还不是很清楚,所以在结合这个版本的faster rcnn代码情况下,对网络数据流进行总结。以便自己更好地掌握Faster rcnn。

训练时的数据流

在这个版本的代码中,训练时的batch_size为1。原论文中的网络架构如下所示:
在这里插入图片描述

1 ◯ \textcircled{\scriptsize 1} 1 网络输入

第一部分是网络的输入。网络的输入是一个任意大小的图像,但是在被送入网络之前,会经过一个缩放操作,然后进行normalize。对图像进行缩放的同时,也要对gt_bbox(ground truth bounding box,真实边界框)进行同样的缩放。
具体是怎么缩放的呢?参考这里的代码。

def preprocess(img, min_size=600, max_size=1000):# img: 输入图像# min_size: 图像放缩的最小大小# max_size: 图像放缩的最大大小C, H, W = img.shapescale1 = min_size / min(H, W)scale2 = max_size / max(H, W)scale = min(scale1, scale2)img = img / 255.# resize缩放大小  长和宽等比例缩放img = sktsf.resize(img, (C, H * scale, W * scale), mode='reflect',anti_aliasing=False)

这样的等比例缩放方式,结果就是要么原图较长的边被放大为1000,要么原图较短的边被放大为600。整体上来看是设定了一个放大后的最大最小范围。因为batch_size为1,所以每一张图像缩放后的大小可以不一样,如果batch_size不为1,那么这一个batch内的所有图像缩放后的大小就必须一样。在接下来的讨论中我们忽略batch维度(因为batch是1)

2 ◯ \textcircled{\color{green}\scriptsize 2} 2 特征提取网络

第二部分是特征提取模块。这里的特征提取网络是VGG16,只不过去掉了最后的几层全连接。这里感觉唯一要注意的地方就是,输入图像经过VGG16,大小缩小了16倍(因为有4个池化层),维度增加到了512维度。
如果输入图像 I i n p u t I^{input} Iinput的大小是 [ 3 , x , y ] \left[3,x,y\right] [3,x,y],那么经过特征提取的特征图 I f e a t u r e I^{feature} Ifeature的大小是 [ 512 , x 16 , y 16 ] \left[512, \frac{x}{16},\frac{y}{16}\right] [512,16x,16y]

3 ◯ \textcircled{\color{purple}\scriptsize 3} 3 RPN网络

RPN网络的输入是特征图,先经过通道数为512的3x3卷积,输出仍为 [ 512 , x 16 , y 16 ] \left[512, \frac{x}{16},\frac{y}{16}\right] [512,16x,16y]
右边这个分支为通道数为36(36是因为每个点有9个anchor,每个anchor有4个坐标)的1x1卷积,输出为 [ 36 , x 16 , y 16 ] \left[36, \frac{x}{16},\frac{y}{16}\right] [36,16x,16y],然后对其进行reshap为 [ a n c h o r 的总数 , 4 ] \left[ anchor的总数,4\right] [anchor的总数,4]大小,记为rpn_loc。
左边这个分支为通道数为18(18是因为每个点有9个anchor,每个anchor要么是背景要么是前景,两种可能)的1x1卷积,输出为 [ 18 , x 16 , y 16 ] \left[18, \frac{x}{16},\frac{y}{16}\right] [18,16x,16y]。然后对其经过softmax处理,最终的输出大小为 [ a n c h o r 的总数 , 2 ] \left[anchor的总数,2\right] [anchor的总数,2],记为rpn_score。

在这里插入图片描述
上述这点清楚以后,我们接下来重点关注RPN网络是如何计算损失的,称之为 L o s s R P N Loss^{RPN} LossRPN。我们都知道,计算loss需要网络输出值和标签值,现在网络输出值已经有了,那么标签值从何而来呢?
从上图可以看到有一个AnchorTargeCreator模块,这个模块的输入是我们产生anchor和gt_bbox,计算出anchor与gt_bbox的真实偏差gt_rpn_loc和该anchor到底负责的是背景还是前景gt_rpn_label。我们就分别将gt_rpn_loc和gt_rpn_label作为标签值与rpn_score、rpn_score计算损失,两个损失之和即为 L o s s R P N Loss^{RPN} LossRPN。损失的具体计算公式这里我们不谈。

在bbuf大佬的解读里,“AnchorTargetCreator 就是将 20000 多个候选的 Anchor 选出 256 个 Anchor 进行分类和回归。”代码里也是采样出了256个样本,但是最后返回的真实标签值是所有的anchor大小,而不是256大小。

ProposalCreator模块的含义如下:
在这里插入图片描述
综上,rpn网络除了自身反向传播训练之外,还通过ProposalCreator模块输出2000个anchor。

4 ◯ \textcircled{\color{blue}\scriptsize 4} 4 ProposalTargetCreator模块

ProposalCreator模块输出2000个ROIS并不全部都使用,经过ProposalTargetCreator模块的筛选(通过与gt_bbox的IOU进行筛选)产生正负一共128个rois。同时输出这128个rois的gt_label和gt_loc。

5 ◯ \textcircled{\color{blue}\scriptsize 5} 5 ROI pooling

这里的ROI pooling和fast rcnn中的是一样的,它的输入是特征图128个rois。ROI Pooling将这些不同尺寸的区域全部pooling到同一个尺度(7x7)上。ROP pooling的输出输入给classifier。

6 ◯ \textcircled{\color{blue}\scriptsize 6} 6 classifier

这里的classifier如下图紫色框出的所示。
在这里插入图片描述
这块的全连接网络可以借用VGG16的全连接网络,代码中也是这么做的。
21代表总共有21类,每个anchor属于每个类的概率,输出为 [ 128 , 21 ] [128,21] [128,21];84 = 21 *4,对每个类别都会有一个坐标信息,输出为 [ 128 , 84 ] [128,84] [128,84],然后分别和gt_label、gt_loc计算损失后相加即为classifier的损失。
suppress为推理时的非极大值抑制,训练时用不到。

反向传播

综上所述,我们将rpn网络的损失和classifier的损失相加,然后进行反向传播即可更新参数。
最后放上BBuf大佬总结的faster rcnn的网络流程图。
在这里插入图片描述
本人才识浅薄,若博文中有不正确的地方,欢迎大家进行批评指正,谢谢。
参考连接:giantpandacv
simple-faster-rcnn-pytorch

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

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

相关文章

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…

Python——利用列表推导式实现乘法口诀

直接上代码: print("\n".join([" ".join(["{}*{}{}".format(x, y, x*y) for x in range(1,y1)]) for y in range(1,10)]))结果如下: 1*11 1*22 2*24 1*33 2*36 3*39 1*44 2*48 3*412 4*416 1*55 2*510 3*515 4*520 5*52…

ARM--day7(cortex_M4核LED实验流程、异常源、异常处理模式、异常向量表、异常处理流程、软中断编程、cortex_A7核中断实验)

软中断代码:(keil软件) .text .global _start _start:1.构建异常向量表b resetb undef_interruptb software_interruptb prefetch_dataabortb data_abortb .b irqb fiq reset:2.系统一上电,程序运行在SVC模式1>>初始化SVC模…

excel中如果A列中某项有多条记录,针对A列中相同的项,将B列值进行相加合并统计

excel中如果A列中某项有多条记录,针对A列中相同的项,将B列值进行相加合并统计。 如: 实现方法: C1、D1中分别输入公式,然后下拉 IF(COUNTIF($A$1:A1,A1)1, A1,"") #A1根据实际情况调整,如果…

从零开始学习YOLOv5 保姆级教程

一、前言 YOLO系列是one-stage且是基于深度学习的回归方法,而R-CNN、Fast-RCNN、Faster-RCNN等是two-stage且是基于深度学习的分类方法。 YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得…

MPP 还是主流架构吗

MPP 架构: MPP 架构的产品: Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务,目前很多大型互联网公司都大规模运行这样的系统,稳定可靠,低成本。…

【C++奇遇记】内存模型

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如…

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 2 1, 4 1 3。 时间限制:10000 内存限制:65536 输入 共两行&#x…

2023国赛数学建模B题思路模型代码 高教社杯

本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…

svg mask和stroke冲突问题

目录 先说结论各种样例首先是水平、垂直的线然后是斜线如果是图形加stroke呢用《g》标签包起来呢 总结 先说结论 实际上svg里,mask对svg内元素起作用的并非元素本身,而是元素几何形状的外包矩形,特别是和stroke有冲突,会产生奇怪…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信:队列、信号量、互斥量,事件组,任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)使用…

苍穹外卖 day3 实现登录过程中MD5加密

一 原来是明文存的 密码可见度太高,MD5加密为密文图像 效果 二 密文实现步骤 修改明文密码,改成密文 123456 密文值:e10adc3949ba59abbe56e057f20f883e代码如下所示 在这里插入代码片 package com.sky.service.impl;import com.sky.con…

Vue使用Animate.css

说一下Animate.css这个动画库,很多的动画在这个库里面都定义好了,我们用的时候可以直接使用里面的类名就可以了,就是直接目标元素绑定对应的类名就可以实现动画效果,非常方便,库其实也相对简单,使用起来也简…

数据结构(3)

线性表是多个具有相同特征的数据的有限序列。 前驱元素:A在B前面,称A为B的前驱元素。 后继元素:B在A后面,称B为A的后继元素。 线性表特征: 1.一个元素没有前驱元素,就是头结点; 2.最后一个…

法线矩阵推导

法线矩阵推导 https://zhuanlan.zhihu.com/p/72734738 https://juejin.cn/post/7113952418613690382 https://blog.csdn.net/wangjianxin97?typeblog 1、为什么需要法线矩阵 vec3 normalEyeSpace modelViewMatrix * normal;如果模型矩阵执行了非等比缩放, 顶点的改变会导致法…

PSP - 蛋白质结构预测 AlphaFold2 的结构模版 (Template) 搜索与特征逻辑

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132427617 结构模版 (Template) 是一种已知的蛋白质结构,可以作为 AlphaFold2 蛋白质结构预测的参考,AlphaFold2 可以从多…

springMVC 已解密的登录请求

问题描述: 解决方案: 1.对用户所输入的密码在页面进行MD5加密并反馈至密码输入框。 2. 手动生成SSL安全访问证书;在此不做介绍,相关方法可通过网上查找; 3. 将产品HTTP访问方式改为SSL安全访问方式;在Ap…

【C++】STL——map的介绍和使用、map的构造函数、map的迭代器、map的容量和访问函数、map的增删查改函数

文章目录 1.map的介绍2.map的使用2.1map的构造函数2.2map的迭代器2.3map的容量和访问函数2.4map的增删查改函数 1.map的介绍 map的介绍 (1)map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。 &#xff…

【React学习】React组件生命周期

1. 介绍 在 React 中,组件的生命周期是指组件从被创建到被销毁的整个过程。React框架提供了一系列生命周期方法,在不同的生命周期方法中,开发人员可以执行不同的操作,例如初始化状态、数据加载、渲染、更新等。一个组件的生命周期…

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…