目标检测算法——Faster R-CNN

简介: 目标检测算法——Faster R-CNN

1.Faster R-CNN简介


Faster R-CNN,论文名称:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,原文链接


同样使用VGG16作为网络的backbone,推理速度在GPU上达到5fps(包括候选区域的生成),准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。该算法在fast rcnn基础上提出了RPN候选框生成算法,使得目标检测速度大大提高。


Faster R-CNN 算法流程可分为3个步骤:


  • 将图像输入网络得到相应的特征图
  • 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
  • 将每个特征矩阵通过ROI pooling层缩放到 7x7 大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果(与Fast R-CNN是一样的操作)


其实 Faster R-CNN = RPN + Fast R-CNN,在Faster R-CNN中,就是使用了RPN结构替代了SS算法,其余操作基本和Fast R-CNN一样。

image.png

所以,由图可以看见,Faster R-CNN有RPN结构与Fast R-CNN结构构成,也就是其损失包含了两个部分,分别是RPN的损失与Fast R-CNN的损失。这这两种损失又包含分类损失与边界框回归损失,详情见下文。


2.基本概念扩展


1)ZFNet

ILSVRC 2013获胜者是来自Matthew Zeiler和Rob Fergus的卷积网络。它被称为ZFNet(Zeiler&Fergus Net的简称)。这是对AlexNet的改进,通过调整架构超参数,特别是通过扩展中间卷积层的大小。论文链接


ILSVRC历届冠军网络介绍以及CNN的大致演化过程

image.png

ZFNet是在AlexNet基础上进行了一些细节的改动,网络结构上并没有太大的突破,只是在卷积核和步幅上面做了一些改动

image.png

从上面可以看出,ZFNet相较于AlexNet的改进主要在两点:


第一个卷积层的大小从11 * 11改为了 7 *7,步长从4改为了2.

将3、4、5层卷积核的数量由384、384、256调整为512、1024、512

所以如果是Faster R-CNN中采用的backbone是ZFNet,最后的channel是256;如果采用的backbone是VGG,最后的channel是512。


ps:

ZFNet论文中的主要工作:

(1)使用一个多层的反卷积网络来可视化训练过程中特征的演化及发现潜在的问题;

(2)同时根据遮挡图像局部对分类结果的影响来探讨对分类任务而言到底那部分输入信息更重要。


其他的详细介绍见:链接,也就是参考资料的第一个链接。


2)感受野

在分析CNN网络时,通常会考虑到网络的感受野,感受野是指特征图上一个像素点代表原图的多大区域像素点,一般网络感受野越大,提取到的特征就更高维,网络性能也越好。其实CNN中的池化层,或者说下采样层就是为了提高网络的感受野,提高网络的感受野的代价就是会丢弃部分信息。(空洞卷积就是为了解决这个问题而提出的)


感受野变化

image.png

上图是一个4x4的特征图经过一个3x3的卷积操作后,再经过一次2x2池化操作后,感受野的大小变化。很明显可以看出,卷积操作后,得到的每个像素,都对应原图一个3x3的区域,我们称该层的感受野为3x3(相对于输入特征图) ,而池化后输出的一个像素点,对应卷积输出特征图上一个2x2的区域,对应了输入特征图上一个4x4的区域(有2x2的重叠部分,如果stride比较大,重叠部分会变小,区域会变大,如果stride=3,没有重叠,那么对应的区域是6x6),我们称该层对应上一层的感受野为2x2,对应输入特征图的感受野是4x4。从图中可以看出,感受野的大小和是否填充没有关系(如果非要说有关系,只能说有些情况下边缘信息会部分丢失,造成视野变小,视野和感受野概念还是有点区别的),和核的大小,滑动步长有关系(图不好画,没有画出滑动步长大于1的情况,其实很容易类推出来)。


一般我们说一个网络的感受野,通常是指网络的顶部一个像素对应输出图像的多少像素区域,所以计算方式都是从网络顶部一直往输入层推算。


