siamGAT跟踪过程理解

在阅读到3.3. The Tracking Phase时,作者提到跟踪的目的是预测当前帧中目标的边界框。对于位置(i,j),建议的框架可以产生6D向量Tij=(cls,cen,l,t,r,b),其中cls表示分类的前景分数,cen表示中心度socre,l+r和t+b表示当前帧中目标的预测宽度和高度。在跟踪过程中,边界框的大小和纵横比在连续帧中通常会发生较小的变化。为了使用这种时空一致性监督预测,我们采用了[3]中介绍的尺度变化惩罚pij对分类分数cls进行重新排序,它允许更新的6D向量P Tij=(clsij×pij,cen,l,t,r,b)。然后,跟踪阶段可以表示为:

 其中H为余弦窗,λdis为平衡重。输出q是查询到的位置,其最高分数为目标像素。

在代码中:

    def init(self, img, bbox):
        """
        args:
            img(np.ndarray): BGR image
            bbox: (x, y, w, h) bbox
        """
        self.center_pos = np.array([bbox[0]+(bbox[2]-1)/2,
                                    bbox[1]+(bbox[3]-1)/2])

        self.size = np.array([bbox[2], bbox[3]])

        # calculate z crop size
        w_z = self.size[0] + cfg.TRACK.CONTEXT_AMOUNT * np.sum(self.size)
        h_z = self.size[1] + cfg.TRACK.CONTEXT_AMOUNT * np.sum(self.size)
        s_z = round(np.sqrt(w_z * h_z))

        # calculate channle average
        self.channel_average = np.mean(img, axis=(0, 1))

        # get cropget_subwindow 即为从检测帧中划分出crop的函数,输出的crop的值为(channel,height,width)。然后再将crop进行追踪,得到分类得分以及预测的bounding box。
        z_crop = self.get_subwindow(img, self.center_pos,
                                    cfg.TRACK.EXEMPLAR_SIZE,
                                    s_z, self.channel_average)
        scale = cfg.TRACK.EXEMPLAR_SIZE / s_z
        c = (cfg.TRACK.EXEMPLAR_SIZE - 1) / 2
        roi = torch.tensor([[c - bbox[2] * scale / 2, c - bbox[3] * scale / 2,
                             c + bbox[2] * scale / 2, c + bbox[3] * scale / 2]])
        self.model.template(z_crop, roi)

首先根据上一帧中所得到的bounding box,得到target的中心以及size,并通过:

\left ( w+p \right )*(h+p)=s^{2},p=\frac{w+h}{2}

来得到要从当前帧中截取的正方形图片原始大小s,并且将s resize到预设大小,如果resize后已经超过img的范围,则将对边界进行padding,对超出部分pad的值为整个图片所有通道的平均值。

get_subwindow即为从检测帧中划分出的corp的函数,输出的crop的值为(channel,height,width)。然后再将crop进行追踪,得到分类得分以及预测的bounding box。可以查看另外笔记如何获得裁剪区域_的博客-CSDN博客

 在得到由anchor所生成的bounding box之后,要从这些bounding box中选出候选区proposal。采取的策略则是添加尺度变化penalty和余弦窗,然后再对所选取的proposals进行re-rank。
添加penalty的目的,是为了对两帧之间相差太大的形状或大小进行抑制。

其中:penalty=e^{k*max(\frac{r}{​{r}'},\frac{​{r}'}{r})*max(\frac{s}{​{s}'},\frac{​{s}'}{s})}\textup{\textup{\textup{\textup{}}}}

其中r,s分别为proposal的ratio以及scale,而r′和s'分别为上一帧中的ratio以及scale。

代码实现为

    def cal_penalty(self, bboxes, penalty_lk):
        bboxes_w = bboxes[0, :, :] + bboxes[2, :, :]
        bboxes_h = bboxes[1, :, :] + bboxes[3, :, :]
        s_c = self.change(self.sz(bboxes_w, bboxes_h) / self.sz(self.size[0] * self.scale_z, self.size[1] * self.scale_z))
        r_c = self.change((self.size[0] / self.size[1]) / (bboxes_w / bboxes_h))
        penalty = np.exp(-(r_c * s_c - 1) * penalty_lk)
        return penalty

得到penalty后,再将penalty与proposal的分类得分相乘。

 

        penalty = self.cal_penalty(lrtbs, cfg.TRACK.PENALTY_K)  #return penalty
        p_cls = penalty * cls
        p_score = p_cls * cen
        if cfg.TRACK.hanming:
            hp_score = p_score * (1 - cfg.TRACK.WINDOW_INFLUENCE) + self.window * cfg.TRACK.WINDOW_INFLUENCE
        else:
            hp_score = p_score

 如果对其使用了cosine window(可以生成一个高斯矩阵,用于突出中心位置目标,而忽略边缘化信息。添加cosine window penalty的目的就在于抑制边缘信息。)则还要对经过scale change penalty后得到的score再进行window penalty,

后面的参考SiamCAR的详细解答,一看就会,不会请打我_cxkyxx的博客-CSDN博客_siamcar

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值