细粒度识别很依赖于标识区域的定位和特征提取。现有的方法都忽略了这样一个问题:特征提取和定位这两个过程是相关的。所以我们提出了一个新的方法:mutil-attention CNN(MA-CNN),这个方法中位置信息和特征学习可以相互强化。MA-CNN是由卷积、channel group和part classification三个子网络组成。channel grouping subnet的输入是来自卷积提取的feature map,利用空间上相关的channels,通过聚类、加权和池化,得到多个 part。classification net对每一个part进行分类,从而获得具有标识区域的特征。提出两个损失指导channels grouping 和 part classification的多任务学习,鼓励MA-CNN产生从channels中得到更多标识区域, 学习到更好的part的细粒度特征,并且让它们相互促进。MA-CNN是不需要的标注信息的。
细粒度识别需要定位和表达标识区域。这一部分的框架分为两个部分,1.定位;2.特征提取。尽管这个性能提升了很多,但是我们发现定位和特征提取都被CNN的标识识别能力所阻碍,我们还发现定位和特征提取是相关的,并且可以相互强化。一个鸟头的早期定位是能形成一个特别的pattern,而这个patrern反过来也能够帮助更好的定位到pattern。
MA-CNN联合学习了part proposals 和特征表示。这些part不是人为标记给出,而是多个被attention的区域。MA-CNN使用三个子网络,输入图片,输出part proposals。‘
首先,一个卷积通道和一个特定的视觉模式相关,因此通道分组子网络将空间上相关的模式聚类加权,形成一个part attention map,这些channels通道的响应峰值出现在相邻的区域。 多样化的峰值位置组成多个part attention map,然后我们使用固定值进行裁剪,这就是 part proposal 。
然后,当part proposal被确定后,分类子网络使用从这些part proposal提取的特征进行分类,这些特征是通过全卷积池化获得的。这样的设计可以排除其他part的依赖,而更精确的获得一组相关的feature channel【大概意思,把每个part更好的聚集,然后分开】,因此每个part的特征就可以被更好的学习到。
最后,两个子网络的损失相互强化,相互引导,更具有标识性的channels引导更精确的特征学习,学习到更好的模型引导更精确的定位。
特别是,我们在channels grouping net中提出了一个分组损失,它将那些类内相似并且类间可分的channels cluter看做一个part attention,产生更加紧凑的part proposal。
对于一个part proposal的处理,我们将它们放大,然后送到一个part-CNN中。为了进一步利用part集成的能力,我们将多个part feature使用全连接层进行融合。这个模型是第一次尝试学习到多个part的模型。
【如何将定位和特征提取相互强化?】
首先,将整个网络放入卷积中提取特征;
然后,利用channels grouping和加权层这个网络产生多个 attention map;
最后,预测出概率分数;
输入图像 X X X,使用卷积提取出特征: W ∗ X W*X W∗X,* 表示卷积池化和激活。 W W W就是参数,这个特征的维度是 h ∗ w ∗ c h*w*c h∗w∗c:高、宽和通道数。尽管一个通道可能和某个特定的属性相关联比如纹理,但是很难使用一个单独的通道去表示一个丰富的局部信息。因此我们提出了一个通道分组和加权子网络, 它将一组峰值相邻的channels作为一个标识区域 。每个特征通道可以被表示为一个向量,向量是由所有训练示例峰值响应位置组成。我们将这些位置向量作为特征,并且聚类为N个组。每一组包含哪些通道,可以被表示一个 indicator function : [ l 0 , l 1 , l 2 , . . . , l c ] [l_{0}, l_{1}, l_{2}, ..., l_{c}] [l0,l1,l2,...,lc], l j l_{j} lj等于1或0,等于1时:第 j 个通道属于这个组,否则不属于。
为了保证这个聚类的准确性,进行了一个回归。产生的 N 个部分,定义 N 个全连接层, F ( . ) = [ f 1 , . . . , f N ] F(.)=[f_{1},...,f_{N}] F(.)=[f1,...,fN],每个 f i f_{i} fi的输入都是 特征图,产生一个 size=c 的权重预测结果:
d i ( X ) = [ d 1 , . . . , d c ] d_{i}(X) = [d_{1}, ...,d_{c}] di(X)=[d1,...,dc],这个损失函数就是让每个part下的FC的权重预测接近聚类结果。【这个损失怎么带入聚类,我还没整明白】
这幅图的目的就是直白的说分组对象。
经过聚类、回归后,开始生成attention map:
M i ( X ) M_{i}(X) Mi(X)表示第 i 个part的attention map:每个通道特征 [ W ∗ X ] j [W*X]_{j} [W∗X]j和 预测出的权重 d j d_{j} dj的乘积(这是一个标量乘矩阵)。
然后得到了 N 个part的attention map,每个attention map还需要进行一次池化:
下面的草图简单记录这个过程:
MA-CNN有两种损失:channels grouping loss和part classification loss。我们把这个目标函数看做一个多任务优化问题。因此损失可以这样写:
L c l s L_{cls} Lcls 和 L c n g L_{cng} Lcng 分别代表每个 part 的分类损失和channels grouping损失。
虽然一个part能够提供很强的标识性,但是多个part proposal却能够让模型更具有鲁棒性和泛化能力。因此 channel grouping还需要保持 part 的多样性:
D i s ( . ) Dis(.) Dis(.) 是距离函数, D i v ( . ) Div(.) Div(.) 是多样性函数。 D i s ( . ) Dis(.) Dis(.)鼓励part紧凑的分布:
m i ( x , y ) m_{i}(x, y) mi(x,y) 的输入是 M i M_{i} Mi的坐标(x,y),产生了一个相应的反应值【可能是一个学习网络, t x 和 t y t_{x}和t_{y} tx和ty作者也没说,我怀疑是均值】。
D i v ( . ) Div(.) Div(.)是设计为了attention更加分散的一个函数:
i、k表示不同的pattern attention map。 m r g mrg mrg是一个margin,这个值可以让损失更加鲁邦。
这一段的设计有两个原因:1. 为了让相邻的响应更加靠近,组成一个group;2. 为了让part更加的分散。这种带有几何约束的设计能够让模型抓住更具有辨别力的区域,同时即使某一部分被遮挡,仍然可有替代的部分。
交替优化:为了以一种相互强化的方式进行定位和特征学习,我们使用了交替优化的策略。首先固定卷积层,优化channels grouping, 损失函数是 L c n g L_{cng} Lcng;然后固定channels grouping,优化分类卷积,损失函数是 L c l s L_{cls} Lcls。
分类损失是一目了然的,这里主要说的是 grouping channels 里面的对 M i M_{i} Mi 的两个衍生操作:Div 和 Dis。下图展示的是某个iteration中的attention feature map,越亮的地方,注意力响应越高。除此之外,我们也可视化了每个部分的优化方向:+ 代表这个地方会被加强, - 代表会被减弱, . 代表不变。
【我知道这一部分的意思,但我不知道这个函数是怎么发挥作用的】
尽管你能找到这个标识区域,但是你很难去表达这个区域,因为它真的很小,之前的方法都是放大【对标识区域的处理,其实也是一个方向】。我们也一样。
以 M i M_{i} Mi的峰值为中心,裁剪一个 9696的bounding box。之后,将裁剪区域放大到 224224,输入到part-CNN中,对part进行分类。我们也延续之前的处理方法,联合每个Part的特征,以及globol image,共同进行联合学习。