现在计算Faster RCNN中ZF网络feature map 中3x3滑动窗口在原图中感受野的大小。计算公式为:F(i) = [F(i + 1) - 1] x Stride + Ksize

image.png

所以,经过计算,对于ZF网络来说其感受野:171,同样的计算可以得到VGG的感受野为:228


3.RPN结构


1)sliding window

RPN的实现方式:在conv5-3的卷积feature map上用一个n * n的滑窗(论文中作者选用了n=3,即3 * 3的滑窗)生成一个长度为256(对应于ZF网络)或512(对应于VGG网络)维长度的全连接特征.然后在这个256维或512维的特征后产生两个分支的全连接层:


  • reg-layer:用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h;
  • cls-layer:用于判定该proposal是前景还是背景.


sliding window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间.事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能.

image.png

全连接层本来就是特殊的卷积层,如果产生256或512维的fc特征,事实上可以用Num_out=256或512, kernel_size=3 * 3, stride=1的卷积层实现conv5-3到第一个全连接特征的映射.然后再用两个Num_out分别为2 * 9=18和4 * 9=36,kernel_size=1 * 1,stride=1的卷积层实现上一层特征到两个分支cls层和reg层的特征映射.采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活.在RPN网络中,我们需要重点理解其中的anchors概念,Loss fucntions计算方式和RPN层训练数据生成的具体细节.


ps:这里2 * 9中的2指cls层的分类结果包括前后背景两类(注意,如图0.1表示该图为背景的概率,而0.9表示该图为前景的概率。只是预测是前景还是背景,这里并没有具体的对其进行分类,是人也好车也好,只要是所需检测的内容就都是被归类为前景。否则全部归为背景。),4 * 9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数.而这里的9表示的是特征图上每个特征点的anchor boxes数。

image.png

同样的,边界框回归得到的这一组数个参数,分贝是中心点的偏移连与宽度与高度的调整。通过边界框回归参数的调整,我们希望尽可能的使得这些anchor可以尽可能的准确框选出我们的目标。


2)anchors

image.png

Anchors:字面上可以理解为锚点,位于之前提到的n * n的sliding window的中心处.。对于一个sliding window,我们可以同时预测多个proposal,假定有k个.k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定.所以,我们在后面说一个anchor,你就理解成一个anchor box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4 * k个reg-layer的输出和 2 * k个cls-layer的score输出.对于一幅W * H的feature map,对应W * H * k个锚点.所有的锚点都具有尺度不变性.


其中:3种scales(尺度面积)为:1282,2562 ,5122 (经验所得);3种aspect_ratio(长宽比)为:1:1, 1:2, 2:1,也就是每个位置在原图上都对应有3x3=9 anchor box .


而这里为什么要给出这么多个不同比例尺寸的anchor呢?因为我们所需检测的目标的大小的尺寸与长宽比都是不一样的,所以需要通过一系列的anchor来准确的预测其位置。


前面有讲到过,对于ZF网络来说,其感受野的大小是171 * 171的,而VGG网络的感受野大小是228 * 228的,其为什么能预测比他尺寸还要大的目标边界框呢?论文指出,通过一个较小的感受野是有可能预测出一个比较大的尺寸区域的。因为,看见一个物体的一部分,也可以大概的猜测出这个目标的一个完整的位置区域的。实际使用中这个方法也是有效的。所以小的感受野范围还是可以预测的。


对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。注意这里的anchor与proposal不是同一个内容,选择是需要将anchor调整为候选框。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。现在候选框的个数就大概的与SS算法提供的候选框个数一致了。


4.Faster R-CNN正负样本


在计算Loss值之前,作者设置了anchors的标定方法.正样本标定规则:


  1. 如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;


  1. 如果Anchor对应的reference box与ground truth的IoU>0.7,标记为正样本.事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference box与groud truth的IoU不大于0.7,可以采用第一种规则生成.


  1. 负样本标定规则:如果Anchor对应的reference box与ground truth的IoU<0.3,标记为负样本.


  1. 剩下的既不是正样本也不是负样本,不用于最终训练.


