深度学习 -- Faster rcnn 算法流程详解

2023-11-19

      经典论文,后续很多论文以此为基础,所以搞懂流程比较重要,中间如果 有写的不对、有问题或者看不懂的地方,还望指正。如果有了新的理解,我会持续更新。

      Faster Rcnn是目前学术上用的非常多的目标检测算法,这里来认真的梳理一遍该算法的流程,主要看检测的部分。

      一、 网络结构:           

      这是faster rcnn的整个网络结构,一共有四个部分组成:

      1. CNN特征提取网络:

      2. RPN网络:

      3. ROI Pooling :

      4. classifier :

      想要把整个流程走下来,首先要理解几个必须知道的关键词:

      1.1 卷积操作(conv layer)

      何为卷积操作,看下图,图中有一个黄色的 3*3 的矩阵在绿色的矩阵上做滑窗,生成了粉色的计算结果,每一次计算都是一次卷积,这就是最简单的平面卷积,黄色的滑窗也被称为滤波器(filter)或者卷积核(Convolution kernel)。

      然后,卷积核的个数增加时,卷积的结果就等于卷积核的个数,例如 30*30*256 的 feature map 和 (3*3*256)*256作卷积,pading = 1 ,strip = 1 得到的结果仍然是30*30*256。

      1.2  anchors:

      anchors是一组由 rpn/generate_anchors.py 生成的矩形。是RPN网络提出的候选框的雏形,因为RPN网络最终要生成一定数量的 proposal(候选区域的提议),所以要先在CNN网络提取到的 feature map 上提出anchors,每个点上提出9个anchor。anchor的格式如下:

[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

# 从前到后分别是anchor左上角的坐标,右下角的坐标。
# 一共有9个矩形,3种形状,长宽比为大约为 1:1 ,2:1,1:2 三种,网络的多尺度方法就是通过anchors就引入的。

      然后来看这9个 anchors 的作用,下图是Faster RCNN论文中的原图,最下面的是卷积后得到的 feature maps ,为每一个点都配备这 9 种 anchors 作为初始的检测框。

      1 .在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图,所以相当于feature map每个点都是256-dimensions

      2. 在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息,也就是图中的红框。

      3. 假设在conv5 feature map中每个点上有k个anchor(默认k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有(x, y, w, h)对应4个偏移量,所以reg=4k coordinates

      从这个角度看,RPN就是利用feature map生成anchor,然后用 softmax 去判断哪些Anchor是里面有目标的,哪些是没目标的(相当于提出了一堆候选框,再判断里边是不是有东西,有东西的标记为foreground anchor,没东西的标记为backgroud)。下面的图非常好的体现了anchor究竟是什么。注意:右边的密密麻麻的红色框就是anchor映射到原图上的效果,这个坐标是超出原图尺寸的,因为在原图过CNN网络的时候,有pading操作,所以其实anchor是能够顾及到原图中的所有像素点的。

preview

     1.3 softmax:

      这篇博客介绍了什么是softmax,https://blog.csdn.net/red_stone1/article/details/80687921

      二、 运行流程:

      知道了上面几个关键词的意思,我们来看算法的流程。

      1. 首先是CNN网络

      上图是分解之后的Faster rcnn,这张图展示了使用 VGG16 模型的 faster_rcnn 网络结构。可以看到该网络首先将一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而 Conv layers 中包含了13个conv层+13个relu层+4个 pooling 层。经过这一系列的操作,图像的大小变为的原图的 (M/16)x(N/16),也就是图中的 Feature Map 的大小。(这里应该没有很多问题,CNN网络是可以替换的,比如可以换成比较新的 Resnet 和 DenseNet等,只要保证数据的维度正确)

      2. RPN网络:

      RPN网络首先对输入的(M/16)x(N/16)的 Feature Map 做一个3x3卷积操作,然后分成两条路:一条去判断anchors的类别,另一条计算 bounding box 的预测值。这样 Proposal 的输入就有6个,分别是bbox的四个预测值(x,y,w,h),以及anchor的类别(foreground和background)(这里两条路的anchor是一一对应的,这样才能进行后续的回归)。有了上面的几个参数,就可以进行bounding box 的修正(也就是文中的 bounding box regression )。

      例如:下图中的绿色框为飞机的Ground Truth(GT),红色为提取的foreground anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得foreground anchors和GT更加接近。

      窗口使用四维向量 (x,y,w,h) 表示,分别表示窗口的中心点坐标和宽高。对于上图,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G',任务可以描述为A为直接提出的anchor,GT为真实值ground truth,F是一种变换关系,G'是通过回归求到的预测框:

A=(A_{x}, A_{y}, A_{w}, A_{h})

GT=[G_{x}, G_{y}, G_{w}, G_{h}]

F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})

(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})

      其中 F 的思路是先做平移在做缩放:

  •  先做平移

