本文的目的是解析SGPN代码中由矩阵
F
S
I
M
\boldsymbol F_{SIM}
FSIM(维度为
N
p
×
N
f
N_p \times N_f
Np×Nf)如何得到相似矩阵
S
\boldsymbol S
S(维度为
N
p
×
N
p
N_p \times\ N_p
Np× Np)。
S
i
,
j
S_{i,j}
Si,j 的值是点
P
i
\boldsymbol P_i
Pi和 点
P
j
\boldsymbol P_j
Pj属于相同物体实例的度量。
S
i
,
j
S_{i,j}
Si,j 越小表示点
P
i
\boldsymbol P_i
Pi和 点
P
j
\boldsymbol P_j
Pj属于相同实例的可能性越大。
数学分析:
首先假设
F
S
I
M
=
[
x
1
T
x
2
T
⋮
x
N
p
T
]
\boldsymbol F_{SIM}=\left[ \begin{matrix} \boldsymbol x_{1}^T \\ \boldsymbol x_{2}^T \\ \vdots \\ \boldsymbol x_{N_p}^T \end{matrix} \right]
FSIM=⎣⎢⎢⎢⎡x1Tx2T⋮xNpT⎦⎥⎥⎥⎤ 其中
x
i
=
[
x
i
,
1
x
i
,
2
⋯
x
i
,
N
f
]
T
\boldsymbol x_{i}=\left [\begin{matrix}x_{i,1}&x_{i,2}&\cdots&x_{i,N_f} \end{matrix}\right]^T
xi=[xi,1xi,2⋯xi,Nf]T。
因为
标
量
S
i
,
j
=
∥
F
S
I
M
i
−
F
S
I
M
j
∥
2
=
∥
x
i
−
x
j
∥
2
=
(
x
i
−
x
j
)
T
(
x
i
−
x
j
)
=
x
i
T
x
i
−
2
x
i
T
x
j
+
x
i
T
x
i
\begin{aligned} 标量S_{i,j} &=\lVert \boldsymbol F_{SIM_i}-\boldsymbol F_{SIM_j}\rVert_2=\lVert \boldsymbol x_{i}- \boldsymbol x_{j}\rVert_2\\ &=(\boldsymbol x_{i}-\boldsymbol x_{j})^T(\boldsymbol x_{i}-\boldsymbol x_{j})=\boldsymbol x_{i}^T\boldsymbol x_{i}-2\boldsymbol x_{i}^T\boldsymbol x_{j}+\boldsymbol x_{i}^T\boldsymbol x_{i} \end{aligned}
标量Si,j=∥FSIMi−FSIMj∥2=∥xi−xj∥2=(xi−xj)T(xi−xj)=xiTxi−2xiTxj+xiTxi 所以
S
=
A
−
B
+
C
(1)
\boldsymbol S = \boldsymbol A-\boldsymbol B+\boldsymbol C \tag{1}
S=A−B+C(1) 其中
A
=
[
x
1
T
x
1
x
1
T
x
1
⋯
x
1
T
x
1
x
2
T
x
2
x
2
T
x
2
⋯
x
2
T
x
2
⋮
⋮
⋮
⋮
x
N
p
T
x
N
p
x
N
p
T
x
N
p
⋯
x
N
p
T
x
N
p
]
N
P
×
N
p
\boldsymbol A = \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{1} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{1} \\ \boldsymbol x_{2}^T\boldsymbol x_{2} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{2} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} &\boldsymbol x_{N_p}^T\boldsymbol x_{N_p} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}
A=⎣⎢⎢⎢⎡x1Tx1x2Tx2⋮xNpTxNpx1Tx1x2Tx2⋮xNpTxNp⋯⋯⋮⋯x1Tx1x2Tx2⋮xNpTxNp⎦⎥⎥⎥⎤NP×Np
C
=
[
x
1
T
x
1
x
2
T
x
2
⋯
x
N
p
T
x
N
p
x
1
T
x
1
x
2
T
x
2
⋯
x
N
p
T
x
N
p
⋮
⋮
⋮
⋮
x
1
T
x
1
x
2
T
x
2
⋯
x
N
p
T
x
N
p
]
N
P
×
N
p
=
A
T
\boldsymbol C= \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}=A^T
C=⎣⎢⎢⎢⎡x1Tx1x1Tx1⋮x1Tx1x2Tx2x2Tx2⋮x2Tx2⋯⋯⋮⋯xNpTxNpxNpTxNp⋮xNpTxNp⎦⎥⎥⎥⎤NP×Np=AT
B
=
2
∗
[
x
1
T
x
1
x
1
T
x
2
⋯
x
1
T
x
N
p
x
2
T
x
1
x
2
T
x
2
⋯
x
2
T
x
N
p
⋮
⋮
⋮
⋮
x
N
p
T
x
1
x
N
p
T
x
2
⋯
x
N
p
T
x
N
p
]
N
P
×
N
p
=
F
S
I
M
∗
F
S
I
M
T
\boldsymbol B=2* \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{2}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{1} &\boldsymbol x_{N_p}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}= \boldsymbol F_{SIM}* \boldsymbol F_{SIM}^T
B=2∗⎣⎢⎢⎢⎡x1Tx1x2Tx1⋮xNpTx1x1Tx2x2Tx2⋮xNpTx2⋯⋯⋮⋯x1TxNpx2TxNp⋮xNpTxNp⎦⎥⎥⎥⎤NP×Np=FSIM∗FSIMT 到此理论分析完毕,接下来为代码实现分析,SGPN的github源码是用TensorFlow写的,其中计算相似矩阵
S
\boldsymbol S
S的代码如下:
# Similarity matrix
Fsim = tf_util.conv2d(F, 128, [1, 1], padding='VALID', stride=[1, 1], bn=False, is_training=is_training, scope='Fsim')
#Fsim shape:BxNx1x128
Fsim = tf.squeeze(Fsim, [2])
#Fsim shape:BxNx128
r = tf.reduce_sum(Fsim * Fsim, 2)
#r shape:BxN
r = tf.reshape(r, [batch_size, -1, 1])
#r shape:BxNx1
print(r.get_shape(),Fsim.get_shape())
D = r - 2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1])) + tf.transpose(r, perm=[0, 2, 1])
其中
D
D
D为相似矩阵
S
S
S,代码中的r+ tf.transpose(r, perm=[0, 2, 1])
的效果相当于公式(1)中的
A
+
C
A+C
A+C。你可能疑惑r
和tf.transpose(r, perm=[0, 2, 1])
维度不同怎么能相加呢?针对这个地方我没查到tesorflow怎么对不同维度的向量相加,但是我查着了numpy关于不同维度相加的博客介绍,即如下:
广播是指不同形状的输足之间执行算数运算额方式。当两个数组的shape不一致时,numpy会实行广播机制。遵循4个原则:
(1)让所有的输入数组向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐。
(2)输出数组的shape是输入数组shape的各个轴上的最大值。
(3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1,则这个数组能够用来计算,否则出错。
(4)当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值。
最后2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1]))
相当于公式(1)中的
B
B
B。
到此结束。