RPN训练设置:


  1. 在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1.


  1. 如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然.


  1. 训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化.


5.Faster R-CNN损失函数


1)RPN Multi-task loss

RPN损失包括分类损失与边界框回归损失

image.png


  • pi 表示第i个anchor预测为真实标签的概率
  • pi* 当为正样本时为1,当为负样本时为0
  • ti 表示预测第i个anchor的边界框回归损失参数
  • ti* 表示第i个anchor对于的GT Box
  • Ncls 表示一个mini-batch中所有样本数量为256
  • Nreg 表示anchor位置的个数(不是anchor个数,既anchor个数=k * anchor位置个数)约60 * 40 = 2400
  • λ 取值为10


RPN的分类损失

image.png


  • pi 表示第i个anchor预测为真实标签的概率
  • pi* 当为正样本时为1,当为负样本时为0


以上图为例,当第一个anchor的类别标签为1,也就是这个区域有我们所需要检测的目标,此时其预测为前景的概率为0.9,所以第一个anchor的分类损失为:-log(0.9);而当第二个anchor的类别标签为0,也就是这个区域没有我们所需检测的目标,而此时其预测为背景的概率为0.2,所以其分类损失为:-log(0.2)


RPN的边界框回归损失

image.png

这里的边界框回归损失与之前提到的Fast R-CNN中的边界框回归损失是一样的。这里的损失函数同样采用的是smoothL1损失函数



  • pi* 当为正样本时为1,当为负样本时为0
  • ti 表示预测第i个anchor的边界框回归损失参数
  • ti* 表示第i个anchor对于的GT Box


回归参数的转化关系如图所示:

image.png


2)Fast R-CNN Multi-task loss

Fast R-CNN损失包括分类损失与边界框回归损失

image.png

此部分与Fast R-CNN中的部分完全一样。见链接:Fast R-CNN


  • p是分类器预测的softmax概率分布p = (p0, …, pk)
  • u对应目标真实类别标签
  • tu对应边界框回归器预测的对应类别u的回归参数(tux,tuy,tuw,tuh)
  • v对应真实目标的边界框回归参数(vx,vy,vw,vh)


其中真实目标边界框回归参数的计算公式为:

image.png


Fast R-CNN的分类损失

image.png


  • p是分类器预测的softmax概率分布p = (p0, …, pk)
  • u对应目标真实类别标签


Fast R-CNN的边界框回归损失

image.png

注意,这个损失是由4个部分组成的。分别对应着我们回归参数 x 的smoothL1的回归损失,回归参数 y 的smoothL1的回归损失,回归参数 w 的smoothL1的回归损失与最后的回归参数 h 的smoothL1的回归损失。


  • tu对应边界框回归器预测的对应类别u的回归参数(tux,tuy,tuw,tuh)
  • v对应真实目标的边界框回归参数(vx,vy,vw,vh)


而具体的smoothL1损失的计算公式为

image.png

λ 是一个平衡系数,用于平衡分类损失与边界框回归损失。


[u ≥ 1] 是艾佛森括号,也可以理解为一个计算公式。当u满足条件是,公式的值为1;而当u不满足条件时,也就是u<1时,也就是u=0时,(u为类别的标签),此时类别标签为背景,公式的值为0.


u代表了目标的真是标签,u ≥ 1表示候选区域确实属于所需检测的某一个类别当中,也就是对应着正样本。当u=0时,此时候选区域对应着为背景,不属于所需检测的某一个类别当中。那既然是背景,就没有边界框回归损失这一项了。


6.Faster R-CNN框架


此4部分全部融合在cnn网络中,变成了一个整体,实现了端对端的结合。可以看见,框架越来越简介,也越来越高效。

image.png

