最近项目的原因开始研究长时跟踪的解决方案,主要的难点在于
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
首先发现实际上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)
除了上述改动以外,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