R-CNN论文阅读记录

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shiheyingzhe/article/details/83478078

R-CNN: Regions with CNN features
论文的链接:Rich feature hierarchies for accurate object detection and semantic segmentation
目标检测:
先确定需要检测什么?是检测人还是检测猫或者检测狗,还是说都要检测,大多数情况是多类检测,这个可以人为设定;
图片中检测到哪些类?然后检测到的类的位置在哪?

先来看图中检测有哪些类是怎么做的
     要想知道图中有哪些被检测的类,传统的方法是使用滑窗,先使用指定大小的框(32×32 pixels)进行像素级别的滑动,对每个滑动以后的框使用CNN进行分类,得到分类的结果,这里的分类就是传统的图像分类。滑窗造成的问题是需要检测的框有很多很多,会造成检测时间很长,而且会有重复的区域导致重复的CNN计算,定位不准确也是个问题。
    R-CNN提出的category-independent region proposals方法,对每张图片提取出约2000张类别独立的区域提议框region proposals,这些建议的区域就是可能包含被检测类的区域,这样就不用使用滑窗的方法盲目的找可能存在类的区域,而是先找到可能的区域。
    找到可能包含类的区域以后,将相应的区域从图片中截取出来,并resize到统一大小,送入到CNN网络中提取特征,所有region proposals全部提取特征以后就会得到约2000个特征向量,每个向量的维度是4096维,也就构成(约2000*4096)的矩阵。
    提取出来的特征分别送入到相应类的SVM分类器,分类器的作用是区分是否是检测的类,是二分类器。(这里可以不用SVM分类器的,直接使用CNN网络的softmax输出就可以分类,后面的fast-rcnn证明这点)
如果检测的是人、猫、狗、汽车、手机这5类,每个SVM分类器都会给出一个分数,每个region proposals就会有5个得分,组成(约2000*5)的矩阵,每列是相应类的分布,去除得分低于阈值(背景)的框,对每个类(每列)的计算用到NMS非极大值抑制,只保留得分较高的框,去除和得分最高框IOU值高于阈值的框。这样就得到哪些region proposals中有相应类。从而就检测到图中有哪些类。

检测到的类的位置在哪
    其实在提取region proposals的时候,就得到相应的坐标信息,根据SVM的打分情况并针对类使用NMS,就得到几个可能包含类的region proposals和位置信息,但是为了得到准确的位置信息,还会将样本最后一层卷积层的输出送入回归器,得到新的更接近ground truth的位置。

提取region proposals
    对图片提取region proposals的方法有很多种,包括objectness, selective search(fast model模式),category-independent object proposals等,文中用到的方法是selective search,在图像数据集ILSVRC中,由于图片大小不一致,导致每张图片提取出来的region proposals数量是不一样的。为此在SS之前,先将图片缩放(放大)到500*500,这样每张图片平均可以提取2403个region proposals。要知道一张图片提取的所有区域(2403张)可能和ground truth的IOU都低于0.5(作为阈值),以0.5为阈值,ILSVRC数据集所有图片的召回率recall是91.6%,PASCAL数据集所有图片的召回率是98%。这里召回率的意思是(有IOU大于或等于0.5的ground truth总个数)/(ground truth的总个数)

对CNN的输入resize到227*227
使用SS提取出约2000个可能包含类的区域以后,送入到CNN网络当中的时候,由于CNN网络包含全连接层,输入大小必须固定,所以需要对region proposals进行缩放(放大)到(227*227),其中一种是进行“扩张”,将一个region proposals周围的16个像素也放进来,然后再进行缩放。

CNN网络提取特征
包含5个卷积层,两个全连接层,输入是227*227,输出是4096维向量

线性SVM对特征进行打分(二分类,每个类单独一个SVM分类器)

训练:

CNN网络训练:进行CNN网络训练,需要准备标注好ground truth框的训练数据,耗时耗力标注的数据肯定不会太多。所以这里使用非监督预训练好的网络权重文件,然后在实际训练数据上对权重进行微调fine-tuning。微调的时候将全连接层的1000分类,修改为21分类(其中一种是背景)。
输入CNN网络的是region proposals(227*227),每张图片产生约2000张region proposals,每个region proposals都需要打上标签,需要确定是21类中的哪一类,是背景(负样本)?还是其中的20类(正样本)?如果单个区域region proposals和某类的ground truth的IoU值大于0.5,就标记为该类的正样本,其余的都被标记为负样本。
每次SGD迭代,都会选择32个正样本(所有类)和96个负样本(背景)放入到网络当中。
在微调fine-tuning以后,CNN网络就可以提取region proposals的特征,输出的是4096维特征向量

这里需要注意的是,论文作者也做过softmax的分类实验,不使用SVM,但是实际效果没有SVM好(这里可以不用SVM分类器的,直接使用CNN网络的softmax输出就可以分类,后面的fast-rcnn证明这点)

SVM分类器训练:每个类单独训练一个SVM分类器,训练二分类SVM分类器是需要正负样本的,这里正负样本也是在最开始SS产生region proposals的时候确定的,如果单个区域region proposals和该类的ground truth的IoU值小于0.3(交叉验证试出来的{0.1,0.2,...,0.5}),就标记为负样本(hard negative mining),正样本是该类的ground truth。其中0.3<=IoU的都被忽略了,负样本和正样本经过CNN产生的特征(约2000*4096)用来训练SVM分类器。如果是10类,就训练10个分类器。

Bounding-box回归训练:每个类计算一个回归模型,从CNN计算的特征中回归,使用的数据是CNN第5层(卷积层)pooling层产生的特征,用这个特征来建线性模型。如果使用region proposals和ground truth的IoU值过小的区域来训练回归,那么训练的模型不能用。这里取IoU值大于0.6的区域来回归。其中区域就带有坐标信息,但是使用回归更加的精确。

输入的region proposals区域为P,$P_x,P_y,P_w,P_h$是P在原图中的坐标,同样G代表ground truth的坐标,遵循的原则是先平移再缩放。
希望能够通过线性变化将输入区域的位置坐标变为相应ground truth的坐标,那么怎么得到$d_x(P)$,$d_y(P)$,$d_w(P)$,$d_h(P)$

$d_*(P)$ *\in\{x,y,w,h\},P输入到CNN网络中得到第5层的输出记为$\phi _5(P)$,那么$d_*(P)$=$w_*^T\phi _5(P)$,需要学习的参数是$w_*$,正则项使用的是岭回归,回归的目标定义为$t_*$
 

测试:

对图片使用SS(fast model模式)提取出约2000个可能包含相应类的区域建议框,然后对每个region proposals缩放(放大)到227*227,送入到CNN网络提取特征4096维,得到矩阵(约2000*4096),使用训练好的相应类的SVM分类器对每个特征向量分别进行打分(和该类IOU越大则打分越大),假设共有10类,则得到打分矩阵(约2000*10),对每个类(列),单独去掉低于阈值的可以肯定是背景的框,独立使用NMS去掉许多重叠的框,剩下的几个得分最高的框,就是该类的输出结果框。如果还使用Bounding box回归,得到的位置会更接近ground truth。
NMS的使用方式是对打分矩阵单独一列,从大到小排序,然后和得分最大的框IOU大于阈值的就删掉,接着和得分第二大的框IOU大于阈值的删掉,以此类推。
该类剩下来的几个得分高的框用来做回归,得到该类新框的位置坐标,对每个类都使用各自的回归模型。

该篇论文还展示了CNN网络几层学到的特征,方法是在第五个卷积层(输出为6*6*256),取出一个unit,就是从256个通道中选择一个通道,然后对所有的region proposals,相同的通道,都计算其activation激活值,根据激活值从大到小排序,然后使用NMS去掉重复的框,取top16个框来展现该层学到的共同特点。

论文中还做许多的实验,展现用微调、回归和使用CNN第7层输出的效果更好,还和其他当时的方法进行比较,进行相应的语义分割的实验。

展开阅读全文

没有更多推荐了,返回首页