回顾:


1.将图像输入网络得到相应的

在Faster R-CNN中,对于一张1000x600x3的输入图像,直接输入到神经网络中得到一个特征图,此时不再使用SS算法获得候选区域,而是使用了RPN结构。对于这张1000x600x3的图像,得到的特征图大概是60x40的大小,然后此时会有大约有60x40x9(20k)个anchor,对于跨越边界的anchor不予以考虑,现在剩下6k个anchor。


2.使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵

而对于这些anchor或者说是候选框,仍然有大量的重叠,基于候选框的RPN结构中的分类cls得分,采用非极大值抑制,IoU设为0.7,这样剩下2k个作用的anchor。而PRN结构的边界框回归是为了这些anchor更好的调整位置,配合有效的计算iou值。而此时的剩下的这些经过筛选anchor也就是候选框proposal。与SS算法提供的候选框数量大致相同。然后将这些RPN生成的候选框投影到特征图上获得相对应的特征矩阵。


3.将每个特征矩阵通过ROI pooling层缩放到 7x7 大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果

由于此时已在特征图上获得了对于候选框的特征矩阵,剩下的步骤与Fast R-CNN完全一样了。根据映射关系找到每一个候选区域的特征矩阵。将特征矩阵通过ROI Pooling层统一缩放到7*7的大小,然后将其展平处理,然后通过两个全连接层,得到ROI feature Vector。在ROI feature Vector的基础上,并联两个全连接层。其中的一个全连接层用于目标概率的预测,另外的一个全连接层用来边界框回归参数的预测。


以上是我对Faster R-CNN的结构处理流程的大致概括,如有错误恳请指教。


Faster R-CNN训练方法


  • 直接采用RPN Loss+ Fast R-CNN Loss的联合训练方法(推荐)


  • 原论文中采用分别训练RPN以及Fast R-CNN的方法


  1. 利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
  2. 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
  3. 固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
  4. 同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。


参考资料:


https://blog.csdn.net/qq_27825451/article/details/88815490

https://blog.csdn.net/xuefengyang666/article/details/94839014

https://www.bilibili.com/video/BV1af4y1m7iL?p=3

https://www.cnblogs.com/dudumiaomiao/p/6560841.html

https://blog.csdn.net/weixin_44751294/article/details/117604140

https://www.cnblogs.com/wangyong/p/8513563.html

https://www.cnblogs.com/wangyong/p/8513563.html(没有参考,但博主写得很好)


目录
相关文章
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
30天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
1月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
67 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
23天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GA-PSO-SVM算法的混沌背景下微弱信号检测matlab仿真
本项目基于MATLAB 2022a,展示了SVM、PSO、GA-PSO-SVM在混沌背景下微弱信号检测中的性能对比。核心程序包含详细中文注释和操作步骤视频。GA-PSO-SVM算法通过遗传算法和粒子群优化算法优化SVM参数,提高信号检测的准确性和鲁棒性,尤其适用于低信噪比环境。
|
1月前
|
算法 安全
分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
本课题通过Simulink建模与仿真,实现OVP-UVP、OFP-UFP算法及AFD检测算法的反孤岛检测。OVP-UVP基于电压幅值变化,OFP-UFP基于频率变化,而AFD则通过注入频率偏移信号来检测孤岛效应,确保电力系统安全稳定运行。系统使用MATLAB 2013b进行建模与仿真验证。
|
29天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
35 0
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化卷积神经网络(Bayes-CNN)的多因子数据分类识别算法matlab仿真
本项目展示了贝叶斯优化在CNN中的应用,包括优化过程、训练与识别效果对比,以及标准CNN的识别结果。使用Matlab2022a开发,提供完整代码及视频教程。贝叶斯优化通过构建代理模型指导超参数优化,显著提升模型性能,适用于复杂数据分类任务。
|
1月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
81 0
|
3月前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天

热门文章

最新文章

下一篇
无影云桌面