G_x'=A_w\cdot d_x(A) +A_x\\

G_y'=A_h\cdot d_y(A) +A_y\\

  •  再做缩放

G_w'=A_w\cdot \exp(d_w(A))\\

G_h'=A_h\cdot \exp(d_h(A))\\

      这当中的未知量有四个,所以通过线性回归求这四个参数(每一个 anchor 都有这四个参数,所以 feature map 上的每个点都会有 4*9=36 个用于回归的参数),这四个参数是 anchor 和 G' 之间的变换关系:

d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)

     怎样求这四个参数呢?我们\phi (A)来表示经过第五次卷积的 feature map,则d(A)的求取方式如下

d_*(A)=W_*^T\cdot \phi(A)\\

    上面的4个参数作为预测值,t*是真实值(就是GT和anchor之间的变换关系,作为监督信号),这样就可以设计Loss函数如下

\text{Loss}=\sum_{i}^{N}{(t_*^i-W_*^T\cdot \phi(A^i))^2}\\

     函数优化目标为:

\hat{W}_*=\text{argmin}_{W_*}\sum_{i}^{n}(t_*^i- W_*^T\cdot \phi(A^i))^2+\lambda||W_*||^2\\

    只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。说完原理,Faster RCNN原文中的变换关系求取方式如下图:

    x , xa, x*三个参数分别是,G' ,anchors和 GT的坐标,前两行是从 anchor 到 G' 之间的变换,后两行是从anchor 到GT之间的变换,将后两行作为监督信号,前两行作为训练目标,尽量减小Loss就可以使 G' 不断的贴近 GT。这样,那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 上图中前两行的(tx,ty,tw,th),用这几个参数就能对提出的 anchor 进行修正了。

      3. Proposal Layer

      RPN网络的最后部分是 Proposal Layer 该部分的输入有三个:anchors分类器结果,bounding box 的回归结果,以及im_info。首先解释 im_info 。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。

      Proposal Layer的工作流程如下:

  • 生成anchors,d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
  • 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
  • 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
  • 剔除非常小(width<threshold or height<threshold)的foreground anchors
  • 进行nonmaximum suppression
  • 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前 300 个结果作为proposal输出。

      目标检测的部分基本上就到这里,最后的是对 bbox 的精修。

      

     4 . ROI Pooling

     Roi Pooling 的工作是:利用体渠道的 proposals 从 feature maps 中提取 proposal feature 送入后续全连接和 softmax 网络作classification(即分类proposal到底是什么object)。

      为什么要有 ROI Pooling呢:

      其实就是为了同意上层输出的 proposal 的大小,见下图:

preview

      参考资料: faster rcnn

      知乎:https://zhuanlan.zhihu.com/p/31426458

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习 -- Faster rcnn 算法流程详解 的相关文章

  • Python Flask怎么实现前后端分离

    你可以在 Flask 中使用 ajax 和 JSON 来实现前后端分离 首先 在 Flask 中创建一个视图函数 它会返回一个 JSON 响应 例如 app route api data def get data data key valu
  • 卷积神经网络改进想法初探(上篇)

    最近一直在看卷积神经网络 想改进改进弄出点新东西来 看了好多论文 写了一篇综述 对深度学习中卷积神经网络有了一些新认识 和大家分享下 其实卷积神经网络并不是一项新兴的算法 早在上世纪八十年代就已经被提出来 但当时硬件运算能力有限 所以当时只
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线

