当前位置:网站首页>目标检测系列——Faster R-CNN原理详解
目标检测系列——Faster R-CNN原理详解
2022-07-05 07:10:00 【秃头小苏】
作者简介:秃头小苏,致力于用最通俗的语言描述问题
往期回顾:目标检测系列——开山之作RCNN原理详解 目标检测系列——Fast R-CNN原理详解
近期目标:拥有10000粉丝
支持小苏:点赞、收藏、留言
目标检测系列——Faster R-CNN原理详解
写在前面
前文我已经介绍过R-CNN、Fast R-CNN的原理,具体内容可以点击下面链接阅读。【注:阅读此篇之前建议对R-CNN和Fast R-CNN有一定的了解】
Faster R-CNN算是这个目标检测系列的最后一篇了,在速度和准确率上也相对达到了比较好的效果,所以还是非常重要的。后面可能会更新语义分割Mask RCNN,当然这都是后话啦。现在就和我一起来学学Faster R-CNN吧。
Faster R-CNN整体流程
不知大家是否还记得Fast R-CNN的流程?这里帮大家回忆一下,其步骤如下:
- 候选区域生成
- 完整图像输入网络,候选框投影到特征图得到特征矩阵
- 特征矩阵经ROI pooling层缩放至统一大小,后将特征图展平得到预测结果
那么Faster R-CNN相较于Fast R-CNN有什么要的改进呢?其实最主要的就是在Fast R-CNN中我们依旧是和R-CNN一样采用SS算法来生成候选框,而在Faster R-CNN中我们采用的是一种称为RPN(Region Proposal Network)的网络结构来生成候选框。其它部分基本和Fast R-CNN一致,所以我们可以将Faster R-CNN的网络看成两部分,一部分是RPN获取候选框网络结构,另一部分是Fast R-CNN网络结构,如下图所示:
倘若你是第一次看Faster R-CNN,看了这个图,我觉得你还是处于一个比较懵逼的状态。但是没有关系,这个图是论文中所给的,我贴在这里的主要目的是想让你大致知道Faster R-CNN的结构就好,那么灵魂一问——大致结构你知道了嘛?
其实呀,Faster R-CNN的结构和Fast R-CNN还是很像的,都会产生一些候选框,然后基于特征提取网络对这些候选框进行分类和回归操作,不同的是Fast R-CNN采用的是传统的SS算法提取候选框,而Faster R-CNN采用RPN网络来进行提取。
好了,Faster R-CNN整体流程部分就介绍这么多,你肯定还是存在着诸多疑惑,不用急,下面我们一步步的讲解。
想想这里还是再加点内容,见下图,其是Faster R-CNN较为详细的流程图,后文我也会按照这个结构为大家讲述,这样应该会更清晰点。
特征提取网络
特征提取网络结构如下图所示:
可以看到,对于一个P*Q大小的图片,我们先将其resize到特定的M*N大小,之后再送入特征提取网络。【注:这里图片尺寸没有加通道数,大家理解就好】
此外,可以看到图中的特征提取网络有13个卷积层,4个池化层,其实这个特征提取网络用到就是大名鼎鼎的VGG。【注:在VGG网络中有13个卷积层,5个池化层,这里丢弃了最后一个池化层】
对于VGG网络不熟悉的可以点击***了解详情。值得一提的是在VGG网络中,卷积采用的都是3*3的卷积核,卷积后特征图尺寸不变;而池化采用的是2*2的池化核,池化后特征图尺寸减半。也就是说,在上图的特征提取网络中,含有四个池化层,因此我们最终得到的特征图的尺寸是原来的 1 16 \frac{1}{ {16}} 161,即为 M 16 ∗ N 16 \frac{M}{ {16}}*\frac{N}{ {16}} 16M∗16N 。
还有一点也值得注意,即本次讲解的特征提取网络是VGG,我们一般称之为backbone(骨干网络)。这个backbone是可以根据需求更换的,像换成ResNet、MobileNet等等都是可以的。
RPN网络结构
RPN的网络结构如下:
我们上一步已经得到了 M 16 ∗ N 16 \frac{M}{ {16}}*\frac{N}{ {16}} 16M∗16N大小的特征图(Feature Map)【注:为方便后文叙述,现令 W = M 16 , H = N 16 W=\frac{M}{ {16}},H=\frac{N}{ {16}} W=16M,H=16N】,可以看到我们会对特征图分别进行路径①和路径②上的操作,其中路径①上的操作即为RPN网络结构。下面我们就来重点谈谈这个RPN网络结构。
首先我们先来明确RPN是用来干什么的?enmmm…,要是这个网络的作用现在还不知道的话那我前面真是白说了,有点失败。但是这一点再强调也不为过——RPN就是来提取候选框的!!!
那么RPN到底是怎么做的呢?首先,我们会用一个3*3的滑动窗口遍历刚刚得到的特征图,之后计算出滑动窗口中心点对应原始图像上的中心点, 最后在原始图像每个中心点绘制9种anchor boxes 。【注:怎么由特征图的中心点坐标得到原图的中心点呢?——我们采用的是VGG骨干网络,原图和特征图尺寸相差16倍,因此只需要将特征图中心点坐标乘16即可;或者我们可以计算出中心点在特征图中的相对位置,进一步得到原图中心点位置】
我们需要在原图中绘制9中anchor,论文中给出三种尺度(128*128 、256*256 、512*512)和三种比例(1:1、1:2、2:1)一共9种anchor,说是由经验设计,其实我们在实现过程中是可以根据任务调整的,比如我们要检测的目标较小,那么就可以适当减小anchor的尺寸。特征图中心点到原图的大致映射关系图如下:
上文谈到使用3*3的滑动窗口遍历特征图,其实这就对应了图4.1路径①中的第一个3*3的卷积,卷积过程padding=1,stride=1。其中该卷积和原图生成anchor的对应关系如下图所示:可见经过这一步我们会在原图上生成许多许多的anchor,很明显这些anchor很多都是我们不需要的,后面就会对这些anchor进行取舍。
接下来我们看看经过3*3卷积后特征图的变化,因为采用的是卷积核k=3*3,p=1,s=1的卷积,所以卷积后特征图尺寸没有发生变化,这里说一下这个channel=512是由于VGG网络最后一层的输出通道数为512。
再来对照图4.1看看3*3的卷积后进行了什么操作?3*3卷积后由分别走路径③和路径④进行相关操作。其实路径③就是对刚刚得到的anchor进行分类(前景和背景),而路径④则是对anchor进行回归微调。
那么就分别来讲讲③和④,首先先来谈谈路径③。首先进行一个1*1的卷积,卷积核个数为18。如下图所示:
其实上图采用18个卷积核是很有讲究的。首先我们要知道的是路径③我们要做的是区分每个anchor是前景还是背景,即分成两个类别,而对于每个小方格都会在原图上生成9个anchor。这样2*9=18,得到的结果中每个小方块就代表原始图像中某个位置每个anchor是否为前景或背景的概率。为方便大家理解,抠出某个方格对18通道的数据进行解释,如下图所示:
1*1的卷积后,就进行了softmax层进行分类。【注:在softmax层前后都有一个reshape的操作,这是因为在编写代码时会对输入的格式有要求,这里大家可以先不关心,后面讲解代码时在叙述】 softmax层分类后我们会得到所有的正类的anchor(positive anchors)和负类的anchor(negative anchors)。
这里补充一下正负样本的选取规则:正样本有两个条件,第一:选取与真实框IOU最大的anchor;第二:选取与真实框IOU大于0.7的anchor。【注:其实大部分情况第二个条件都可以满足,但是防止存在一些极端情况设置了条件一】负样本的选取条件为与所有真实框IOU都小于0.3的anchor。
接着就来谈谈路径④,同样的,先是一个1*1的卷积,卷积核个数为36。如下图所示:
这里的36同样是有讲究的呀,因为在进行回归微调anchor的时候每个anchor需要四个参数,4*9=36,得到的结果中每个小方块就代表原始图像中某个位置每个anchor四个需要调整的参数。同样也画个图片帮助大家理解,如下:
接下来路径③和路径④在Proposal这步结合,这步是干什么的呢?其实呀,这一步就是综合了路径③和路径④中的信息,即分类结果和anchor框的回归参数,目的是得到更加精确的候选框(Region Proposal)。细心的同学可能还发现了proposal这步还有一个输入,即im_info,这个参数保存了一些图片尺寸变换的信息,像开始的resize,后面的池化等等。
RPN层损失函数
RPN层的损失函数如下:RPN层的分类损失和fast R-CNN类似,也是由两部分组成,即分类损失和边界框回归损失。
下面来具体看看①和②部分:【注:边界框回归损失在之前文章 R-CNN中有介绍,不明白的可以去了解一下】
ROI Pooling
上文已经较为详细的讲述了RPN层,即我们图4.1中的①路径,接下来我们继续来讲路径②【路径②为ROI Pooling层】。可以看到ROI Pooling层的输入有两个:分别为
- 原始的feature maps
- RPN输出的proposal
ROI Pooling层我在fast R-CNN中已经讲过了,这里就不过多叙述了,不明白的可以前去充充能。
不过这里我还是想说明一点:我们传入ROI Pooling层的输入为原始特征图和RPN输出的候选框,我们相当于是把每个候选框对应到原始特征图的不同部分,然后把这些部分剪裁下来分别传入ROI Poolinng层。
分类回归微调部分
后面这部分其实就完全和Fast R-CNN后半部分完全一致了,因为我们同样都经过ROI Pooling层得到了候选框的相关特征,接着送入分类和回归网络即可。这部分有不明白的也欢迎去阅读我之前文章对此部分的讲解。
小结
这部分来总结一下Faster R-CNN的步骤,如下:
- 将完整图像输入网络得到相应的特征图
- 使用RPN结构生成候选框,将RPN生成的候选框投影到原始特征图获取相应的特征矩阵【相当于我们ROI Pooling部分所说通过剪裁得到的结果】
- 特征矩阵经ROI pooling层缩放至统一大小,后将特征图展平得到预测结果
至此,Faster R-CNN的理论部分就都将完了,希望大家都能有所收获。
参考资料
如若文章对你有所帮助,那就
咻咻咻咻~~duang~~点个赞呗
边栏推荐
- 摄像头的MIPI接口、DVP接口和CSI接口
- Build a microservice cluster environment locally and learn to deploy automatically
- The problem of Chinese garbled code in the vscode output box can be solved once for life
- 睿智的目标检测59——Pytorch Focal loss详解与在YoloV4当中的实现
- 1290_ Implementation analysis of prvtaskistasksuspended() interface in FreeRTOS
- Intelligent target detection 59 -- detailed explanation of pytoch focal loss and its implementation in yolov4
- Concurrent programming - deadlock troubleshooting and handling
- Ros2 - configuration development environment (V)
- Architecture
- Ros2 - common command line (IV)
猜你喜欢
随机推荐
Technical conference arrangement
namespace
Error: “MountVolume.SetUp failed for volume pvc 故障处理
SOC_ SD_ DATA_ FSM
乐鑫面试流程
Negative number storage and type conversion in programs
npm install -g/--save/--save-dev的区别
Orin 安装CUDA环境
Concurrent programming - deadlock troubleshooting and handling
Implementation of one-dimensional convolutional neural network CNN based on FPGA (VIII) implementation of activation layer
docker安装mysql并使用navicat连接
Energy conservation and creating energy gap
Orin two brushing methods
Instruction execution time
基于FPGA的一维卷积神经网络CNN的实现(八)激活层实现
现在有html文件,和用vs制作的mvc(连接了数据库),怎么两个相连?
testing framework
Mathematical analysis_ Notes_ Chapter 8: multiple integral
Mipi interface, DVP interface and CSI interface of camera
Orin 两种刷机方式