siamGAT跟踪过程理解

该博客介绍了目标跟踪算法中的跟踪阶段,重点是尺度变化惩罚和余弦窗的应用。作者提到,跟踪的目标是预测当前帧中目标的边界框,通过6D向量表示目标信息,并利用尺度变化惩罚来抑制帧间形状和大小的剧烈变化。同时,采用余弦窗来突出中心位置的目标,弱化边缘信息。代码示例展示了如何从上一帧的边界框计算当前帧的截取区域,并进行模板匹配。最后,通过加权得分和窗口惩罚对候选提案进行重排名,选择最佳匹配作为跟踪结果。

在阅读到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。可以查看另外笔记如何获得裁剪区域_的博客-优快云博客

 在得到由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的博客-优快云博客_siamcar

在使用 PYSOT 的 `eval.py` 对 VOT2018 数据集进行评估时,如果遇到如下导入错误: ``` ImportError: cannot import name 'calculate_failures' from 'toolkit.utils' ``` 这表明代码尝试从 `toolkit.utils` 模块导入 `calculate_failures` 函数,但该函数未被找到。 ### 原因分析 1. **版本不兼容**:PYSOT 项目可能已经更新了工具模块的结构或命名方式。某些旧版本的 `toolkit.utils` 中包含 `calculate_failures`,但在新版本中已被移除、重命名或重构[^1]。 2. **路径问题**:Python 解释器可能加载了错误的 `toolkit.utils` 文件,而不是 PYSOT 项目自带的模块文件。 3. **依赖库缺失或损坏**:`toolkit.utils` 可能属于某个额外的依赖包(如 `pytracking` 或 `got_toolbox`),而该依赖没有正确安装或与当前环境不兼容。 4. **代码修改或误删**:如果手动修改过 `toolkit.utils` 文件,可能会导致该函数被删除或移动。 ### 解决方案 #### 1. 确认 `calculate_failures` 所属模块的位置 检查 `toolkit/utils.py` 或其他相关文件,确认是否存在名为 `calculate_failures` 的函数。例如: ```python # toolkit/utils.py def calculate_failures(results): # 实现逻辑 pass ``` 若不存在,则可能是该函数已经被移除或改名。 #### 2. 使用正确的版本组合 不同版本的 PYSOT 可能依赖不同的辅助函数实现。可以尝试切换到特定提交版本的 PYSOT,以确保 `calculate_failures` 存在。例如: ```bash git clone https://github.com/STVIR/pysot.git cd pysot git checkout <commit_id_with_calculate_failures> ``` 查找包含 `calculate_failures` 的提交记录,并检出对应的 commit。 #### 3. 手动添加缺失函数 如果确认该函数缺失,可参考早期版本或其他分支中的实现手动添加。以下是一个示例实现: ```python # toolkit/utils.py import numpy as np def calculate_failures(results): """ 计算跟踪失败次数 :param results: 跟踪结果数据 :return: 失败次数 """ failures = [] for res in results: if 'num_frames' in res and 'trackers' in res: num_frames = res['num_frames'] trackers = res['trackers'] failure_count = sum([len(tracker) != num_frames for tracker in trackers.values()]) failures.append(failure_count) return np.array(failures) ``` 将上述代码添加至 `toolkit/utils.py` 或相应模块后,重新运行评估脚本。 #### 4. 检查 Python 包路径 运行以下命令查看当前使用的 `toolkit.utils` 文件路径: ```python import toolkit.utils print(toolkit.utils.__file__) ``` 确保输出的是项目目录下的 `toolkit/utils.py`,而非系统路径中的其他同名模块。 #### 5. 安装或更新依赖库 如果 `toolkit.utils` 来自第三方库,请尝试更新或安装对应库,例如: ```bash pip install --upgrade got-toolbox ``` ### 总结 该问题通常源于版本不一致或模块缺失。通过回退版本、手动添加函数或调整模块路径等方式,可以有效解决 `calculate_failures` 导入错误的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值