您当前的位置:首页 > 发表论文>论文发表

特征检测论文

2023-03-01 19:26 来源:学术参考网 作者:未知

特征检测论文

对于目标检测方向并不是特别熟悉,本文记录一下RCNN, fast-RCNN, faster-RCNN, mask-RCNN这4篇有关目标检测的论文笔记和学习心得。

R-CNN的意思就是Region based,主要思路就是根据一张图像,提取多个region,再将每个Region输入CNN来进行特征的提取。因此RCNN就可以分为 Region proposals , Feature extraction 两个主要部分,提取的特征就可以输入任意一个分类器来进行分类。 模型的流程图如下:

在训练的时候,首先使用的是已经训练好的CNN网络作为特征提取器,但是由于预训练是在分类数据集上,因此在应用到检测之前要做finetune。也就是说,为了将用ImageNet数据集训练的网络应用到新的任务(检测),新的数据集(region)上,作者将原来的CNN最后的1000类的fc层,更改为了 层, 代表待检测的物体的类别数。然后,对于所有的region,如果它和ground truth的重叠率大于0.5,就认为是正类。 对于分类器的训练,作者发现选择多大的IoU来区分正类和负类非常关键。并且,对于每一类,都会训练一个分类器。

框的回归非常重要,在对每一个region proposal使用分类器进行打分评价之后,作者使用一个回归器来预测一个新的框作为结果。这个回归器使用的特征是从CNN中提取的特征。回归器的训练中,输入是 region proposal 的 和ground truth的 ,目标是学习一种变换,使得region proposal通过该变换能够接近ground truth。同时,希望这种变换拥有尺度不变性,也就是说尺度变化的话,变换不会改变。 如下图所示,每一个regressor会学习一组参数,特征输入是pool 5的特征输出,拟合的目标是 。

Fast-RCNN 主要解决的问题是在RCNN中对于每一个region proposal都进行特征提取,会产生非常多的冗余计算,因此可以先对一张图像进行特征提取,再根据region proposal在相应的特征上进行划分得到对应region的特征(映射关系)。 这样便可以实现共享计算提高速度,但是与SPPnets不同,SPPnets在一副图像得到对应的特征后,从这张图像的特征上proposal对应的部分,采用空间金字塔池化,如下图:

RoI pooling的方法很简单,类似于空间金字塔pooling,它将proposal部分对应卷积层输出的特征(称之为RoI,因为用于做pooling的特征是 region of interest,也就是我们感兴趣的区域)划分成 块,然后对每一块求最大值,最终得到了一个 的特征图。可以看出,它只是空间金字塔pooling的一部分。 但是SPP-nets的空间金字塔也是可以求导的,那么它到底不好在哪里呢?因为当每一个RoI都可能来源于不同的图像的时候(R-CNN和SPPnets的训练策略是从一个batch的不同图像中,分别挑选一个proposal region),SPPNets的训练非常地低效,这种低效来源于在SPPnets的训练中,每个RoI的感受野都非常地大,很可能对应了原图的整个图像,因此,得到的特征也几乎对应了整张图像,所以输入的图像也就很大。 为了提高效率,Fast-RCNN首先选取 个图像,再从每个图像上选择 个RoI,这样的效率就比从每个图像提取一个RoI提高了 倍。

为了将分类和框回归结合起来,作者采用了多任务的loss,来进行联合的训练。具体来说就是将分类的loss和框回归的loss结合起来。网络的设计上非常直接,就是将RoI得到的特征接几个FC层后,分别接不同的输出层。对应于分类部分,特征会接一个softmax输出,用于分类,对于框回归部分,会接一个输出4维特征的输出层,然后分别计算loss,用于反向传播。loss的公式如下:

回归的target可以参考前面的R-CNN部分。

notes

为什么比fast还fast呢?主要原因是在这篇论文中提出了一个新的层:RPN(region proposal networks)用于替代之前的selective search。这个层还可以在GPU上运算来提高速度。 RPN的目的:

为了能够进行region proposal,作者使用了一个小的网络,在基础的卷积层输出的特征上进行滑动,这个网络输入大小为 ,输入后会映射(用 的卷积)为一个固定长度的特征向量,然后接两个并联的fc层(用 的卷积层代替),这两个fc层,一个为box-regressoin,一个为box-classification。如下图:

在每一个滑动窗口(可以参考 ),为了考虑到尽可能多的框的情况,作者设计了anchors来作为region proposal。anchors就是对于每一个滑动窗口的中心位置,在该位置对应的原图位置的基础上,按照不同的尺度,长宽比例框出 个不同的区域。然后根据这些anchors对应的原始图像位置以及区域,和ground truth,就可以给每一个滑动窗口的每一个anchor进行标记,也就是赋予label,满足一定条件标记为正类(比如和ground truth重叠大于一个值),一定条件为负类。对于正类,就可以根据ground truth和该anchor对应的原图的区域之间的变换关系(参考前面的R-CNN的框回归),得到回归器中的目标,用于训练。也就是论文中的loss function部分:

