目标检测CNN经典网络(一)R-CNN

在早期计算机视觉研究时,人们很好的将CNN应用在目标分类的问题中,但是一直不能很好的解决目标检测的问题,目标检测不仅要分析出其是什么东西,而且还要回归出其位置。这是其在CNN训练的痛点。为此出现了R-CNN网络。

R-CNN思路

R-CNN简单理解就是先训练一个CNN分类器,然后再对每幅图片挑选2000个预选区域,让这个预选区域经过R-CNN前向传播得到特征,特征先保留到硬盘中,此时与我们的标签进行对比,重叠率高的为正样本,重叠率低的为负样本,随后单独进行SVM训练。
R-CNN的整体思路如下:
(1)给定一张输入图片,从图片中提取 2000 个类别独立的候选区域。(selective search)
(2)对于每个区域利用CNN网络抽取一个固定长度的特征向量。(这个CNN是提前训练好的一个网络)
(3)再对每个区域所对应的特征向量利用 SVM 进行目标分类。
在这里插入图片描述

候选区域寻找selective search

关于候选区域的选择有多种方法,最简单的方法为滑窗法,就是以一定间距不断横纵遍历得到所有的窗口,但是所有区域都遍历,而且有时候物体不一样大?这就太浪费时间了。
论文章所采用的方法是选择搜索法。
算法具体如下图所示
在这里插入图片描述
step0:生成区域集R。

step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
//循环以下步骤
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:S若为空则跳出循环,否则跳至step2

相似度计算
那么关键点在于相似度怎么判断?
图像之间的特征有很多,颜色?纹理特征?尺寸等?对于相似度的判断,选择性搜索考虑了颜色、纹理、尺寸和空间交叠这4个参数。
1、颜色特征
将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。 对直方图除以区域尺寸做归一化后使用下式计算相似度:
在这里插入图片描述
上式如何理解?简单说一下,我们归一化后每个通道的数据后,一维特征向量的和为1.0,比较两个区域的特征向量每一位,把每一位的最小值加起来。如果全都一样那么结果肯定是1啊!如果不一样,每一位都取最小值,那就肯定比1小啊!哈哈就是这么理解。

2、纹理相似度(texture similarity)

论文这里的纹理采用SIFT-Like特征,采用方差为1的高斯微分在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8310=240(使用RGB色彩空间)。计算公式如下所示:
在这里插入图片描述

3、尺度相似度
尺度相似度其实是实现优先合并小的区域,也就是减少大区域合并小区域。
在这里插入图片描述
4、交叠相似度(shape compatibility measure)
上述完成后,要看一下两个区域是否爱挨着,如果距离十万八千里,那就没有合并的必要。如何计算?先找一个外接矩形把它框起来,如果两个矩形相距较远,则外接矩形就很大,所以我们设计这样的指标,其指标是合并后的区域的Bounding Box(能够框住区域的最小矩形BBij)减去两个矩形的尺寸,得到相对差距。其计算方式:
在这里插入图片描述
候选区域排序
相似度计算后还有一个问题,如何对候选区域排序呢,通过上述的步骤我们能够得到很多很多的区域,但是显然不是每个区域作为目标的可能性都是相同的,因此我们需要衡量这个可能性,这样就可以根据我们的需要筛选区域建议个数啦。

这篇文章做法是,给予最先合并的图片块较大的权重,比如最后一块完整图像权重为1,倒数第二次合并的区域权重为2以此类推。但是当我们策略很多,多样性很多的时候呢,这个权重就会有太多的重合了,排序不好搞啊。文章做法是给他们乘以一个随机数,毕竟3分看运气嘛,然后对于相同的区域多次出现的也叠加下权重,毕竟多个方法都说你是目标,也是有理由的嘛。这样我就得到了所有区域的目标分数,也就可以根据自己的需要选择需要多少个区域了。

CNN网络训练

上述过程我们得到了大量候选区域(每个候选区域都提供了矩形框的位置情况),怎么训练呢?
第一步、数据标注:我们对于每张图片标注一下boundbox四维向量和所属类别编号。
第二步、预训练:论文在大型辅助训练集ILSVRC2012分类数据集(分类数据集没有约束框数据,每幅图片对应一个类别标签)上预训练了CNN。预训练采用了Caffe的CNN库。
第三步、微调CNN
特定领域的参数调优
第一步训练了一个分类器,但是我们要做的是目标检测,而且我们换了另一套数据集,所以为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的候选窗口)。我们只使用变形后的候选区域对CNN参数进行SGD训练。
1、网络修改:ImageNet是用了专用的1000-way分类层,这里我们换成21-way分类层,(其中20是VOC的类别数,1代表背景),卷积部分都没有改变。
2、数据集选择性搜索算法会提取一些候选区域,如何区分正例,负例?这里我们考虑如果其和真实标注的框的IoU>= 0.5就认为是正例,否则就是负例。OK这样前面选择性搜索的框到了后面就利用IOU自动标注,然后去softmax训练
这样就训练了一个比较适合我们的候选框的分类器。
完美!

