目标检测之Faster R-CNN论文

【目标检测之Faster R-CNN论文精讲,Faster RCNN-哔哩哔哩】 https://b23.tv/1aAkgpo
 

1.域泛化:域泛化作为迁移学习的一种,其能从多个具有不同数据分布的源域中,学习一个泛化能力强的模型,以便能在未知目标域的测试集上取得较好的效果。解决了模型在面对未知数据时的应用问题。这在实际应用中尤为重要。因为现实中模型往往需要在多种不同的环境下工作,且该技术应用广泛,CV,NLP语音识别等领域。

域适应和域泛化

域适应:当我们在源域上训练的模型需要在目标域应用时,如果两域数据分布差异太大,模型性能就有可能降低,这时可以利用目标域的无标签数据,通过设计特定方法缩小域间差异来提升模型在目标域的性能。

而域泛化与域适应不同,域泛化让模型学会泛化到多个新测试域,而不仅仅是适应一个特定的目标域,这种方法的核心在于利用多源域信息增强模型泛化能力。

2.Fast R-CNN算法:

Fast R-CNN接收一整张输入图片后,通过一些卷积层来得到一整张图片的一个特征图,然后通过ROI投影得到候选区域特征图,通过ROI池化层来将候选区域特征图转化成特定大小的一个候选区域特征图,再利用候选区域特征来识别出候选区域的类别和精确的坐标。

额外的模块,从原图中产生候选区域,有了候选区域之后才能够在这里使用ROI投影,把某一个候选区域的特征投影出来。
Region proposals是一个非常耗时的过程,所以proposals成为了测试时的一个计算瓶颈。
因此,整个Faster R-cnn论文最核心的内容就是在解决这个问题。


怎么减少这一步的时间,让整个算法真正能够去实时的部署

使用CNN来利用GPU来实现这个过程的加速,但是它忽略共享计算。使用CNN来实现这个过程的时候,肯定是需要先提取这幅图片上的图片特征才能得到这些区域。右边这个过程也是先提取这个图片上的图片特征,然后在实现后续的过程。

那么这两个CNN的特征提取部分是不是就可以合并到一起实现共享计算了,这样就只用提取一次特征,实现两个功能,而不用两个CNN都提一遍特征了。因此,这篇Faster R-CNN的解决思路就出来了,是使用深度卷积网络来计算Region proposals的过程,并且命名为区域建议网络RPN。

并且RPN可以与原来的Fast R-CNN共享卷积层,从而使得候选区域生成算法时间降低到10ms。

3.Faster R-CNN算法:

输入一张图片后,会通过深度卷积网络来得到它的卷积特征图,再把卷积特征图传给RPN模块来生成候选区域的位置,再通过ROI投影和原始的特征图来得到ROI区域的特征,得到每个候选区域特征后就可以用于后续的分类和回归。

Faster R-CNN算法和Fast R-CNN算法的区别:

Fast R-CNN算法是在原图上单独使用一个耗时的Selective search来产生候选区域的位置

但是Faster R-CNN算法是在共享的卷积特征图上使用RPN模块来生成候选区域的位置。

最核心的部分是使用RPN替换掉SS这个算法。

RPN如何产生候选区域?

4.RPN网络结构

卷积层可以使用ZF模型、VGG模型、Resnet模型或者是别的网络都是可以的,只不过不同模型的这个提取能力不同。

RPN最根本作用是通过CNN产生候选区域过程,指的应该是(细节:)输入一张原图一直到产生候选区域过程,只不过前面的卷积层恰好能够和Fast R-CNN共享。RPN不仅仅是一个过程(一个黄色箭头),也可能是整个网络。

小的网络而不是直接写的RPN,RPN是指的一个过程,而不仅仅是一个黄色箭头。

为什么要在这里写滑动一个小的网络呢?

这是因为小网络的输入是卷积特征图上的一个N*N的空间窗口

eg:假设你得到的是一个H*W大小的特征图,并且这个特征图有c个通道。

假设c=256,它下面应该还有255个通道的特征图

假设空间窗口的大小是3*3的大小,那么需要把3*3乘以256通道的这一小块特征传给他后面的这个小网络,让它去根据这一小块特征来判断原图上的这一小块附近能不能产生候选区域