自然地,也就要求RPN的两个并联的FC层一个输出2k个值用于表示这k个anchor对应的区域的正类,负类的概率,另一个输出4k个值,用于表示框回归的变换的预测值。

对于整个网络的训练,作者采用了一种叫做 4-step Alternating Training 的方法。具体可以参考论文。

与之前的检测任务稍有不同,mask r-cnn的任务是做instance segmentation。因此,它需要对每一个像素点进行分类。 与Faster R-CNN不同,Faster R-CNN对每一个候选框产生两个输出,一个是类别,一个是bounding box的offset。Mask R-CNN新增加了一个输出,作为物体的mask。这个mask类似于ps中的蒙版。

与Faster R-CNN类似的是,Mask R-CNN同样采用RPN来进行Region Proposal。但是在之后,对于每一个RoI,mask r-cnn还输出了一个二值化的mask。

不像类别,框回归,输出都可以是一个向量,mask必须保持一定的空间信息。因此,作者采用FCN来从每个RoI中预测一个 的mask。

由于属于像素级别的预测问题,就需要RoI能够在进行特征提取的时候保持住空间信息,至少在像素级别上能够对应起来。因此,传统的取最大值的方法就显得不合适。 RoI Pooling,经历了两个量化的过程: 第一个:从roi proposal到feature map的映射过程。 第二个:从feature map划分成7*7的bin,每个bin使用max pooling。

为此,作者使用了RoIAlign。如下图

为了避免上面提到的量化过程

可以参考

作者使用ResNet作为基础的特征提取的网络。 对于预测类别,回归框,mask的网络使用如下图结构:

整体看完这几篇大佬的论文,虽说没有弄清楚每一个实现细节,但是大体上了解了算法的思路。可以看出,出发点都源于深度神经网络在特征提取上的卓越能力,因此一众大神试图将这种能力应用在检测问题中。从R-CNN中简单地用于特征提取,到为了提高速度减少计算的Fast R-CNN,再到为了将region proposal集成进入整个模型中,并且利用GPU加速的RPN,也就是Faster R-CNN。再到为了应用于instance segmentation任务中,设计的RoIAlign和mask。包括bounding box regression,pooling层的设计,训练方法的选择,loss的设计等等细节,无一不体现了大师们的思考和创造力。 可能在我们这些“拿来”者的眼中,这些方法都显得“理所应当”和巧妙,好用,但是,它们背后隐藏的选择和这些选择的思考却更值得我们学习。 以及,对待每一个问题,如何设计出合理的解决方案,以及方案的效率,通用性,更是应该我们努力的方向。

论文 | 目标检测HOG特征解读《Histograms of Oriented Gradients for Human Detection》

有一个月没更博客了,捂脸 o( ̄= ̄)d

端午回家休息了几天,6月要加油~

回到正文,HOG是很经典的一种图像特征提取方法,尤其是在行人识别领域被应用的很多。虽然文章是2005年发表在CVPR上的,但近十年来还没有被淹没的文章真的是很值得阅读的研究成果了。

key idea: 局部物体的形状和外观可以通过局部梯度或者边缘的密度分布所表示。

主要步骤:

上图为论文中提供的图,个人觉得我在参考资料中列出的那篇 博客 中给出的图可能更好理解一些。

具体细节: 关于每一个过程的详细解释还是在 这篇博客 中已经写得很清楚了,这里就不再搬运了。

文章中数据集的图像大小均为:64*128, block大小为16x16, block stride为8x8,cell size为8x8,bins=9(直方图等级数);

获取到每张图的特征维度后,再用线性SVM训练分类器即可。

下图为作者而给出的示例图:

这两篇博客写的都很好,推荐阅读一波。

论文阅读——D2-Net: A Trainable CNN for Joint Description and Detection of Local Features

  作为近两年detector和descriptor joint learning(也称one-stage)类型论文的又一代表,D2-Net是一种相当特别的结构。其特点是“一图两用”,即网络预测出的dense tensor即是detection score maps,又是description map特征图即代表特征检测结果又代表特征描述结果(注意预测的特征图并不是原图分辨率大小)。换句话说,D2-Net的特征检测模块和描述模块是高度耦合的。

  本文主要针对的是appearance变化较大(包括日-夜变化、大的视角变化等)场景下的图像匹配任务。文章作者比较了两种局部特征学习方法:sparse方法和dense方法。其中sparse方法高效,但是在appearance变化大的场景提取不到可重复的关键点,其原因在于特征提取器只使用浅层图像信息,不使用语义信息;dense方法则直接利用深层特征提取密集特征描述,更加鲁棒却以更高的匹配时间和内存开销为代价。

  因此作者的目的在于,提出一种足够鲁棒的sparse local feature,让其提取的特征(兴趣点)具有更好的repeatability,进而实现既有sparse方法的高效性,又有dense方法的鲁棒性。其核心idea是将特征提取阶段延后,使得局部特征也可以利用高层语义信息,而不是只考虑低层信息。

问题:关于这里的sparse和dense方法

