先说最大池化。maxpooling在卷积之后也会有一个pooling操作。虽然还有其他的比如averagepooling,这里只说maxpooling。maxpooling的操作如下图所示:将整张图片分成几个大小相同(poolingsize)的小块,不重叠。每个小块只取最大的数,丢弃其他节点后,保持原来的平面结构得到输出。Maxpooling在不同深度上分别进行,不需要参数控制。那么问题来了maxpooling的作用是什么?是不是有些信息丢弃后就没有影响了?最大池化的主要作用是在不破坏识别结果的情况下进行下采样。这意味着在用于识别对象的卷积之后,FeatureMap中存在不必要的冗余信息。那么我们反过来想,这些“冗余”的信息是如何产生的。直观上,为了检测特定形状的存在,我们使用过滤器逐步扫描整个图像。但是只有特定形状的区域卷积得到的输出才是真正有用的,其他区域用滤波器卷积得到的值可能对形状存在的判断影响较小。比如下图中,我们还是考虑检测“横折”的形状。卷积后得到的3x3FeatureMap中,编号为3的节点是真正有用的,其余值与本任务无关。因此,使用3x3Maxpooling后,不影响“水平折叠”的检测。想象一下,在这个例子中不使用Maxpooling,而是让网络自己学习。网络还将学习接近最大池化效果的权重。因为是近似的效果,增加更多参数的代价不如直接进行Maxpooling。Maxpooling也有类似“选句”的作用。如果有两个节点,在一定的输入条件下第一个节点最大,那么网络只会在这个节点上流通信息;而其他的输入会让第二个节点的值最大,那么网络就会转向并取这个节点的分支。但是Maxpooling也有缺点。因为并不是所有的抓取都是像上图这样的极端例子。一些周围的信息也会对判断某个概念是否存在产生影响。而Maxpooling是对所有FeatureMap的等价操作。就像用同样网眼大小的网钓鱼,肯定会有漏网之鱼。下面对其他的pooling方法做一个简单的排序(我前阵子整理的pooling方法是比较好的流行的pooling方法)。SUMpooling是基于SUMpooling的中层特征表示方法,是指对中间层的任意通道(比如VGGNet16,pool5有512channels),这样每个channel得到一个实数值,N个channel最终会得到一个长度为N的向量,这就是SUMpooling的结果。AVEpoolingAVEpooling是averagepooling,本质上和SUMpooling是一样的,只是把像素值相加再除以featuremap的大小。作者认为AVEpooling可以带来一定的平滑感,可以减少图像尺寸变化的干扰。想象一张224224的图片,resize到448448,分别用SUMpooling和AVEpooling对两张图片进行特征提取。我们的猜测是,SUMpooling计算的余弦相似度相比AVEpooling计算的余弦相似度应该更小,也就是说AVEpooling应该略好于SUMpooling。MAXpoolingMAXpooling是指对于每个通道(假设有N个通道),选取该通道的特征图像素值的最大值作为该通道的代表,从而得到一个N维的向量表示。作者在flask-keras-cnn-image-retrieval中使用了MAXpooling的方式。上面总结的SUMpooling、AVEpooling、MAXpooling,这三种pooling方法,在笔者做的实验中,MAXpooling略优于SUMpooling、AVEpooling。然而,这三种池化方法对对象检索的改进仍然有限。MOPpoolingMOPPooling来自文章Multi-scaleOrderlessPoolingofDeepConvolutionalActivationFeatures。第一位是龚运超。当我在做散列的时候,我读了他的一些论文。其中最具代表性的论文是ITQ。作者本人还专门写了一篇笔记论文阅读:IterativeQuantizationIterativeQuantization。MOPpooling的基本思想是multi-scale和VLAD(关于VLAD的原理可以参考作者写的博文图像检索:BoF,VLAD,andFV)。具体池化步骤如下:Overviewofmulti-scaleorderlesspoolingforCNNactivations(MOP-CNN)。我们提出的特征是来自三个级别的特征向量的串联:(a)级别1,对应于整个256256图像的4096维CNN激活;(b)2级,通过从128128个补丁中提取激活并将它们与100个中心的密码本进行VLAD池化而形成;(c)第3层,与第2层的形成方式相同,但具有64*64块。具体来说,在L=1的尺度下,即整幅图像,直接resize到256*256的尺寸,然后送入网络,得到第七层全连接层的4096维特征;当L=2时,滑动窗口使用128*128(步长为32)的窗口,因为网络的图像输入最小尺寸为256*256,所以作者upsamples为256256,这样一来很多可以得到局部特征,然后对其进行VLAD编码,其中聚类中心设置为100,将4096维的特征降为500维,这样就得到了50000维的特征,然后50000维特征降维得到4096维特征;L=3的处理过程与L=2的处理过程相同,只是窗口的大小被编程为64*64。作者通过实验证明,这种方式MOPpooling得到的特征是不变的。基于这种MOPpooling,作者没有做过具体的实验,所以实验结果只能参考论文本身。CROWpoolingForObjectRetrieval,在使用CNN提取特征时,我们想要的是在有物体的区域进行特征提取,就像提取SIFT特征等局部特征构造BoW、VLAD、FV向量一样,可以使用MSER,Saliency和其他方法将SIFT特征限制在有对象的区域。同样基于这个思路,在使用CNN做ObjectRetrieval的时候,我们有两种方法来提炼ObjectRetrieval的特征:一种是先做物体检测,然后在检测到的物体区域提取CNN特征;另一种方式是我们通过某种权重自适应的方法,增加物体区域的权重,降低非物体区域的权重。CROWpooling(Cross-dimensionalWeightingforAggregatedDeepConvolutionalFeatures)是后一种方法。CROWpooling通过构造Spatialweights和Channelweights,可以在一定程度上提高感兴趣区域的权重,降低非物体区域的权重。重量。其具体的特征表示构建过程如下图所示:核心过程是SpatialWeight和ChannelWeight这两个权重。SpatialWeight在计算的时候直接求和加到每个通道的featuremap中。这个SpatialWeight其实可以理解为saliencymap。我们知道,通过卷积滤波,反应强烈的地方一般是物体的边缘等,所以在多个通道相加求和后,那些非零且响应大的区域一般就是物体所在的区域,所以我们可以用它作为特征图的权重。ChannelWeight借鉴了IDF权重的思想,即对于一些高频词,比如“the”,这类词的出现频率看起来很高,但实际上对于信息的表达作用不大,也就是它包含的信息量太少,所以在BoW模型中,这类停用词需要降低权重。借用ChannelWeight的计算过程,我们可以想象这样一种情况,比如某个channel,它的featuremap的每个像素值都是非零的,而且都比较大。从视觉上看,白色区域占据了整个featuremap,我们可以认为这个通道的featuremap不利于我们定位物体的区域,所以我们需要降低这个通道的权重channel,而对于白色区域在featuremap中所占面积较小的channel,我们认为对于定位非常重要的对象包含了很多信息,所以应该增加这个channel的权重。而这种现象非常符合IDF的思想,所以作者使用IDF的权重来定义ChannelWeight。总的来说,SpatialWeight和ChannelWeight的设计还是很巧妙的,但是这样的pooling方式只能在一定程度上拟合感兴趣的区域。我们可以看一下SpatialWeight*ChannelWeight的热力图:从上面可以看出权重大的部分主要在spire部分。这部分可以被认为是判别区。当然,我们也可以看到,在图像的其他区域,也有一些比较大的权重分布。这些区域是我们不想要的。的。当然,从作者可视化的其他一些图片来看,这种crowpooling方法并不总是成功的,也有一些图片的权重区域不是图片中物体的主体。不过从千万级库的结果来看,crowpooling还是可以取得不错的效果的。RMACpoolingRMACpooling的池化方法源自具有CNN激活的积分最大池化的特定对象检索。第三作者是HervéJégou(和MatthijsDouze是好朋友)。在这篇文章中,作者提出了一种池化方法RMACpooling。主要思想类似于上面提到的MOPpooling。它采用了可变窗口的方式来滑动窗口,但是它在滑动窗口的时候,并不是在图像上滑动窗口,而是在特征图上进行的(这样大大加快了特征提取速度)。另外,在合并局部特征的时候,MOPpooling使用了VLAD的方式进行合并,而RMACpooling处理的更简单(简单并不代表效果不好),直接把局部特征相加得到最终的全局特征。具体的滑动窗口方法如下图所示:图中显示了三种窗口大小,图中的'x'代表窗口的中心。对于每个窗口的featuremap,论文采用了MAXpooling的方法,当L=3,即使用图中所示的三种窗口大小,我们可以得到20个局部特征。另外,我们会在整个faturemap上做MAXpooling得到一个全局特征,所以对于一张图片,我们可以得到21个局部特征(如果得到的全局特征也算局部),这21个局部特征直接相加求和得到最终的全局全局特征。在论文中,作者比较了滑动窗口的数量对mAP的影响。从L=1到L=3,mAP逐渐提高,但当L=4时,mAP不再提高。其实RMACpooling中设计的窗口的作用就是定位对象的位置(CROWpooling是通过weightmap来定位对象的位置)。如上图所示,窗口之间存在一定的重叠,最后在形成全局特征的时候,采用了求和相加的方法,所以我们可以看到那些重叠的区域可以认为是赋予了更大的权重.上面提到的20个局部特征和1个全局特征是直接合并添加的。当然,我们也可以把这20个局部特征加起来,然后和剩下的全局特征连接起来。在实际实验过程中发现,concatenation的方法相比之前的方法有2%-3%的提升。在100万规模的gallery上测试,RMACpooling可以取得不错的效果。与Crowpooling相比,两者并没有太大区别。以上总结了6种不同的池化方法。当然还有很多pooling的方法是无法覆盖的。在实际应用中,作者推荐RMACpooling和CROWpooling两种方式,主要是因为这两种pooling方式更加有效。,计算复杂度相对较低。本文转载自雷锋网。如需转载,请在雷锋网官网申请授权。
