Pysot长时单⽬标跟踪代码解读
⼀、项⽬简介
最近项⽬的原因开始研究长时跟踪的解决⽅案,主要的难点在于
1.需要在⽬标长时间丢失的情况下⼀直等待⽬标出现,出现后重新识别.
2.需要控制云台实时转动防⽌⽬标跑出视野之外,需要考虑云台与跟踪算法的闭环。
传统的和AI的都尝试做了复现,传统的主要使⽤了基于opencv的KCF和CRST算法,单独拿⼀篇博客来说。
博客地址:
AI的在调研复现了⼏个跟踪算法后感觉商汤的PYSOT针对我们的需求效果最好,因此学习了⼀下,这篇主要是写了⼀下针对github上代码的⼈理解和个⼈改动,做个笔记防⽌以后忘了。关于⽹络结构和原理以后有空单独写吧。
⼆、简介
PySOT是商汤科技视频智能研究团队设计的软件系统。它实现了最先进的单对象跟踪算法,包括SiamRPN和SiamMask。它是⽤ Python 编写的,由PyTorch深度学习框架提供⽀持。该项⽬还包含⽤于评估跟踪器的⼯具包的 Python 端⼝。
PySOT包括: SiamRPN、 DaSiamRPN、 SiamRPN++和 SiamMask。
注:修改了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:
rectangle函数opencvinstance_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 = ate_anchor(score_size)
s_x = s_z *(instance_size / cfg.TRACK.EXEMPLAR_SIZE)
x_crop = _subwindow(img, _pos, instance_size,
round(s_x), self.channel_average)
outputs = ack(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)
(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参数,都是外围改动。
⽬前使⽤的相机是海康的⼀款长焦相机,不能直接通过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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论