关键词:A single CNN plays a dual role; joint optimization; different train/test model structure

  不同于SuperPoint或者SEKD,本文虽然也是dense prediction类型的结构,但并不同时预测kpt和description两个图,而是只预测了一个形状为HxWxd(d为特征描述的长度)的特征图,然后既作描述结果又作检测结果…从spatial维度来说,该特征图的每个像素位置是一个描述子;从channel维度来说,每一个通道代表一个特征检测器的检测结果,总共得到d个2D响应图,这里可以用SIFT中的高斯差分金字塔响应来类比。

  后续的兴趣点提取需要对这个d通道的特征图做进一步的后处理:

  按照上面对D2特征图的定义,如果(i,j)位置是一个兴趣点,则从通道维度来说该像素位置最终的检测结果肯定要取检测器响应值最大的通道对应数值,这样就选出了通道;从空间维度来说又要满足该位置在该通道的2D map必须为一个局部最大值。即本文中的"hard feature detection":

  首先对输入图像构建图像金字塔,然后在每个scale上进行forward,得到D2特征图,再把多尺度特征图逐scale上采样并与同分辨率融合(见下式),得到融合后的特征图。预测阶段根据融合特征图进行上述后处理,即可提取出特征点。

  由于上述特点,网络结构本身发非常简单,直接用VGG16 conv4_3之前的部分,恢复ImageNet上的预训练权重,然后除了最后一层conv4_3之外全部冻结,只对该层做微调。不过关于模型,有两个值得注意的地方:

  1.使用VGG16的结果比ReseNet好很多
  2.训练时和测试时的模型结构不同
  具体来说,在测试阶段为了提高特征的分辨率,将pool3改成一个stride为1的avg pool,随后的三层conv dilation ratio调整为2,以维持相同的感受野。作者解释是说训练时为了减小内存使用比较小的特征分辨率,测试时为了提高特征定位能力,将分辨率提升到原图的1/4,并加上了一个类似SIFT中使用的局部特征提炼,然后将特征插值上采样到原分辨率。

  不过训练过程不能用上面的hard feature detection,因为其不可微。故作者提出了一个soft的版本,其设计思想就是模仿hard方法的通道选择和空间位置选择(即通道内的局部最大值):

  对于空间位置选择,作者会对特征图的每个像素求一个α(i,j),得到α map(shape为[h,w,d]):

  其中N(i,j)代表以(i,j)为中心的9-邻域。因此可见这里的局部最大值其实是在3x3区域内的最大值,而不是式(3)中写的那样,整个通道只输出一个最大值。

  对于通道选择,直接计算一个ratio-to-max得到β图(shape为[h,w,d]):

  根据kpt的定义,score map s就应该是α map和β map的乘积map在通道维度求最大值的结果。最后再做一个归一化:(问题:这个归一化让score map的像素值之和为1是什么意思?score map不应该用sigmoid之类的转为0-1之间的分布比较合理吗?)

  关于这部分还要考虑一个问题,为什么D2-Net需要在训练中提取兴趣点?(比如R2D2等结构,都是直接针对kpt score map做优化,只有实际预测时才需要根据score map提取特征点这个步骤)

  答:这个问题的理解是不正确的,训练中并不是提取兴趣点,而是在得到”single score map"。上面的hard feature detection相当于NMS的过程,输出的是稀疏的兴趣点位置坐标;而训练检测模块需要hxw的score map,故先要把hxwxd的特征图经过一个可微的步骤,处理后得到该score map。

①triplet margin ranking loss(只考虑描述子)

  训练描述子其实没有太多不一样的地方,就是根据输入pair的correspondences,将每一个匹配对c视为正对,不匹配对为负对,对构成的三元组进行训练。主要问题是如何根据当前匹配对c构建最有意义的负对。作者这里用了一个基于邻域的困难样本挖掘策略,假如当前匹配为下图的点A和点B,那么分别在I1和I2扣去A\B邻域的区域找负对,并分别与B的描述子dB、A的描述子dA进行比较,找到所有这种负对中相似度最小的,与c构建三元组。

  以下p(c)和n(c)分别代表正对距离和负对距离。m(c)代表当前匹配c的triplet loss。

②加入描述子优化的triplet margin ranking loss

  由于D2特征即代表兴趣点score map也代表描述子,本文的优化需要对检测和描述进行联合优化。作者在triplet margin ranking loss基础上加入了提升检测结果可重复性这一优化目标,具体实现方法是:利用输入两图像中所有correspondences的检测得分来对当前匹配计算出的triplet loss进行加权平均,如果当前匹配triplet loss很低(即该对匹配的距离远小于其各自的最难负对),则为了最小化loss,这一对triplet loss小(即区分度高)的correspondence自然要给更大的权值;其他triplet loss大的correspondence就给小点的权值。

  感觉文中式(13)的符号有点confusing,m(p(c),n(c))直接写成,m(c)可能更加简洁。

相关文章
学术参考网 · 手机版
https://m.lw881.com/
首页