此篇文章记录自己对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
W∗X,维度为
w
∗
h
∗
c
w*h*c
w∗h∗c。看过《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)∈Mi∑mi(x,y)[∣∣x−tx∣∣2+∣∣y−ty∣∣2]Div(Mi)=(x,y)∈Mi∑mi(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(W∗X)
向量的维度为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=1∑cdj[W∗X]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=1∑c([W∗X]j∗Mi(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=1∑N[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