R-cnn目标检测系列阅读笔记

R-CNN是一种目标检测算法,通过区域提案、CNN和SVM实现。Fast R-CNN通过ROI池化和整合模型提升效率。Faster R-CNN引入RPN网络进一步加速区域提案生成。Mask R-CNN则扩展了目标检测,实现像素级分割。文章详细介绍了这些方法的工作原理和优化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解下R-CNN

R-CNN:区域CNN。主要论文:

  1. R-CNN: https://arxiv.org/abs/1311.2524

  2. Fast R-CNN: https://arxiv.org/abs/1504.08083

  3. Faster R-CNN: https://arxiv.org/abs/1506.01497

  4. Mask R-CNN: https://arxiv.org/abs/1703.06870

目标检测是一种找到图像中的不同目标并进行分类的任务。通过在PASCAL VOC测试(类似于ImageNet)

理解R-CNN

输入:图像 输出:边界框+图像中每个目标的标注
区域提案,判断目标
R-CNN通过在图像中假设了一些列边界,再利用卷积神经网络和分类器识别是否可以真的对应一个目标。创造这些边界框的方法叫做区域提案(region proposal)。一旦创建了这些提案,R-CNN简单的将该区域卷曲到一个标准的平方尺寸,并将其传递给修改版的AlexNet,在CNN的最后一层,R-CNN添加了一个支持向量机(SVM),可以简单的界定物体是否为目标,什么事目标。
提升边界框
题目意思是找到了目标后,收紧边框适应目标的真实尺寸。这是R-CNN的最后一步。R-CNN在区域提案上运行简单的线性回归,以生成更紧密的边界框坐标从而获得最终结果。(怎么运行线性回归?)
所以概括起来,R-CNN只是以下简单的步骤:
1.为边界框生成一组提案;
2.通过预训练的ALexNet运行的边界框中的图像,最后通过SVM来查看框中图像的目标是什么;
3.通过线性回归模型运行边框,一旦目标完成分类,输出边框的更紧密的坐标

缺点:R-CNN准确度很棒,但是运行很慢,原因如下:
1,需要CNN模型针对每个图像的每个提案区域进行前向传递
2,必须分别训练三个不同的模型–1.CNN生成图像特征,2,分类器3,收紧边界框的回归模型。使得传递难以训练

FAST R-CNN

R-CNN的第一作者解决了R-CNN的主要两个问题,创造了第二个算法–Fast R-CNN.解决方法的主要思想包括:
1.ROI(兴趣区域)池化
对于每个图像的每个提案,都要进行CNN计算,大约2000次。ROI Pool(兴趣区域池化)对每个图像只运行一次CNN,然后在2000个提案中共享计算的方法。
原理:CNN卷积计算能够保留了空间信息。
过程:创建了图像的完整前向传递,并从获得的前向传递中提取每个兴趣区域的转换特征。通过从从 CNN 的特征映射选择相应的区域来获取每个区域的 CNN 特征。然后,每个区域的特征简单地池化(通常使用最大池化(Max Pooling))。所以我们所需要的是原始图像的一次传递,而非大约 2000 次!
2.将所有模型并入一个网络
Faster R-CNN将卷积神经网络,分类器和边界框回归器组合为一个简单的网络。
在这里插入图片描述
在上述图像中,你可以看到这些工作是如何完成的。Fast R-CNN 在 CNN 顶部用简单的 softmax 层代替了支持向量机分类器(SVM classfier)以输出分类。它还添加了与 softmax 层平行的线性回归层以输出边界框坐标。这样,所有需要的输出均来自一个单一网络!下面是整个模型的输入和输出:
输入:带有区域提案的图像
输出:带有更紧密边界框的每个区域的目标分类

Faster R-CNN-加速区域提案