判断完这个位置后,把它再向右滑动一小格,然后再判断另外一个3*3区域能不能产生候选区域,然后一直不断滑动到右下角,就能得到整个特征图上所有位置的候选区域了。

所以这里这个滑动一个小的网络指的就是这么一个不断滑动的过程。

接下来我们看看滑动到某个具体位置后,这个小网络内部实现了什么操作?

在小网络内部,每个滑动窗口被映射到一个更低维的特征,如果是ZF模型的话,这个低维特征的通道数据是256,VGG是512,这是因为ZF模型比VGG模型简单层数少,通道数也就少一些。

这个低维特征被传给两个并行的全连接层,一个用于框回归(精确坐标),另一个用于分类。

小网络内部的具体执行过程:

针对某个具体的3*3*256通道的窗口,通过中间层来产生256维的低维特征,把这个低维特征分别传给一个分类层,用来阐释类别,再传给回归层来产生一个坐标。

中间层可以通过一个3*3的卷积层来实现。

分类层可以通过1*1的卷积或者全连接层再加上一个soft max函数来实现。

回归层同理,通过一个1*1的卷积或者全连接层来实现。


RPN网络目的:根据这个区域的特征,在原图的相应位置附近来产生候选的矩形框。

4k:中心点加上宽和高,这四个值就能唯一的确定一个矩形框的位置。

2k:对产生的候选框计算一个它包含目标的概率。每个候选框都会产生有目标和没有目标这两种概率值。2k指二分类的概率。

k:anchor,表示的是参考框,利于区域的特征去产生候选框,并不是让网络去凭空产生的,所以就给它定义了k个参考框,最后输出的是每个参考框的偏移量。

后续根据概率值可以把值比较小的候选框给过滤掉。

所以这个网络的输出是2k和4k。


anchor的尺度:

在每个滑动位置,作者默认使用三个尺度和三个长宽比的anchor,3*3就是9个anchor

128 256 512 

1:1 1:2 2:1

每个anchot负责预测这个区域内和它们形状比较接近的候选框,这九个anchor(128, 1:1 1:2 2:1以此类推)一般足以覆盖使用的数据集里面的目标形状。

coco数据集小目标比较多,额外增加64尺度。

anchor大小的设置也是有讲究的,一般会根据你使用的数据集去具体设置,如果anchor和带检测目标的大小越匹配,最后训练出的模型效果就越好。

yolo系列算法,不是事先去写死几个anchor的尺寸,而是在模型训练前事先统计好整个数据集上所有标注框的大小,然后通过聚类算法来计算出最合适的anchor大小。

我们在论文中使用的九个anchor,它是具有多个尺度的,所以被称为多尺度的anchor,并且每滑动到某个位置,都会使用9个anchor,所以也被称为平移不变的anchor。


RPN的损失函数:

求模型训练过程中预测值和目标值之间的偏差,对于每个anchor,RPN网络输出的二和四就是预测值。

作者分配正标签给两种anchor,第一种anchor是那些和标注框具有最大IOU重叠的。

如果某个anchor和这个标注框之间计算出来的IOU最大,就说明这个anchor和这个标注框之间最为相似,所以这个标注框就会分配一个正标签给这个anchor。

也就是紫色anchor的目标值就是绿色的标注框。

第二种应该被分配正标签的anchor,就是那些与标注框IOU重叠大于0.7的anchor。

他可能没有紫框和标注框IOU大,但是它和原来这个绿色标注框的IOU重叠也大于0.7,所以这个标注框也应该分给那些IOU重叠高于0.7的anchor。

因此一个标注框可能分配正标签给多个anchor。

在训练过程中有正样本外,还需要有负样本,因此作者把负标签分配给那些与所有标注框之间IOU重叠都低于0.3的非正anchor。

假设有一个anchor跟所有标注框之间重叠都小于0.3,因此它就应该是一个负样本。


分配完正负样本之后,对于每个anchor都有了预测值和目标值,我们接下来就可以去定义损失函数了。

RPN网络的损失函数是由两个分支各自产生的,分类损失和回归损失构成的。