随机推荐

  • MIPI-DSI 协议深度解析-简单易懂协议详解

    1 MIPI MIPI 移动行业处理器接口 是 Mobile Industry Processor Interface 的缩写 MIPI 移动行 业处理器接口 是 MIPI 联盟发起的为移动应用处理器制定的开放标准 DCS DisplayC
  • vue项目history模式刷新404问题

    vue项目history模式部署到服务器后 根路径访问没有问题 但是进入其他功能再刷新页面就会出现404 因为你没在nginx或者apache配置上面加上重定向跳转 解决办法 只需要加上这段配置 nginx配置内容 location try
  • DNS详解

    1 背景 DNS 是 Domain Name System 的缩写 即域名系统 DNS可以理解是将域名 如 www baidu com 和IP地址进行相互映射的一个分布式数据库 人直接去记忆IP地址数串是相当困难的 像是电话号码 记忆常用的
  • VUE+js高德地图2.0API两幅地图联动同步缩放

  • 主机上连接到 vmware虚拟机的方式

    我们平时只有一台电脑 但是练习时需要有多台电脑 那么此时应该怎么办 答案是下载 vmware 可以在上面创建多台虚拟机 至于如何创建 不是本文的重点 下面先说说桥接是如何设置的 首先 进入配置好的虚拟机下面 选择 虚拟机 设置 网络适配器
  • NLP-实体&关系联合抽取-2021:GPLinker

    基础思路 关系抽取乍看之下是三元组 s p o s p o s p o 即subject pre
  • spi总线挂载多个设备的设备树描述

    内核版本 linux4 6 Vivado版本 201602 工程中用到很多spi控制的从设备 首先对FPGA工程的正确性验证一下 验证的设备树描述如下 spi e0006000 compatible xlnx zynq spi r1p6 r
  • 内存大页及基本块

    大页内存 透明大页和大页的关系 这两者最大的区别在于 标准大页管理是预分配的方式 而透明大页管理则是动态分配的方式 内存页的概念 内存页 page 内存的最小分配单元 page gt 一个应用程序至少要使用一个内存页 4096B 4k li
  • k8s学习(五)ReplicaSet的使用

    ReplicaSet ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合 可确保指定数量的pod在任何设定的时间运行 因此 它通常用来保证给定数量的 完全相同的 Pod 的可用性 示例 1 nginx
  • C++基础之纯虚函数

    一 纯虚函数的定义 纯虚函数是一种特殊的虚函数 在许多情况下 在基类中不能对虚函数给出有意义的实现 而把它声明为纯虚函数 它的实现留给该基类的派生类去做 这就是纯虚函数的作用 C 中的纯虚函数 一般在函数名后使用 0作为此类函数的标志 前面
  • 4,引擎初始化--(5)初始化actor--6,生成PlayActor--(2)玩家登录--3,PostLogin()(学习资料来自于ue4游戏框架)

    一旦PlayerController生成出来 world关于玩家的网络的初始化工作全部完成 接下来 进行PostLogin 从而在玩家加入游戏时 能做一些设置工作 默认情况下 GameMode会为新生的PlayerController建立一
  • RFID技术在智慧图书馆盘点系统中的优势

    RFID射频识别及技术 作为一种新兴的非接触式的自动识别技术 其基本原理是电磁理论 因其操作便捷高效 无需人工干预 可在各种恶劣环境下 通过射频信号自动识别目标并获取相关数据 可识别高速运动中的物体并可同时识别多个标签 可以远距离识别 而不
  • _fseeki64在linux下的头文件,linux c 语言之--fseek(),fseeko(),fseeko64()讲解 (转载)

    转载 http blog csdn net lemoncyb article details 16841317 fseek 函数讲解 函数定义 int fseek FILE stream long offset int fromwhere
  • 查询目标服务器系统,查看目标服务器的操作系统

    查看目标服务器的操作系统 内容精选 换一换 云硬盘挂载至云服务器时 无法挂载 以下排查思路根据原因的出现概率进行排序 建议您从高频率原因往低频率原因排查 从而帮助您快速找到问题的原因 如果解决完某个可能原因仍未解决问题 请继续排查其他可能原
  • Linux-乌班图常用命令

    Linux提供了大量的命令 利用它可以有效地完成大量的工作 如磁盘操作 文件存取 目录操作 进程管理 文件权限设定等 所以 在Linux系统上工作离不开使用系统提供的命令 要想真正理解Linux系统 就必须从Linux命令学起 通过基础的命
  • Android框架体系架构的知识,值得收藏!

    一 概述 随着业务的发展 工程的逐渐增大与开发人员增多 很多工程都走向了模块化 组件化 插件化道路 来方便大家的合作开发与降低业务之间的耦合度 现在就和大家谈谈模块化的交互问题 首先看下模块化的几个优势 模块化的优势 结构清晰 业务独立 代
  • BUUCTF Web [极客大挑战 2019]Knife

    作者主页 士别三日wyx 此文章已录入专栏 网络攻防 持续更新热门靶场的通关教程 未知攻 焉知收 在一个个孤独的夜晚 你完成了几百个攻防实验 回过头来才发现 已经击败了百分之九十九的同期选手 极客大挑战 2019 Knife 一 题目简介
  • Android Context

    1 Context概念 Context 中文直译为 上下文 小学读语文的时候我们知道 有时候理解一个句子 需要看看上下文 这里上下文有时需要看看上下临接着的几段话就可以理解他的意思 有时候呢 我们需要把整篇文章都读取一遍才能知道他的意思 一
  • 【基于Leaflet和Canvas绘图的前端大量栅格数据渲染】

    1 需求 有包含30万坐标点的json文件 每个坐标点包含经度 纬度 行值 列值 数值 现需要根据数值分级进行不同颜色的显示 并在地图的正确位置进行渲染 最终效果如下 2 环境和工具 2 1 使用Edge Chrome 实测采用Chromi
  • 深度学习 -- Faster rcnn 算法流程详解

    经典论文 后续很多论文以此为基础 所以搞懂流程比较重要 中间如果 有写的不对 有问题或者看不懂的地方 还望指正 如果有了新的理解 我会持续更新 Faster Rcnn是目前学术上用的非常多的目标检测算法 这里来认真的梳理一遍该算法的流程 主