最近几篇目标跟踪文章都出现了对cross correlation方面的改进, 是因为发明新tracker的趋势已经过去了吗?其实我之前也思考过,一直直接拿来用的depth-wise correlation是否是最优的融合模板特征和搜索特征的操作,有没有或能不能找出比这个更有效的融合方式,但是一直停留在思考层面,但是就有好几篇工作都涉及到了这一点: 总共应该有以下几篇:
前两篇熟悉一点,后几篇没听说过一点,下面就其原理和实现分析一下: 在看下面之前,先放一个基础知识F.conv2d,看不懂的可以去这里看示意图: 官方的参数列表是这样的:
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)
- input – input tensor of shape (minibatch,in_channels,iH,iW)
- weight – filters of shape(out_channels,
i
n
_
c
h
a
n
n
e
l
s
g
r
o
u
p
s
\frac {in\_channels}{groups}
groupsin_channels?,kH,kW)
- output – output tensor of shape (minibatch,out_channels,oH,oW)
1、naive correlation
这个就出自最早的SiamFC啦,直接就是模板特征作为核去和搜索帧特征互相关,实现上就是一个卷积操作,示意图可看下面: 就是模板帧特征在搜索帧特征上滑动,逐通道之间互相作内积,最后输出的就是一个通道数为1的特征。 代码实现:
def naive_xcorr(self, z, x):
nz = z.size(0)
nx, c, h, w = x.size()
x = x.view(-1, nz * c, h, w)
out = F.conv2d(x, z, groups=nz)
out = out.view(nx, -1, out.size(-2), out.size(-1))
return out
2、depth-wise correlation
这个就出自最早的SiamRPN++啦,思路上和naive correlation差不多,只不过一个是全部通道加和起来了,一个就是一个通道就输出一个通道,示意图可看下面: 代码实现:
def depthwise_xcorr(search, kernel):
"""depthwise cross correlation
"""
batch = kernel.size(0)
channel = kernel.size(1)
search = search.view(1, batch * channel, search.size(2), search.size(3))
kernel = kernel.reshape(batch * channel, 1, kernel.size(2), kernel.size(3))
out = torch.nn.functional.conv2d(search, kernel, groups=batch * channel)
out = out.view(batch, channel, out.size(2), out.size(3))
return out
3、pixel-wise correlation
虽然Alpha-refine提到了这种correlation,其实采用的是Ranking Attention Network for Fast Video Object Segmentation这篇文章里的思想,因为两者最后都得预测mask,所以借鉴了一下。 就是让模板特征的HzWz个1x1xC特征与搜索帧特征进行卷积,最后的通道数是HzWz,大小因为核大小是1x1的,所以不会改变,就是Hx和Wx。这个甚至不需要用到卷积函数,直接tensor矩阵相乘就行。 代码实现:
def pixelwise_xcorr(kernel, search):
b, c, h, w = search.shape
ker = kernel.reshape(b, c, -1).transpose(1, 2)
feat = search.reshape(b, c, -1)
corr = torch.matmul(ker, feat)
corr = corr.reshape(*corr.shape[:2], h, w)
return corr
4、pixel-to-global correlation
这种相关方法在PG-Net: Pixel to Global Matching Network for Visual Tracking中提出来,目前还没有开源。但是还是比较简单能理解的,相当于经过了两次的pixel-wise correlation: 先让模板特征
Z
f
Z_{f}
Zf?,维度为
h
z
?
w
z
?
c
h_{z}*w_{z}*c
hz??wz??c,分别从空间和通道两个方面来reshape成
n
z
=
h
z
?
w
z
n_{z}=h_{z}*w_{z}
nz?=hz??wz?个
1
?
1
?
c
1*1*c
1?1?c和
c
c
c个
1
?
1
?
n
z
1*1*n_{z}
1?1?nz?的filter,然后搜索帧特征分别经过这两种filter,最后得到输出特征,具体shape如下变化: 可以自己实现一下:
def pg_xcorr(kernel, search):
b, c, h, w = search.shape
ker1 = kernel.reshape(b, c, -1)
ker2 = ker1.transpose(1, 2)
feat = search.reshape(b, c, -1)
S1 = torch.matmul(ker2, feat)
S2 = torch.matmul(ker1, S1)
corr = S2.reshape(*S2.shape[:2], h, w)
return corr
5、saliency-associated correlation
这种相关方法在ICCV2021 Saliency-Associated Object Tracking中提出来,目前还没有开源和复现。
6、AutoMatch
这种相关方法在ICCV2021 Learn to Match: Automatic Matching Network Design for Visual Tracking中提出来,目前还没有开源和复现。这里用到了NAS(Neural Architecture Search)的思路让网络自动选择6种相关方式中最优的进行,感觉是集大成者,做到头的感觉。
|