目标跟踪中cross correlation的总结与实现

最近几篇目标跟踪文章都出现了对cross correlation方面的改进, 是因为发明新tracker的趋势已经过去了吗?其实我之前也思考过,一直直接拿来用的depth-wise correlation是否是最优的融合模板特征和搜索特征的操作,有没有或能不能找出比这个更有效的融合方式,但是一直停留在思考层面,但是就有好几篇工作都涉及到了这一点:
总共应该有以下几篇:

nameconferencepaper
naive correlationECCV2016WFully-Convolutional Siamese Networks for Object Tracking
depth-wise correlationCVPR2019SiamRPN++: Evolution of Siamese Visual Tracking with Very Deep Networks
pixel-wise correlationCVPR2021Alpha-Refine: Boosting Tracking Performance by Precise Bounding Box Estimation
pixel-to-global correlationECCV2020PG-Net: Pixel to Global Matching Network for Visual Tracking
saliency-associated correlationICCV2021Saliency-Associated Object Tracking
AutoMatchICCV2021Learn to Match: Automatic Matching Network Design for Visual Tracking

前两篇熟悉一点,后几篇没听说过一点,下面就其原理和实现分析一下:
在看下面之前,先放一个基础知识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):
        # naive cross correlation
        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 hzwzc,分别从空间和通道两个方面来reshape成 n z = h z ∗ w z n_{z}=h_{z}*w_{z} nz=hzwz 1 ∗ 1 ∗ c 1*1*c 11c c c c 1 ∗ 1 ∗ n z 1*1*n_{z} 11nz的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种相关方式中最优的进行,感觉是集大成者,做到头的感觉。
在这里插入图片描述

  • 27
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizi_laizi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值