Non-local的思想十分简单。以一个视频片段为例,假设我们要考虑的某一个帧中的某一个点为xi
x
i
,该视频片段里所有的像素点为xj
x
j
。non-local的最终输出为:
yi=1C(x)∑∀jf(xi,xj)g(xj)
y
i
=
1
C
(
x
)
∑
∀
j
f
(
x
i
,
x
j
)
g
(
x
j
)
这里的f(xi,xj)
f
(
x
i
,
x
j
)
可以看作是两点之间的关联系数,g(xj)
g
(
x
j
)
可以看作是xj
x
j
点中包含的信息。即以f
f
为权重,将信息g进行加权求和。C(x)
C
(
x
)
为其归一化系数。
到这里已经介绍完了Non-local的最重要的思想。接下来就是确定f
f
和g的形式了。文章中列举了几种不同的f
f
。
实例
g可以直接用一个线性函数来编码,即
g(xj)=Wgxj
g
(
x
j
)
=
W
g
x
j
实现时只要应用
1×1
1
×
1
卷积核就可以解决。关键是
f
f
的形式。下面列举几种。
函数
表达式
Gaussian
f(xi,xj)=exTixj Embedded Gaussian
f(xi,xj)=eθ(xi)Tϕ(xj)
f
(
x
i
,
x
j
)
=
e
θ
(
x
i
)
T
ϕ
(
x
j
)
Dot product
f(xi,xj)=θ(xi)Tϕ(xj)
f
(
x
i
,
x
j
)
=
θ
(
x
i
)
T
ϕ
(
x
j
)
Concatenation
f(xi,xj)=ReLU(wTf[θ(xi),ϕ(xj)])
f
(
x
i
,
x
j
)
=
R
e
L
U
(
w
f
T
[
θ
(
x
i
)
,
ϕ
(
x
j
)
]
)
不过论文也指出,最终的结果对于f
f
的选择并不敏感。
None-local块的实现
res的结构是一定要有的,所以在之前的yi算出来以后,我们最终的输出要满足:
zi=Wzyi+xi
z
i
=
W
z
y
i
+
x
i
所以Non-local层的结构如图2所示。
实现时,通道数先减半最后再还原,遵从了bottleneck的设计思想,降低了一半的计算量。同时,xj
x
j
可以被降采样后的数据x^j
x
^
j
代替,从而进一步降低计算量。