R-CNN随笔No.1

        最近因为某些原因,需要研究一下目标检测的知识,R-CNN是一个经典的目标检测方法,闲话少说,进入正题。

        R-CNN有两个主要的思想:1.region proposals上使用大容量的卷积神经网络进行目标定位与分割;2.当缺乏标记的训练数据时,先在一个额外的数据集上进行有监督训练,再在特定领域的数据集下进行微调。

        传统的目标检测方法大都是基于SIFTHOG的人工规定的特征的(如DPM方法),这种特征表示方式类似生物视觉网络的低层表示,而我们知道生物的视觉系统是多层次的,所以如果我们能分层次,阶段的计算特征定可以为视觉识别获得更多的信息。而卷积神经网络(CNN)就做到了这一点,在2012年,Krizhevsky等人就利用CNNILSVRC的比赛中取得了优异的成绩,那么问题来了,CNN在图像分类问题取得了显著的成绩,那它是否能够在目标检测任务中也可以得到好的结果呢?

        如何搭建图像分类和目标检测之间的桥梁呢?不同于图像分类,目标检测需要确定目标在图像中的位置。一种思路是将定位问题转化为回归问题;但Szegedy等人的工作已经证明了这一思路的效果并不好。另一种是构建一个滑动窗口检测器,这一方法已广泛应用在人脸与行人检测领域中,R-CNN的作者也尝试了这种方法,但这种方法有一个显著的缺点就是随之网络的增高,卷积层对输入图像的receptive fields(感受野)和strides会非常大,其会产生极大的计算挑战。最终R-CNN使用了region proposals的理念,取得了显著的效果。

        解决了如何利用CNN进行目标检测的问题,我们还用一个问题亟待解决----缺少标记数据。传统的解决思路是先进行无监督训练,再利用少量标记数据进行(fine-tuning)微调。而R-CNN的作者是这样处理的,其现在一个大的数据集(ILSVRC)上进行有监督的预训练,在再指定的小数据集(PASCAL)上进行fine-tuning。这种方式将方法的平均精确度提高了近8个百分点。

        文章中还提出了一种bounding-box regression方法,进一步提高了系统的定位准确性。其在文章的附录中有详细的解释,我将在今后的博文中进行解说。

1 R-CNN: Region with CNN features

        R-CNN分为三个部分:1.第一部分用来生成类别独立的region proposals2.第二部分使用卷积神经网络从每个region中提取固定长度的特征向量。3.第三部分是一个特定类别的线性SVM的集合。

        我们有许多可以选择的用来生成类别独立的region proposals的方法,而R-CNN对于使用什么方法来生成region并不关心,文章中使用了selective search的方法生成region proposals,一边与使用了同样生成方法的已有工作来进行比较。selective search的详细内容读者可以参考这篇文章--- Selective search for object recognition

        R-CNN使用Krizhevsky等人设计的CNN(输入是227*227RGB图像,有5层卷积层及两层全链接层)从每个regionproposal提取4096维的特征向量。需要注意的是我们获得的region proposal的大小及横纵比是任意的,我们使用warp(一种枋射投影变换)的方式将图像数据转化为网络所要求得格式。(文章在附录A中对图像的转换方式做了详细讨论)

        我们怎样在测试的时候使用R-CNN呢,我们首先使用selectivesearch在测试图像上生成大于2000region proposals。然后将region proposals转化的所需形式,再在通过CNN提取特征,对特征使用特定的SVMs进行评分判定。这里作者使用了非最大抑制的方式,即在指定类时,如果一个region和另一个得分更高的region之间的IoU(其实就是重叠面积)大于学习的阈值,则将其抛弃。

        在训练阶段,R-CNN先使用Caffe中提供的CNN(近似Alexnet网络)在一个大的额外数据集(ILSVRC2012分类数据,该数据只有图片级的标签,bounding-box级的标签是不可用的)上预训练网络;为使得网络可以适应新的目标识别任务,作者在新的数据上得到的经过warpedproposals上继续使用SGD(随机梯度下降)训练网络参数。在这一阶段(fine-tuning)网络除将有1000个节点的分类层替换为有N+1个节点的分类层(这里的N是类别数,加1代表背景)外网络结构保持不变。在这里我们将与ground-truth box(真实边框)之间的IoU大于0.5region proposals标记为正,其他的标记为负。fine-tuning阶段SGD的学习率为0.001,以保证是微调网络参数,而不是重置。在每次SGD迭代中,批次大小为128,其为32个正样本,96个负样本。

        我们使用SVM进行分类,那么问题来了,怎样标记分类样例的标记呢?很显然如果对象整体全部位于region中,自然标记为正;同样如果region中完全不含有目标对象,则该标记为负,那region中含有一部分的呢?作者使用了这样的定义方式,将于真实边框之间的IoU的大小小于阈值的区域标记为负(作者经过尝试,将阈值定位0.3)。而正样例直接简单定义为每个类的ground-truth box。在优化SVM的过程中,因为训练数据需要大量的内存来存储,因此作者使用了标准的hard negative mining方法(是什么,我也不太清楚,以后再讨论)

        细心的读者可能已经发现作者在微调和分类阶段使用的标记类别标准是不同的,作者在附录B的部分做出了解释,并对为什么要使用SVM来进行判断,而不是直接使用最后的softmax层进行了讨论。我将在今后的博文中解说。

        好了,到此为止R-CNN的基本内容就说完了,至于文章的实验展示部分及其他内容将在以后的博文中进行介绍。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值