NetVLAD原理详解和推导
NetVLAD原理详解和推导
<font color=red>Update Message:博客园公式显示出现问题,大家看不到公式的话可以移步我的CSDN [NetVLAD原理详解和推导](https://blog.csdn.net/qq_42718887/article/details/109805506)</font>
博主最近在读
Geo-localization
的论文,其中有几篇论文用到了NetVLAD,所以博主便读了读这篇论文。VLAD
算法作为Image Retrival
领域的经典算法,被这篇论文做了扩展,让VLAD算法变成一个differentiable的算法,从而可以利用反向传播去更新优化算法中的参数,从而诞生了NetVLAD
这个pluggable to any CNN的算法。
本论文focus on的领域是large scale visual place recognition
(大尺度视觉地点识别),这类问题可以简单地理解为同一个地点在不同时期、光照、照相设备等外部条件下的图像匹配问题,与目前主流Geo-localization研究的Cross View Matching不一样,这里的图像匹配视角变换并没有ground-to-aerial这么大,个人感觉应该算是一个ground-to-ground匹配。
文章目录
0. SIFT(Scale-invariant feature transform)
在了解NetVLAD之前需要先了解VLAD算法,而了解VLAD算法之前又需要线了解SIFT算法。所以,博主先从SIFT算法开始介绍。SIFT算法是一种局部特征描述子(local feature discriptor),其本质就是在不同的尺度空间(保证尺度不变性)上查找关键点,并计算出关键点的方向。具体算法原理可以参考以下两个博客:
如下图所示,对于理解VLAD算法,其实只需要知道SIFT算法寻找到N个关键点并计算其方向之后,就能将一副图像转换为
N
×
D
N \times D
N×D维的张量,也可以理解为N个D维的向量(这里D一般是128)。
1. VLAD算法(Vector of locally aggregated descriptors)
VLAD、BOF(Bag of Features)、FV(Fisher Vector)这些算法都是基于特征描述子的特征编码算法,即利用如SIFT等特征描述子,将整幅图像进行编码,得到整个图像的representation。
V
(
j
,
k
)
=
∑
i
=
1
N
a
k
(
x
i
)
(
x
i
(
j
)
−
c
k
(
j
)
)
V(j, k) = \sum^{N}_{i=1}a_k(x_i)(x_i(j) - c_k(j))
V(j,k)=i=1∑Nak(xi)(xi(j)−ck(j))
VLAD算法公式如上图所示,首先需要明确的是VLAD的目标是将N个D维的特征描述子转换为
K
×
D
K \times D
K×D维的图像representation。整个过程分为三步:
- 根据N个SIFT特征描述子 x i x_i xi,使用聚类算法如k-means等,得到k个聚类中心。
- 计算 a k ( x i ) a_k(x_i) ak(xi),即VLAD中的assginment。
- 根据assginment将特征描述子到簇中心的残差全部加起来。
1.1 计算簇中心
VLAD算法一般是利用SIFT算法去提取图像的descriptor(描述子),在得到N个D维的特征描述子之后,使用k-means算法得到K个簇中心,这个过程就相当于训练一本码书。这本码书就可以根据向量到K个簇中心的距离来确定向量属于哪个中心。
1.2 计算assignment
VLAD算法中的assignment就是公式中的 a k ( x i ) a_k(x_i) ak(xi),也就是如果 x i x_i xi向量属于第k个中心簇,那么 a k ( x i ) = 1 a_k(x_i)=1 ak(xi)=1,否则 a k ( x i ) = 0 a_k(x_i)=0 ak(xi)=0。这里就为后面的改进埋下了伏笔,因为这里的assginment是hard assginment,这种方式是不可微的。
1.3 求和
N
×
K
N \times K
N×K维的assginment矩阵之后,就能以这个矩阵为权重,把向量到每一个簇中心的残差
(
x
i
(
j
)
−
c
k
(
j
)
)
(x_i(j) - c_k(j))
(xi(j)−ck(j))全部加起来。公式里面的j就是指向量中的第j个元素。
这样,一个簇求一次加权残差向量和,就得到了一个
K
×
D
K \times D
K×D维的全局图像的representation。
2. NetVLAD算法原理
NetVLAD算法对VLAD的改进有两点:
- 将局部特征描述子的聚合k-means改成了1 by 1卷积
- 将hard assignment改成了soft assignment
这里我们着重讲一下主要改进,就是将传统的VLAD算法的hard assginment改成了soft assginment,让整个VLAD算法变成了一个differentiable的算法。公式如下:
a
ˉ
k
(
x
i
)
=
e
−
α
∣
∣
x
i
−
c
k
∣
∣
2
∑
k
′
e
−
α
∣
∣
x
i
−
c
k
′
∣
∣
2
\bar{a}_k(x_i) = \frac{e^{-\alpha ||x_i - c_k||^2 }} {\sum_{k'} e^{-\alpha ||x_i - c_{k'}||^2}}
aˉk(xi)=∑k′e−α∣∣xi−ck′∣∣2e−α∣∣xi−ck∣∣2
从上面这个公式就能看出来,
a
ˉ
k
(
x
i
)
\bar{a}_k(x_i)
aˉk(xi)相当于是根据各个向量到簇中心的距离再做一个softmax得到的。
我们继续从上面这个公式推导:
把2范数写成向量的乘法:
a
ˉ
k
(
x
i
)
=
e
−
α
(
x
i
−
c
k
)
T
(
x
i
−
c
k
)
∑
k
′
e
−
α
(
x
i
−
c
k
′
)
T
(
x
i
−
c
k
′
)
(1)
\bar{a}_k(x_i) = \frac{e^{-\alpha(x_i - c_k)^T (x_i - c_k)}} {\sum_{k'} e^{-\alpha (x_i - c_{k'})^T(x_i - c_{k'})}} \tag{1}
aˉk(xi)=∑k′e−α(xi−ck′)T(xi−ck′)e−α(xi−ck)T(xi−ck)(1)
展开:
a
ˉ
k
(
x
i
)
=
e
−
α
(
x
i
T
x
i
−
x
i
T
c
k
−
c
k
T
x
i
+
c
k
T
c
k
)
∑
k
′
e
−
α
(
x
i
T
x
i
−
x
i
T
c
k
′
−
c
k
′
T
x
i
+
c
k
′
T
c
k
′
)
(2)
\bar{a}_k(x_i) = \frac{e^{-\alpha(x_i^Tx_i - x_i^T c_k - c_k^Tx_i+c_k^Tc_k)}} {\sum_{k'} e^{-\alpha(x_i^Tx_i - x_i^T c_{k'} - c_{k'}^Tx_i+c_{k'}^Tc_{k'})}} \tag{2}
aˉk(xi)=∑k′e−α(xiTxi−xiTck′−ck′Txi+ck′Tck′)e−α(xiTxi−xiTck−ckTxi+ckTck)(2)
分子分母将
x
i
T
x
i
x_i^Tx_i
xiTxi约掉:
a
ˉ
k
(
x
i
)
=
e
−
α
(
−
x
i
T
c
k
−
c
k
T
x
i
+
c
k
T
c
k
)
∑
k
′
e
−
α
(
−
x
i
T
c
k
′
−
c
k
′
T
x
i
+
c
k
′
T
c
k
′
)
(3)
\bar{a}_k(x_i) = \frac{e^{-\alpha(- x_i^T c_k - c_k^Tx_i+c_k^Tc_k)}} {\sum_{k'} e^{-\alpha(- x_i^T c_{k'} - c_{k'}^Tx_i+c_{k'}^Tc_{k'})}} \tag{3}
aˉk(xi)=∑k′e−α(−xiTck′−ck′Txi+ck′Tck′)e−α(−xiTck−ckTxi+ckTck)(3)
因为这里的
x
i
和
c
k
x_i和c_k
xi和ck都是向量,所以可以化成这样:
a
ˉ
k
(
x
i
)
=
e
w
k
T
x
i
+
b
k
∑
k
′
e
w
k
′
T
x
i
+
b
k
′
(4)
\bar{a}_k(x_i) = \frac{e^{w_k^Tx_i + b_k}} {\sum_{k'} e^{w_{k'}^Tx_i + b_{k'}}} \tag{4}
aˉk(xi)=∑k′ewk′Txi+bk′ewkTxi+bk(4)
其中
w
k
T
=
2
α
c
k
,
b
k
=
−
α
∣
∣
c
k
∣
∣
2
w_k^T=2\alpha c_k, b_k = -\alpha||c_k||^2
wkT=2αck,bk=−α∣∣ck∣∣2。
化简到(4)这里就很容易看出来,soft assginment其实就是在对特征描述子做一个线性变换再加上一个bias,最后进行softmax操作。从(4)也可以看出来,现在的VLAD算法其实只有一个
c
k
c_k
ck变量,而为了能够更加方便地利用卷积操作实现上面的全部过程,作者让
w
k
、
c
k
、
b
k
w_k、c_k、b_k
wk、ck、bk变成三个无关的变量。当然原文肯定不会这么写,作者原文写的是:This enables greater flexibility than original VLAD。至此,NetVLAD算法改进的核心部分就讲完了,接下来的残差求和操作就与VLAD算法保持一致。
如上图所示,这是整个NetVLAD算法的流程图,作者为了实现end-to-end的训练,所以提取特征描述子也没有使用SIFT这种hand-crafted特征,而是直接使用了卷积神经网络进行提取。经过CNN提取特征描述子之后,得到一个
W
×
H
×
D
W \times H \times D
W×H×D即
N
×
D
N \times D
N×D的feature maps。
第二个虚线框中,features maps向上经过了一个
1
×
1
×
D
×
K
1 \times 1 \times D \times K
1×1×D×K的卷积核,相当于对特征子做了一个线性变换,得到一个
N
×
K
N \times K
N×K的线性变换结果,然后经过soft-max操作得到
N
×
K
N \times K
N×K的soft assginment结果。然后
N
×
D
N \times D
N×D的features进入VLAD core经过聚类得到了
K
×
D
K \times D
K×D的聚类中心向量,然后利用
N
×
K
N \times K
N×K的soft assginment去分配feature到聚类中心残差所占的权重,按照聚类中心进行加权求和,最终得到一个
K
×
D
K \times D
K×D的VLAD vector作为整幅图片的representation。