图像检索:layer选择与fine-tuning性能提升验证

转自 http://yongyuan.name/blog/layer-selection-and-finetune-for-cbir.html 仅供方便自己学习使用 如有侵权请联系删除

作为迁移学习的一种,finetune能够将general的特征转变为special的特征,从而使得转移后的特征能够更好的适应目标任务,而图像检索最根本的问题,仍在于如何在目标任务上获得更好的特征表达(共性与可区分性)。一种很自然的方式便是在特定的检索任务上,我们对imageNet学得的general的特征通过finetune的方式,使得表达的特征能够更好的适应我们的检索任务。在End-to-end Learning of Deep Visual Representations for Image Retrieval Collaborative Index Embedding for Image Retrieval中已经很清楚的指出,通过基本的classification loss的finetune的方式,能够较大幅度的提高检索的mAP。因此,在本篇博文中,小白菜针对检索,主要整理了下面四个方面的内容:

  • CNN网络中哪一层最适合于做图像检索
  • 基于pre-trained模型做图像检索几种典型的特征表示方法
  • 抽取网络任意层的特征
  • 数据增强(Data Augmentation)
  • VGGNet16网络模型fine-tuning实践

在采用深度学习做检索的时候,上面四方面的问题和知识基本都回避不了,因此,小白菜以为,掌握这四方面的内容显得非常有必要。

特征表达layer选择

在AlexNet和VGGNet提出伊始,对于检索任务,小白菜相信,在使用pre-trained模型抽取特征的时候,我们最最自然想到的方式是抽取全连接层中的倒数第一层或者倒数第二层的特征,这里说的倒数第一层或者倒数第二层并没有具体指明是哪一层(fcx、fcx_relux、fcx_dropx),以VggNet16网络为例,全连接层包含两层,fc6和fc7,因此我们很自然想到的网络层有fc6、fc6_relu6、fc7、fc7_relu7甚至fc6_drop6和fc7_drop7(后面会说明fc6_drop6和fc6_relu6是一样的,以及fc7_drop7和fc7_relu7也是一样的),所以即便对于我们最最自然最最容易想到的方式,也面临layer的选择问题。为此,我们以VGGNet16网络为例,来分析CNN网络的语义层(全连接层)选择不同层作为特征做object retrieval的mAP的影响。

小白菜选取fc6、fc6_relu6、fc7、fc7_relu7这四层语义层的特征,在Oxford Building上进行实验,评价指标采用mAP,mAP的计算采用Oxford Building提供的计算mAP代码compute_ap.cpp,下表是fc6、fc6_relu6、fc7、fc7_relu7对应的mAP。


从上表可以看到,直接采用pre-trained模型抽取语义层的特征,在Oxford Building上取得的结果在45%左右,同时我们还可以看出,选取fc6、fc6_relu6、fc7、fc7_relu7对结果的影响并不大。这个结果只能说非常的一般,在基于pre-trained模型做object retrieval的方法中,比如Cross-dimensional Weighting for Aggregated Deep Convolutional FeaturesParticular object retrieval with integral max-pooling of CNN activations以及What Is the Best Practice for CNNs Applied to Visual Instance Retrieval?指出,选用上层的语义层其实是不利于object retrieval,因为上层的语义层丢失了object的空间信息,并且从实验的角度说明了选取中间层的特征更利于object retrieval。

实际上,在选取中间层来表达特征的过程中,我们可以去掉全连接层,从而使得我们可以摆脱掉输入图像尺寸约束(比如224*224)的约束,而保持原图大小的输入。通常,图像分辨率越大,对于分类、检测等图像任务是越有利的。因而,从这一方面讲,选取上层的全连接层作为特征,并不利于我们的object retrieval任务。一种可能的猜想是,上层全连接层的语义特征,应该更适合做全局的相似。

虽然中间层更适合于做object retrieval,但是在选用中间层的feature map作为raw feature的时候,我们面临的一个主要问题是:如何将3d的tensor转成一个有效的向量特征表示?下面小白菜主要针对这一主要问题总结几种典型的特征表示方法,以及对中间层特征选择做一些探讨与实验。