由于每次传入的是一个mini batch的训练样本,i表示 一个mini-batch中每一个anchor的索引。

所有anchor的是损失需要通过求和符号给加起来。

分类损失:

这里的pi表示第i个anchor是一个候选目标的预测概率值。

pi*就表示这个anchor的真实标签。如果anchor被分配成正标签,pi*=1;如果anchor被分配成负标签,pi*=0;

Ncls表示pi和pi*之间的一个log损失。

回归损失:

ti表示每个anchor的四个预测值,ti*表示每个anchor的真实值。

Lreg表示预测值和真实值之间的偏差,再求一个smooth L1损失。

pi*表示只有正标签才等于1,才去计算这个回归损失。

如果是负标签是0,就直接把这个回归损失给忽略掉。

分类损失和回归损失分别用Ncls和Nreg在两个参数来进行归一化,使用拉姆达这个参数来平衡这两个损失。

Ncls=256,Nreg=2400.

1000*600 长宽缩小16倍 1000/16*600/16约等于2400。

由于Nreg比Ncls大了十倍,N在损失函数是在分母上,所以回归损失会比分类损失小10倍,所以回归损失前面的拉姆达参数就设置为10,为了平衡这两个损失值的大小。

Faster R-CNN代码用的并不是这个值,mini-batch=256,通常会有一半是正样本,一半是负样本,只有正样本才会求最后回归损失,大多数情况下都等于128。

由于归一化后的回归损失表示的是平均每个anchor的回归损失。

归一化后的平均损失表示的是平均每个anchor的平均损失。

拉姆达=1。

RPN网络的损失函数和fast R-CNN损失函数很像,原理是相通的。

另外,RPN网络框回归所预测出来四个值tx,ty,tw,th分别是anchor中心点的偏移量归一化后的值,和宽高分别归一化后再取log的值。

这四个和t相关的值都是预测值。

和t*相关的值都是目标值。


训练RPN网络

RPN网络训练,训练时采用随机梯度下降法(SGD)作为优化器,并且遵循以图片为中心的采样策略。

5.RPN和Fast R-CNN

这两个网络的卷积层是可以共享的

(1)交替训练:先训练RPN网络,然后使用RPN网络产生的候选区域来训练Fast R-CNN网络,Fast R-CNN网络的权重又能被用来初始化RPN网络。RPN网络训练好后,产生的候选区域又能再用于Fast R-CNN网络的训练。

四步交替训练法:

a.先单独训练一个RPN网络,由于RPN网络能够产生候选区域;

b.单独额外训练一个Fast R-CNN网络,使用第一步训练好的RPN网络;

c.使用Fast R-CNN网络来初始化RPN网络,但是固定了共享的卷积层,并且只微调RPN网络独特的结构;

d.冻结共享卷积层,只微调Fast R-CNN网络独特的后面几层。

使用a模块来在特征图上产生候选区域,利用a模块产生的候选区域以及原始的特征图,来得到每个候选区域的特征,利用b模块来对每个候选区域进行分类和回归。

(2)近似联合训练:直接训练合并到一块的模型。RPN和Fast R-CNN网络在训练一开始就被合并成一整个网络,每次训练的时候输入一整张图片,会沿着这个网络传输过去,在a模块会有一个RPN网络产生的损失,在b模块会有一个Fast R-CNN网络产生的损失,直接把他们两个简单结合起来,让a模块这样反向传播回去,让b模块反向传播回去,就能很简单的解决联合训练的问题。

和(1)相比,训练时间减少了25%。

问题:方法2忽略了候选区域框坐标的一个偏导数

在a模块得到了候选区域的坐标,传给c模块去使用,再去求后续的损失。

在b模块求得的损失在反向传播的时候,需要从c模块传到a模块,影响a模块的参数。

但是损失传到a模块时,没办法求这个坐标的偏导数,也就是导致损失没办法这样传回去。

因此方法二才被叫做近似联合训练。

(3)非近似联合训练:解决了方法二中没有办法去求坐标偏导数的问题。

6.数据分析:

conv:提取特征图的卷积部分

proposal:候选区域生成部分

region-wise:基于候选区域做的一些后续处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值