降低提案区域生成的成本,几乎降为0;
整体过程:输入:一张图片 输出:一个边框列表,每个边框会被分配一个标签,还有每对标签和边框所对应的概率。
主要内容:
1,卷积层:作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
2,Region Proposal Networks(区域提案网络)。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
3,Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps(提案区域的特征向量),送入后续全连接层判定目标类别。
4,Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置
在这里插入图片描述
python中的VGG16模型中标的Faster R-cnn的网络结构:
在这里插入图片描述
首先将任意大小的图像缩放至标准大小MxN,经过卷积层的特征提取,其中包括13个卷积层和4个池化层;RPN网络首先经过3x3的卷积,再分别生成positive anchors 和对应的 bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)。
1.基础网络 卷积
在图像分类中ResNet优于VGG
ResNet 在使用残差连接和批归一化的方法后更加易于训练,这些方法在 VGG 发布的时候还没有出现。
**2.RPN **
Faster R-CNN放弃了传统的滑动窗口和选择搜索的方法,用RPN(区域提案网络)生成检测框,极大提升检测框的生成速度。
换成将使用特征提取网络处理后的特征图并建议目标区域。这种方法解决了区域提案长度可变的问题。具体方法如下:
在这里插入图片描述
上图展示了RPN网络的具体结构。以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类,下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
Anchor box锚点

为了选择合适的锚点,定义一组固定的尺寸:64px或者128px和长宽比例(0.5,1,1.5等)的边框,使得最后的变量所有的可能组合得到候选边框。在论文中作者根据上面的比例生成了下面的9个anchors
在这里插入图片描述
注:关于上面的anchors size,其实是根据检测图像设置的。在python demo中,会把任意大小的输入图像reshape成800x600(即图2中的M=800,N=600)。再回头来看anchors的大小,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状。
这9个anchors怎么用?
对原图像经过卷积层的特征图中的每一个点,都配备这9种anchors作为初始检测框。后边再进行回归拟合出更准确地边框位置。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!下面看下论文中图片的过程:
在这里插入图片描述
多少个卷积核,多少个特征。1.经过卷积层,共有256个特征图,即一个位置256维度;
2,特征图上每个点有k个anchor(默认k=9),每个anchor判断是不是目标,所以每个点由256维的特征转换为2k的判断值,而每个人anchor都有(x,y,w,h)对应4个偏移量,所以reg=4k coordinates;
3,补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(选择标准?)

因为我们只用到了卷积和池化层,所以特征图的最终维度与原始图片是呈比例的。数学上,如果图片的尺寸是 w×h,那么特征图最终会缩小到尺寸为 w/r 和 h/r,其中 r 是次级采样率。如果我们在特征图上每个空间位置上都定义一个锚点,那么最终图片的锚点会相隔 r 个像素,在 VGG 中,r=16。下图是原始图片的锚点对应的中心
原始图片的锚点中心
1.softmax判定出positive anchor作为候选区域,完成了区域提案
在这里插入图片描述
过程如下:
MxN的图像经过特征提取到RPN网络前变(M/16)x(N/16),不妨设 W=M/16,H=N/16。在进入reshape与softmax之前,先做了1x1卷积,经过卷积输出图像为WxHx18大小(18个卷积核),softmax的前面做reshape是为了方便分类,变为[1,2,9xH,W]大小,之后再reshape回去。