但是好像不好耶,重合度0.5就是正例,那不是好多一半框选目标就被认为合格了,一张图片会有好多的框合格对!那么你会想我们去把阈值调高点,不久解决了!这里作者考虑如果IOU太高那样正例就太少了,负例太多,譬如对于一张图片的2000候选框,1张合格,1999张不合格;那么训练会过拟合的!所以考虑这个,这里作者降低了IOU阈值(后面也有说)那么作者咋解决的?第四步~~
在这里插入图片描述
第四步、多目标分类器
这里作者就又搞了20个SVM分类器,上面第三步训练好了CNN了,我们把所有的图片走一遍CNN把最后的特征留下,不训练,把它保留当成特征,去训练SVM。这里把IOU<0.3的认为是负样本。

另外样本数据很大,每幅图片都对应着很多的候选区域特征emmm这里论文采用了hard negative mining method
训练时有时模型会把重叠率低的也当成正样本,这就属于顽固负样本,需要继续投进去训练。

【难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止.这一个过程就叫做’hard negative mining‘】

在这里插入图片描述

这里你会想到为啥不直接CNN时直接搞一个分类器,还用啥SVM?
对于这个问题我也有所疑惑,然后查了一下,大概这么解释还可以理清。

因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。一旦CNN f7层特征被提取出来,那么我们将为每个物体累训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到20004096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。

Bounding-box回归

上面完成了分类,但其实回归效果不是很好,作者又在第五层卷积层采用了Bounding-box回归对候选区域做了修正,提高了边框的回归效果。

下图,绿色的框表示Ground Truth, 红色的框为Selective Search提取的Region Proposal。那么很明显框定位不准(IoU<0.5), 如果我们能对红色的框进行微调, 使得经过微调后的窗口跟Ground Truth 更接近, 这样岂不是定位会更准确。 确实,Bounding-box regression 就是用来微调这个窗口的。
在这里插入图片描述
那么怎么变换呢?我们可以简单的看出可以通过平移、伸缩两种操作来实现。
如下图所示,我们需要目标框的四维向量和合格的预选区域的向量,然后要训练一个线形回归模型,下图左边那个公式,这里计算损失公式如右下角所示。训练好后就可以用来预测了。
具体哪个BoundingBox模型可以参考参考文献来学习。
在这里插入图片描述

测试环节非极大值抑制(Non-Maximum Suppression, NMS)

训练好了怎么测试?
测试阶段,在测试图像上使用selective search抽取2000个推荐区域(实验中,我们使用了选择性搜索的快速模式)。然后变形每一个推荐区域,再通过CNN前向传播计算出特征。然后我们使用对每个类别训练出的SVM给整个特征向量中的每个类别单独打分。
然后给出一张图像中所有的打分区域,然后使用NMS(每个类别是独立进行的),拒绝掉一些和高分区域的IOU大于阈值的候选框。

非极大值抑制
给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si, 1<=i<=N。
0、建造一个存放待处理候选框的集合H,初始化为包含全部N个框;建造一个存放最优框的集合M,初始化为空集。
1、将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;
2、遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。
3、回到第1步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。

用下面这张图可以看懂测试的流程。

在这里插入图片描述

总结

本篇论文虽然已经算是早起的目标检测的论文,但依然被新手所研究,算是目标检测的开篇之作把!他给出了目标检测的一个最简单的思路,但是费时费力。

参考文献

[1]【深度学习】R-CNN 论文解读及个人理解
https://blog.csdn.net/briblue/article/details/82012575
[2]R-CNN论文详解(论文翻译)
https://blog.csdn.net/v1_vivian/article/details/78599229
[3]选择性搜索(selective search)
https://blog.csdn.net/guoyunfei20/article/details/78723646
[4]第三十三节,目标检测之选择性搜索-Selective Search
https://www.cnblogs.com/zyly/p/9259392.html
[5]边框回归:BoundingBox-Regression(BBR)
https://blog.csdn.net/v1_vivian/article/details/80292569

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值