目标检测学习--Fast R-CNN

论文地址:

《Fast R-CNN》

R-CNN存在的问题

重复操作:R-CNN中用CNN对每一个候选区域反复提取特征,而一张图片的2000个候选区域之间有大量重叠部分,这一设定造成特征提取操作浪费大量计算;

步骤繁琐:R-CNN的训练先要fine tuning一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用regressors对bounding-box进行回归,另外region proposals也要单独用selective search的方式获得;

时间和内存消耗较大:R-CNN中目标分类与候选框的回归是独立的两个操作,在训练SVM和回归的时候需要用网络训练的大量特征作为输入训练样本,特征保存在磁盘上再读入的时间消耗是比较大的;

之后的SPPNet算法解决了RCNN中重复卷积的问题,但是SPPNet依然存在训练步骤繁琐,需要训练SVM分类器,需要额外的回归器,时间和内存消耗较大。

Fast R-CNN的改进

Fast R-CNN仍然使用selective search选取2000个建议框,但是这里不是将这么多建议框都输入卷积网络中,而是将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框。这样做的好处是,原来建议框重合部分非常多,卷积重复计算严重,而这里每个位置都只计算了一次卷积,大大减少了计算量;

由于建议框大小不一,得到的特征框需要转化为相同大小,这一步是通过ROI池化层来实现的(ROI表示region of interest即感兴趣区域);

Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置大小都是通过卷积神经网络输出的;

为了提高计算速度,网络最后使用SVD改进全连接层;

算法概述

网络结构如下:

  • 拿到一张原始图片,使用selective search算法选取建议框;
  • 将原始图片输入CNN中得到特征图,即最后一次池化前的卷积计算结果;
  • 对每个建议框从特征图中按照比例寻找到对应位置,截取出特征框,深度保持不变;
  • 将每个特征框划分为H*W个网格,在每个网格内进行池化,即在每个网格内取最大值,这就是ROI池化,这样每个特征框就被转化为H*W*C的矩阵(其中C为深度);
  • 将每个矩阵拉长为一个向量,分别作为之后的全连接层的输入,全连接层的输出有两个,计算分类得分和bounding box回归,bounding box表示预测框,前者是sotfmax的N+1类别分类器(N个类别+1个背景类),输出每一类的概率,所有建议框的输出构成得分矩阵;后者是输出一个N*4的矩阵,4表示(x, y, w, h),这里是对N个类分别计算了框的位置和大小;
  • 对输出的得分矩阵使用非极大抑制(NMS)方法选出少数框,对每一个框选择概率最大的类作为标注的类,根据网络结构的第二个输出,选择对应类下的位置和大小对图像进行标注;

训练时输入图片尺寸为224*224,经过5个卷积层和2个降采样层,这两个降采样层分别跟在第一和第二个卷积层后,进入ROIPooling层,该层是输入是conv5层的输出和region proposal,region proposal的个数差不多为2000个,然后经过两个output都是4096的全连接层,最后分别经过output个数是21和84的两个全连接层,这两个全连接层是并列的,不是前后关系,前者是分类的输出,代表每个region proposal属于每个类别的得分,后者是回归的输出,代表每个region proposal的四个坐标,最后是两个损失层,分类的是softmaxWithLoss,输入是label和分类层输出的得分;回归的是SmoothL1Loss,输入是回归层的输出和target坐标及weight;测试时与训练基本相同,最后两个loss层要改为一个softmax层,输入是分类的score,输出概率,最后对每个类别采用NMS(non-maximun suppression);这里写图片描述

模型结构如下:

  • 将最后一个最大池化层换成ROI池化层;
  • 将最后一个全连接层和后面的softmax1000分类器换成两个并行层,一个是全连接层1+21分类器,另一个是全连接层2+表示每个类预测框位置的输出;
  • 输入的不再只是图片,还有提取到的建议框位置信息;

ROI池化

ROI Pooling的作用是对不同大小的region proposal,从最后卷积层输出的feature map提取大小固定的feature map,因为全连接层的输入需要尺寸大小一样,所以不能直接将不同大小的region proposal映射到feature map作为输出,需要做尺寸变换。在论文中,VGG16网络使用H=W=7的参数,即将一个H*W的region proposal分割成H*W大小的网格,然后将这个region proposal映射到最后一个卷积层输出的feature map,最后计算每个网格里的最大值作为该网格的输出,所以不管ROI pooling之前的feature map大小是多少,ROI pooling后得到的feature map大小都是H*W,从而将特征图上大小不一的候选区域转变为大小统一的特征向量,送入下一层;

这里写图片描述

损失函数

损失函数分为两个部分,分别对应两个并行层

  • 对类别输出按照softmax正常计算损失;
  • 对框的位置的损失方面,标注为背景类的建议框不增加损失(体现在下面公式中的l[u>1] ,其实背景类直接不需要计算框的位置这一层损失),对于标注为物体类别的建议框来说,因为这一层输出的是每一个类别对应的(x, y, w, h),因此需要先挑选出真实类别的四个值,分别与ground truth的四个作差来计算loss;

SVD分解改进全连接层

模型前向传递过程,有近一半时间花费在了全连接层的计算上,就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次(每个建议框都要计算),可以使用SVD压缩全连接层,从而加速运算,假设全连接层输入数据为x,输出数据为y,全连接层参数为W,尺寸为u×v,那么该层全连接计算为y=Wx ,计算复杂度为u×v;若将W进行SVD分解,并用前t个特征值近似代替

那么原来的前向传播分解成两步,计算复杂度为u×t+v×t,若t<min(u,v),则这种分解会大大减少计算量。在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层不含偏置,第二个全连接层含偏置;实验表明,SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作;

SVD大大降低了单张图像前向传递的时间,仅会损失很少的mAP

联合候选框回归与目标分类的全连接层 

这里写图片描述

cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率;
bbox_prdict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数;

图示

Fast R-CNN总结 

  • Fast RCNN具有更高的目标检测的精度;
  • 训练过程采用多任务的损失函数;
  • 训练可以更新所有网络层的参数;
  • 不需要额外的磁盘空间存储特征;

 参考

Fast RCNN算法详解 

【目标检测】Fast RCNN算法详解 

【目标检测】Fast R-CNN论文详解(Fast R-CNN) 

RCNN系列文章之Fast RCNN详解 

仅为学习记录,侵删! 

猜你喜欢

转载自blog.csdn.net/panghuzhenbang/article/details/125141318