目标检测算法——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(没有参考,但博主写得很好)


目录
打赏
0
0
0
0
21
分享
相关文章
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
123 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
目标检测算法:从理论到实践的深度探索
【7月更文第18天】目标检测,作为计算机视觉领域的核心任务之一,旨在识别图像或视频中特定对象的位置及其类别。这一技术在自动驾驶、视频监控、医疗影像分析等多个领域发挥着至关重要的作用。本文将深入浅出地介绍目标检测的基本概念、主流算法,并通过一个实际的代码示例,带您领略YOLOv5这一高效目标检测模型的魅力。
980 11
人工智能 - 目标检测算法详解及实战
目标检测需识别目标类别与位置,核心挑战为复杂背景下的多目标精准快速检测。算法分两步:目标提取(滑动窗口或区域提议)和分类(常用CNN)。IoU衡量预测与真实框重叠度,越接近1,检测越准。主流算法包括R-CNN系列(R-CNN, Fast R-CNN, Faster R-CNN),YOLO系列,SSD,各具特色,如Faster R-CNN高效候选区生成与检测,YOLO适用于实时应用。应用场景丰富,如自动驾驶行人车辆检测,安防监控,智能零售商品识别等。实现涉及数据准备、模型训练(示例YOLOv3)、评估(Precision, Recall, mAP)及测试。
298 5
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
258 9
计算机视觉:目标检测算法综述
【7月更文挑战第13天】目标检测作为计算机视觉领域的重要研究方向,近年来在深度学习技术的推动下取得了显著进展。然而,面对复杂多变的实际应用场景,仍需不断研究和探索更加高效、鲁棒的目标检测算法。随着技术的不断发展和应用场景的不断拓展,相信目标检测算法将在更多领域发挥重要作用。
基于CNN卷积神经网络的金融数据预测matlab仿真,对比BP,RBF,LSTM
本项目基于MATLAB2022A,利用CNN卷积神经网络对金融数据进行预测,并与BP、RBF和LSTM网络对比。核心程序通过处理历史价格数据,训练并测试各模型,展示预测结果及误差分析。CNN通过卷积层捕捉局部特征,BP网络学习非线性映射,RBF网络进行局部逼近,LSTM解决长序列预测中的梯度问题。实验结果表明各模型在金融数据预测中的表现差异。
221 10
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
深度学习中的卷积神经网络(CNN): 从理论到实践
本文将深入浅出地介绍卷积神经网络(CNN)的工作原理,并带领读者通过一个简单的图像分类项目,实现从理论到代码的转变。我们将探索CNN如何识别和处理图像数据,并通过实例展示如何训练一个有效的CNN模型。无论你是深度学习领域的新手还是希望扩展你的技术栈,这篇文章都将为你提供宝贵的知识和技能。
558 7

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等