当前位置: 首页 > 工具软件 > PySOT > 使用案例 >

Pysot 长时单目标跟踪代码解读

曾光远
2023-12-01

一、项目简介

最近项目的原因开始研究长时跟踪的解决方案,主要的难点在于
1.需要在目标长时间丢失的情况下一直等待目标出现,出现后重新识别.
2.需要控制云台实时转动防止目标跑出视野之外,需要考虑云台与跟踪算法的闭环。

传统的和AI的都尝试做了复现,传统的主要使用了基于opencv的KCF和CRST算法,单独拿一篇博客来说。
博客地址:

AI的在调研复现了几个跟踪算法后感觉商汤的PYSOT针对我们的需求效果最好,因此学习了一下,这篇主要是写了一下针对github上代码的人理解和个人改动,做个笔记防止以后忘了。关于网络结构和原理以后有空单独写吧。

二、简介

PySOT是商汤科技视频智能研究团队设计的软件系统。它实现了最先进的单对象跟踪算法,包括SiamRPN和SiamMask。它是用 Python 编写的,由PyTorch深度学习框架提供支持。该项目还包含用于评估跟踪器的工具包的 Python 端口。
PySOT包括: SiamRPN、 DaSiamRPN、 SiamRPN++和 SiamMask。

项目开源地址:
https://github.com/STVIR/pysot

个人修改版github地址:
https://github.com/Hongyu-Yue/pysot_Pan-tilt

注:修改了demo.py,增加了photodrive文件夹,内有两个文件,分别为云台和相机控制。需要有相应的硬件才能运行,主要需要云台和海康的长焦相机。

二、简单运行

找到tools/demo.py运行,配置Config如下,其中,pth文件为训练权重文件,在官网下载得到,由于任务为单目标长时跟踪,所以下载了_lt的权重

--config
E:\python\pythonProject\pysot-master\experiments\siamrpn_r50_l234_dwxcorr_lt\config.yaml
--snapshot
E:\python\pythonProject\pysot-master\experiments\siamrpn_r50_l234_dwxcorr_lt\model.pth

三、对长时跟踪函数siamrpnlt_tracker.py的解读

首先发现实际上DEMO.PY里面的config文件默认的跟踪模式有三个,由Tracker_builder.py决定,如下:

TRACKS = {
          'SiamRPNTracker': SiamRPNTracker,
          'SiamMaskTracker': SiamMaskTracker,
          'SiamRPNLTTracker': SiamRPNLTTracker
         }


def build_tracker(model):
    return TRACKS[cfg.TRACK.TYPE](model)

其中第三个LT为长时跟踪的程序调用,需要把config.yaml(前面设置的地址)里的

TRACK:
    TYPE: 'SiamRPNLTTracker'

TYPE改成 SiamRPNLTTracker才可以调用长时跟踪,调用跟踪函数为siamrpnlt_tracker.py
简单对比了一下,在长时跟踪模式下,会有一个对best_score的判断过程,当best_score低于某一阈值(在config文件中通过TRACK.CONFIDENCE_LOW和TRACK.CONFIDENCE_HIGH设置)时,跟丢指示器longterm_state变为True,报跟丢,高于某一阈值时再变回False,报重识别,这块的代码控制如下:

        if best_score < cfg.TRACK.CONFIDENCE_LOW:
            self.longterm_state = True
        elif best_score > cfg.TRACK.CONFIDENCE_HIGH:
            self.longterm_state = False

当跟丢指示器longterm_state为False时,正常执行跟踪程序,当变为True时会启动查询模式,增大查询框的面积,直到找到可信度高于设定值的目标,会重新进行识别。这段的代码如下,其中两个参数即设置查询框的,也可在CONFIG中找到:

 	if self.longterm_state:
            #a=1
            #cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
            instance_size = cfg.TRACK.LOST_INSTANCE_SIZE
    else:
        instance_size = cfg.TRACK.INSTANCE_SIZE
    score_size = (instance_size - cfg.TRACK.EXEMPLAR_SIZE) // \
        cfg.ANCHOR.STRIDE + 1 + cfg.TRACK.BASE_SIZE
    hanning = np.hanning(score_size)
    window = np.outer(hanning, hanning)
    window = np.tile(window.flatten(), self.anchor_num)
    anchors = self.generate_anchor(score_size)

    s_x = s_z * (instance_size / cfg.TRACK.EXEMPLAR_SIZE)

    x_crop = self.get_subwindow(img, self.center_pos, instance_size,
                                round(s_x), self.channel_average)
    outputs = self.model.track(x_crop)
    score = self._convert_score(outputs['cls'])
    pred_bbox = self._convert_bbox(outputs['loc'], anchors)

四、改动LOG

除了上述改动以外,demo目前运行的结果有几个小问题:
1.如果跟丢不会报告,而是ROI定在跟丢前地址不动。
2.一旦选择了ROI之后,无法重新选择。
因此针对demo.py做了一些外围改动,主要是增加了重新选择候选框的模块,代码如下:

first_frame_temp = cv2.waitKey(40)
if first_frame_temp != -1:
    first_frame=True
	first_frame_temp = -1

以及增加了跟丢报告功能,并在跟丢时删除ROI框,直到跟上了再重新显示。

if outputs['lost'] == 0:
	bbox = list(map(int, outputs['bbox']))
    cv2.putText(frame, "Tracking OK", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,
    (0, 255, 0), 2)
    cv2.rectangle(frame, (bbox[0], bbox[1]),
                 (bbox[0]+bbox[2], bbox[1]+bbox[3]),
                 (0, 255, 0), 3)
else:
    cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,
                          (0, 0, 255), 2)

其他的还有简单的通过opencv完成增加了一些跟丢和跟上的提示字符,然后重新写了一下上述siamrpnlt_tracker.py,在字典里都添加了两个参数报告出来,给demo用,主要就是上述报跟丢的longterm_state参数,还有一个best_score参数,都是外围改动。

个人修改版github地址:
https://github.com/Hongyu-Yue/pysot_Pan-tilt

目前使用的相机是海康的一款长焦相机,不能直接通过cv2调用,需要调用驱动,程序里也增加了相机调用的模块。
这部分代码位置:photodrive/hikrobot.py

以及程序里增加了云台相机的控制代码,主要是通过候选框的位置实时控制云台转动,让相机能够实时跟踪。
这部分代码位置:photodrive/ytcrol.py

五、避坑

ModuleNotFoundError: No module named ‘pysot’

解决方案:

Linux下:

export PYTHONPATH=path/to/pysot

Windows下,使用作者推荐的 set PYTHONPATH=path/to/pysot无效,根据下链接的博客找到解决方案如下:

python exporttest.py --path D:\projectPy\Track\pysot-master

参考了如下链接
https://blog.csdn.net/sans_yyb/article/details/117222311

 类似资料: