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

Optimization

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

Some difference

作者在给出了上面的基本模型后,又说了我们现在好的part已经可以得到了,但是由于local region太小了,难以去表示在local region里面的subtle差别,比如说鸟嘴的颜色啊等等,即我们之前使用那个 P i ( X ) P_i(X) Pi(X)不能很好地表示part Representation,因为作者的目的就是对fine-grained image进行分类,对于part内的difference是很重要的。作者的解决思路是放大part,并且加入整个图片的特征。具体做法是加入part-CNNs(作者使用了VGG19),我们首先求得 M i ( X ) M_i(X) Mi(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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值