基于pre-trained模型做Object Retrieval几种典型的特征表示

SUM pooling

基于SUM pooling的中层特征表示方法,指的是针对中间层的任意一个channel(比如VGGNet16, pool5有512个channel),将该channel的feature map的所有像素值求和,这样每一个channel得到一个实数值,N个channel最终会得到一个长度为N的向量,该向量即为SUM pooling的结果。

AVE pooling

AVE pooling就是average pooling,本质上它跟SUM pooling是一样的,只不过是将像素值求和后还除以了feature map的尺寸。小白菜以为,AVE pooling可以带来一定意义上的平滑,可以减小图像尺寸变化的干扰。设想一张224224的图像,将其resize到448448后,分别采用SUM pooling和AVE pooling对这两张图像提取特征,我们猜测的结果是,SUM pooling计算出来的余弦相似度相比于AVE pooling算出来的应该更小,也就是AVE pooling应该稍微优于SUM pooling一些。

MAX pooling

MAX pooling指的是对于每一个channel(假设有N个channel),将该channel的feature map的像素值选取其中最大值作为该channel的代表,从而得到一个N维向量表示。小白菜在flask-keras-cnn-image-retrieval中采用的正是MAX pooling的方式。

上面所总结的SUM pooling、AVE pooling以及MAX pooling,这三种pooling方式,在小白菜做过的实验中,MAX pooling要稍微优于SUM pooling、AVE pooling。不过这三种方式的pooling对于object retrieval的提升仍然有限。

MOP pooling

MOP Pooling源自Multi-scale Orderless Pooling of Deep Convolutional Activation Features这篇文章,一作是Yunchao Gong,此前在搞哈希的时候,读过他的一些论文,其中比较都代表性的论文是ITQ,小白菜还专门写过一篇笔记论文阅读:Iterative Quantization迭代量化。MOP pooling的基本思想是多尺度与VLAD(VLAD原理可以参考小白菜之前写的博文图像检索:BoF、VLAD、FV三剑客),其具体的pooling步骤如下:

具体地,在L=1的尺度下,也就是全图,直接resize到256256的大小,然后送进网络,得到第七层全连接层4096维的特征;在L=2时,使用128128(步长为32)的窗口进行滑窗,由于网络的图像输入最小尺寸是256256,所以作者将其上采样到256256,这样可以得到很多的局部特征,然后对其进行VLAD编码,其中聚类中心设置为100,4096维的特征降到了500维,这样便得到了50000维的特征,然后将这50000维的特征再降维得到4096维的特征;L=3的处理过程与L=2的处理过程一样,只不过窗口的大小编程了64*64的大小。

作者通过实验论证了MOP pooling这种方式得到的特征一定的不变性。基于这种MOP pooling小白菜并没有做过具体的实验,所以实验效果只能参考论文本身了。

CROW pooling

对于Object Retrieval,在使用CNN提取特征的时候,我们所希望的是在有物体的区域进行特征提取,就像提取局部特征比如SIFT特征构BoW、VLAD、FV向量的时候,可以采用MSER、Saliency等手段将SIFT特征限制在有物体的区域。同样基于这样一种思路,在采用CNN做Object Retrieval的时候,我们有两种方式来更细化Object Retrieval的特征:一种是先做物体检测然后在检测到的物体区域里面提取CNN特征;另一种方式是我们通过某种权重自适应的方式,加大有物体区域的权重,而减小非物体区域的权重。CROW pooling ( Cross-dimensional Weighting for Aggregated Deep Convolutional Features )即是采用的后一种方法,通过构建Spatial权重和Channel权重,CROW pooling能够在一定程度上加大感兴趣区域的权重,降低非物体区域的权重。其具体的特征表示构建过程如下图所示:

其核心的过程是Spatial Weight和Channel Weight两个权重。Spatial Weight具体在计算的时候,是直接对每个channel的feature map求和相加,这个Spatial Weight其实可以理解为saliency map。我们知道,通过卷积滤波,响应强的地方一般都是物体的边缘等,因而将多个通道相加求和后,那些非零且响应大的区域,也一般都是物体所在的区域,因而我们可以将它作为feature map的权重。Channel Weight借用了IDF权重的思想,即对于一些高频的单词,比如“the”,这类词出现的频率非常大,但是它对于信息的表达其实是没多大用处的,也就是它包含的信息量太少了,因此在BoW模型中,这类停用词需要降低它们的权重。借用到Channel Weight的计算过程中,我们可以想象这样一种情况,比如某一个channel,其feature map每个像素值都是非零的,且都比较大,从视觉上看上去,白色区域占据了整个feature map,我们可以想到,这个channel的feature map是不利于我们去定位物体的区域的,因此我们需要降低这个channel的权重,而对于白色区域占feature map面积很小的channel,我们认为它对于定位物体包含有很大的信息,因此应该加大这种channel的权重。而这一现象跟IDF的思想特别吻合,所以作者采用了IDF这一权重定义了Channel Weight。

总体来说,这个Spatial Weight和Channel Weight的设计还是非常巧妙的,不过这样一种pooling的方式只能在一定程度上契合感兴趣区域,我们可以看一下Spatial Weight*Channel Weight的热力图:

从上面可以看到,权重大的部分主要在塔尖部分,这一部分可以认为是discriminate区域,当然我们还可以看到,在图像的其他区域,还有一些比较大的权重分布,这些区域是我们不想要的。当然,从小白菜可视化了一些其他的图片来看,这种crow pooling方式并不总是成功的,也存在着一些图片,其权重大的区域并不是图像中物体的主体。不过,从千万级图库上跑出来的结果来看,crow pooling这种方式还是可以取得不错的效果。

RMAC pooling

RMAC pooling的池化方式源自于Particular object retrieval with integral max-pooling of CNN activations,三作是Hervé Jégou(和Matthijs Douze是好基友)。在这篇文章中,作者提出来了一种RMAC pooling的池化方式,其主要的思想还是跟上面讲过的MOP pooling类似,采用的是一种变窗口的方式进行滑窗,只不过在滑窗的时候,不是在图像上进行滑窗,而是在feature map上进行的(极大的加快了特征提取速度),此外在合并local特征的时候,MOP pooling采用的是VLAD的方式进行合并的,而RMAC pooling则处理得更简单(简单并不代表效果不好),直接将local特征相加得到最终的global特征。其具体的滑窗方式如下图所示:

图中示意的是三种窗口大小,图中‘x’代表的是窗口的中心,对于每一个窗口的feature map,论文中采用的是MAX pooling的方式,在L=3时,也就是采用图中所示的三种窗口大小,我们可以得到20个local特征,此外,我们对整个fature map做一次MAX pooling会得到一个global特征,这样对于一幅图像,我们可以得到21个local特征(如果把得到的global特征也视为local的话),这21个local特征直接相加求和,即得到最终全局的global特征。论文中作者对比了滑动窗口数量对mAP的影响,从L=1到L=3,mAP是逐步提升的,但是在L=4时,mAP不再提升了。实际上RMAC pooling中设计的窗口的作用是定位物体位置的(CROW pooling通过权重图定位物体位置)。如上图所示,在窗口与窗口之间,都是一定的overlap,而最终在构成global特征的时候,是采用求和相加的方式,因此可以看到,那些重叠的区域我们可以认为是给予了较大的权重。

上面说到的20个local特征和1个global特征,采用的是直接合并相加的方式,当然我们还可以把这20个local特征相加后再跟剩下的那一个global特征串接起来。实际实验的时候,发现串接起来的方式比前一种方式有2%-3%的提升。在规模100万的图库上测试,RMAC pooling能够取得不错的效果,跟Crow pooling相比,两者差别不大。

上面总结了6中不同的pooling方式,当然还有很多的pooling方式没涵盖不到,在实际应用的时候,小白菜比较推荐采用RMAC pooling和CROW pooling的方式,主要是这两种pooling方式效果比较好,计算复杂度也比较低。


猜你喜欢

转载自blog.csdn.net/TTdreamloong/article/details/79960461