2,回归网络原理
在这里插入图片描述
对于窗口一般使用四维向量(x,y,w,h)表示,分别表示窗口的中心坐标和宽高。对于上图,红色的框A表示原始的positive Anchors,绿色的框G 表示目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:
寻找一种变化F,使得F( A x A_{x} Ax, A y A_{y} Ay, A w A_{w} Aw, A h A_{h} Ah)=( G x , G_{x}^, Gx,, G y , G_{y}^, Gy,, G w , G_{w}^, Gw,, G h , G_{h}^, Gh,),其中( G x , G_{x}^, Gx,, G y , G_{y}^, Gy,, G w , G_{w}^, Gw,, G h , G_{h}^, Gh,) ≈ \approx ( G x G_{x} Gx, G y G_{y} Gy, G w G_{w} Gw, G h G_{h} Gh)
这种关系主要是存在两步:先平移再缩放,这种变化是一种线性变换, Y = W X Y=WX Y=WX,对于该问题,输入的X是卷积层得到的feature map,定义是 ϕ \phi ϕ,同时还有训练传入A与GT之间的变换量,即( t x t_{x} tx, t y t_{y} ty, t w t_{w} tw, t h t_{h} th)。输出是 d x ( A ) d_{x}(A) dx(A), d y ( A ) d_{y}(A) dy(A), d w ( A ) d_{w}(A) dw(A), d h ( A ) d_{h}(A) dh(A)四个变换。目标函数可以表示为:
d ∗ ( A ) = W ∗ T ⋅ ϕ ( A ) d_{*}(A)=W_{*}^T\cdot\phi(A) d(A)=WTϕ(A)
其中 ϕ ( A ) \phi(A) ϕ(A)是对应的锚点anchor的feature map组成的特征向量, W ∗ W_{*} W是需要学习的参数。
d ∗ ( A ) d_{*}(A) d(A)是预测值,为了使得预测值更接近真实的目标位置和框,设计L1损失函数: L O S S = ∑ i N ∣ t ∗ i − W ∗ T ⋅ ϕ ( A i ) ∣ LOSS=\sum_{i}^N\mid t_{*}^i-W_{*}^T\cdot\phi(A^i)\mid LOSS=iNtiWTϕ(Ai)
函数优化目标为: W ∗ a r g m i n L o s s W_{*}argminLoss WargminLoss最小化损失
进一步说明:
需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。 说完回归模型的原理,对应到Faster RCNN原文,positive anchor与ground truth 之间的平移量 ( t x , t y ) (t_{x},t_{y}) (tx,ty)和缩放尺度调整因子 ( t x , t h ) (t_{x},t_{h}) (tx,th)如下:
t x = ( x − x a ) / w a t_{x}=(x-x_{a})/w_{a} tx=(xxa)/wa t y = ( y − y a ) / h a t_{y}=(y-y_{a})/h_{a} ty=(yya)/ha t w = l o g ( w / w a ) t_{w}=log(w/w_{a}) tw=log(w/wa) t x = ( h / h a ) t_{x}=(h/h_{a}) tx=(h/ha)对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 ( t x , t y , t w , t h ) (t_{x},t_{y},t_{w},t_{h}) (tx,ty,tw,th),即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 ( t x , t y , t w , t h ) (t_{x},t_{y},t_{w},t_{h}) (tx,ty,tw,th),显然即可用来修正Anchor位置了。
在这里插入图片描述
卷积后性状变为WxH36,36是49,9个anchors的偏移变换量。
Proposal Layer建议层
从网络结构图可知道Proposal有三个输入,anchors是否positivate的分类结果WH2k和 positive anchors偏移量 WH4k和imge info,image info是原始图像信息大小和卷积层的缩放。
Proposal Layer forward按照以下顺序依次处理:
1.生成anchors
2,按照输入的positive scores由大到小排序anchors,提取前6000个anchors,即提取修正位置后的positive anchors
3,限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界
4,剔除尺寸非常小的positive anchors
5,对剩余的positive anchors进行NMS(极大值抑制)算法
输出:proposal=[x1, y1, x2, y2],注意,由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,这点在后续网络中有用

RPN网络结构就介绍到这里,总结起来就是:
生成anchors -> softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals
3.RoI pooling
输入包含两方面:
1,原始的feature maps;
2,RPN输出的proposal boxes(大小各不相同) propasal boxes存在的本质原因
过程:
1,因为输入的proposal是对应原图的尺寸,使用压缩比,映射回feature map的尺寸。
2,再将每个proposal对应的feature map区域水平分为pooled_wXpooled_h的网格;
3,对网格的每一份都进行max pooling处理

处理后,大小不同的区域,实现了固定长度的输出(论文是7x7),方便分类
4.分类
在这里插入图片描述
输入:从ROI Pooling获取到的7x7大小的区域特征
输出:1.通过全连接层和softmax对提案区域进行分类,识别区域内物体类别
2,对区域利用全连接层进行回归,获得更高精度的框的位置

