Multi-Attention Convolutional Network笔记

此篇文章记录自己对2017年的ICCV一篇关于图像领域的注意力模型的理解。(论文题目《Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition》)

Approach

整个结构由三部分组成,分别是特征提取的卷积层、channel grouping层和part classifier 组成。 提出了两个损失函数,一个是对于part classification loss 和对于channel grouping loss。整体架构如下所示
在这里插入图片描述
首先,将图片输入到MA-CNN,得到feature channels,我们假定feature channels的表达是WXW*X,维度为whcw*h*c。看过《Visualizing and Understanding Convolutional Networks》这篇论文的应该知道,其实每个feature map即每个feature channel都会对应于原图的某一个pattern(e.g.,头或翅膀等),所以我们会得到如上图所示的feature channel,接着对channels进行grouping,这个通过文中给的LcngL_{cng}损失韩式进行聚类,会使得parts之间分离,part内部更加聚集。其中LcngL_{cng}的形式如下所示
Lcng=Dis(Mi)+λDiv(Mi)where Dis(Mi)=(x,y)Mimi(x,y)[xtx2+yty2]Div(Mi)=(x,y)Mimi(x,y)[maxk!=imk(x,y)mrg] L_{cng}=Dis(M_i)+\lambda Div(M_i) \\ where\ Dis(M_i)=\sum_{(x,y)\in M_i} m_i(x,y)[||x-t_x||^2+||y-t_y||^2] \\ Div(M_i)=\sum_{(x,y)\in M_i} m_i(x,y)[\max_{k!=i} m_k(x,y)-mrg]
其中mrgmrg是指margin,估计是为了能够允许一定的overlap,这样能够有更强的泛化性能(举个例子,如汽车的灯和轮胎,他们之间很近,难免会有重叠)。从表达式很明显可以看出DivDiv用于将不同part分离开,DisDis负责使part内部更加聚集。作者通过如此的方法获得了更加具有辨别性的区域,并且从channels的丰富信息中获得了更多part,这样能够获得更强的robustness,例如当wing被遮住了,那么我们还可以通过beak等进行分类。论文提出了一种可以方便训练的grouping方法,即用两层全连接近似grouping过程。对于上图中的part attentions的计算,这里在论文中提到的方法和作者实现有点略微差别。例如我们现在设定提取N个part,论文中提到使用N个全连接,那么每个全连接我们得到一个向量:
di(X)=fi(WX) d_i(X)=f_i(W*X)
向量的维度为channels的个数,其中的每个元素表示是否某个channel属于这个part,上述的损失函数会使得各个part(即表示原图中的一个region,例如beak、wing等)分开,也就是说channel会被尽可能唯一地分配给一个part。然后我们使用如下式子计算part attention:
Mi(X)=sigmoid(j=1cdj[WX]j) M_i(X)=sigmoid(\sum_{j=1}^cd_j[W*X]_j)
其中[]j[]_j表示jthj^{th}channel,实质上就是将属于某一个part的所有feature channels相加,得到一个比较集中的part表示,结合了多个feature channel的信息,然后对MiM_i进行标准化。进一步我们通过一种空间的池化获得part representations,如下所示
Pi(X)=j=1c([WX]jMi(X)) P_i(X)=\sum_{j=1}^c([W*X]_j*M_i(X))
上面的*是对应元素相乘,其实可以这样理解Mi(X)M_i(X),它表示的只是对于某一个part来说,某一个像素属于这个part的probability,也之所以作者做了一下归一化(通过所有元素的和)。进一步我们使用这个part Representation通过softmax进行分类,这里作者没有说明是否还要加一层全连接,我觉得都可以,还可以使用一个卷积+全局池化或者全局池化+全连接。对于类别的损失,作者使用如下:
i=1N[Lcls(Y(i),Y)] \sum_{i=1}^N[L_{cls}(Y^{(i)},Y^*)]
其中LclsL_{cls}可以是任意的一般分类损失函数,Y(i)Y^{(i)}是第ithi^{th} part的预测结果(是一个向量)。对于最后的预测,在这一部分作者并没有给出,可以将这些特征和整个图像的特征进行concat,然后通过一个分类层进行分类,在后面的试验中作者也是这么做的。具体实现时,作者使用了Deconvolution with bilinear type(就是使用bilinear的方式初始化卷积核的参数,然后进行卷积运算,实质就是bilinear插值)进行求解Mi(X)M_i(X),然后与所有的feature channels按元素乘,然后进行空间pooling,最后进行了一系列的softmax操作、缩放变换,可能为了让大数值与小数值分得更清晰吧。

Optimization

作者的优化思路是基于上面两个损失函数进行的,这两个损失函数相互加强,不断迭代。先固定住b、g部分的参数,使用LcngL_{cng}优化channels grouping部分。然后固定住channels grouping的参数,然后使用LclsL_{cls}对b、g部分进行优化。这样不断迭代,直到两个损失值都不再变化。

Some difference

作者在给出了上面的基本模型后,又说了我们现在好的part已经可以得到了,但是由于local region太小了,难以去表示在local region里面的subtle差别,比如说鸟嘴的颜色啊等等,即我们之前使用那个Pi(X)P_i(X)不能很好地表示part Representation,因为作者的目的就是对fine-grained image进行分类,对于part内的difference是很重要的。作者的解决思路是放大part,并且加入整个图片的特征。具体做法是加入part-CNNs(作者使用了VGG19),我们首先求得Mi(X)M_i(X),然后得到peak response point的座标,然后切一个9696的part,将这些parts放大到224224,然后放入各自的part-CNNs中进行提取特征,然后将整个图片(根据数据集而定,有些不是整个图片)放入属于它的part-CNN中提取特征(同样使用VGG19),然后将这些特征进行concat,最后输入到一个fc layer+softmax进行最终的分类。这里作者应该是使用两个损失函数先训练前述的MA-CNN,然后能够获得好的parts后,将part和整个图片传入最后的part-CNN中进行最终的分类。

Ref:
[1]源码链接 https://onedrive.live.com/?authkey=!ADwfD7C9IwnEc9k&id=693885F2E24EFF4D!125&cid=693885F2E24EFF4D
[2]《Learning Multi-Attention Convolutional Neural Network for Fine-Grained Image Recognition》
[3] https://github.com/minfengUCAS/Muti-Attention-CNN

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章