5.训练
Faster RCNN属于two stage 网络,所以训练主要分为两个阶段,是在已经训练好的特征提取网络(VGG ResNet)基础上继续训练。实际的训练过程有6个步骤:
1,在已经训练好的model上,训练RPN网络(利用位置标记信息)
2,利用步骤1训练的RPN网络,收集提案区域(代替了之前R-CNN选择搜索的漫长过程)
3,第一次训练 fast RCNN网络(输入:feature map+proposal)
4,第二次训练RPN网路
5,再次利用步骤4训练好的RPN网路,收集proposals
6,第二次训练Fast RCNN网络
最后训练好两个网络,分别是RPN和 Fast RCNN
1,训练RPN
在这里插入图片描述
该过程中 conv layer是训练好的模型,整个网络的损失函数如下:包含了分类损失函数和回归损失函数 L ( p i , t i ) = 1 / N c l s ∑ i L c l s ( p i , p i ∗ ) + λ ∗ 1 / N r e g ∑ i p i ∗ L r e g ( t i , t i ∗ ) L({p_{i}},{t_{i}})=1/N_{cls}\sum_{i}L_{cls}(p_{i},p_{i}^*)+\lambda*1/N_{reg}\sum_{i}p_{i}^*L_{reg}(t_{i},t_{i}^*) L(pi,ti)=1/NclsiLcls(pi,pi)+λ1/NregipiLreg(ti,ti)
公式中字符含义:
i i i表示 anchors的索引值,每个锚点都要计算。 p i p_{i} pi表示分类到positivate的概率, p i ∗ p_{i}^* pi表示对应的GT预测的概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive, p i ∗ = 1 p_{i}^*=1 pi=1;反之IoU<0.3时,认为是该anchor是negative, p i ∗ = 0 p_{i}^*=0 pi=0;至于那些0.3<IoU<0.7的anchor则不参与训练)。 t t t代表predict bounding box, t ∗ t^* t代表对应positive anchor对应的GT box。
由于在实际过程中, N c l s N_{cls} Ncls N r e g N_{reg} Nreg差距过大,用参数 λ \lambda λ平衡,这里比较重要是 L r e g L_{reg} Lreg使用的soomth L1 loss.
图中的训练过程:
1,在RPN训练阶段,rpn-data(python AnchorTargetLayer)层会按照和test阶段Proposal层完全一样的方式生成Anchors用于训练;
2,对于rpn_loss_cls,输入的rpn_cls_scors_reshape和rpn_labels分别对应 p p p p ∗ p^* p N c l s N_{cls} Ncls参数隐含在 p p p p ∗ p^* p的caffe blob的大小中
对于rpn_loss_bbox,输入的rpn_bbox_pred和rpn_bbox_targets分别对应 t t t t ∗ t^* t ,rpn_bbox_inside_weigths对应 p ∗ p* p,rpn_bbox_outside_weigths未用到(从soomth_L1_Loss layer代码中可以看到),而 N r e g N_{reg} Nreg 同样隐含在caffe blob大小中
2,训练Fast RCNN
在这里插入图片描述
读取之前保存的pickle文件,获取proposals与positive probability。从data层输入网络。然后:
1,将提取的proposals作为rois传入网络,如图21蓝框
2,计算bbox_inside_weights+bbox_outside_weights,作用与RPN一样,传入soomth_L1_loss layer,如图21绿框
这样就可以训练最后的识别softmax与最终的bounding box regression了。

Mask R-CNN-扩展Faster R-CNN用于像素级分割

进一步扩展目标检测技术,定位每个目标的精确像素,这个问题成为图像分割。
在这里插入图片描述
Mask R-CNN 通过简单地向 Faster R-CNN 添加一个分支来输出二进制 mask,以说明给定像素是否是目标的一部分。如上所述,分支(在上图中为白色)仅仅是 CNN 特征图上的简单的全卷积网络。
在这里科普下全卷机网络 FCN
1.传统的基于CNN 的分割方法:
为了对一个像素分类,使用该像素周围的一个图像块作为CNN 的输入用于训练和预测。这种方法有几个缺点:
一.是存储开销很大
对每个像素使用的图像块的大小是 ​ , 然后不断滑动窗口,每次滑动的窗口给CNN 进行判别分类,因此则所需要的存储空间根据滑动窗口次数和大小急剧上升。

二是计算效率低下。
相邻的像素块基本上都是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
三是像素块大小的限制了感知区域的大小。
通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。
2,为了改进提出了全卷机FCN的概念
可以接收任意尺寸的输入图像,采用反卷积对最后一个feature map进行上采样,使它恢复到输入图像相同尺寸,从而可以对每个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图进行逐像素分类。
反卷积层
我们已经知道卷积层的前向操作可以表示为和矩阵C相乘,那么 我们很容易得到卷积层的反向传播就是和C的转置相乘 。
深层特征谱

深层的图像特征反卷积回去也会丢失很多信息,所以保存中间层信息,对反卷积的结果进行补充,最后完成整个图像的还原。
FCN的缺点
1.得到的结果不够精细,进行8背得的上采样虽然比32效果好了很多,但是上采样结果还是比较模糊和平滑的,对图像中的细节不敏感。

2.对个各个像素进行分类,没有充分考虑像素与像素之间的关系,忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值