LiYunfengLYF / LightFC

MIT License
27 stars 2 forks source link

跟踪性能表现 #7

Open assertdebug opened 1 month ago

assertdebug commented 1 month ago

测试同一个视频. 跟踪效果没有FearTrack 稳定, LightFC使用的是Vit的版本

LiYunfengLYF commented 1 month ago

测试同一个视频. 跟踪效果没有FearTrack 稳定, LightFC使用的是Vit的版本

你用的是FEAR-XXS吗?另外,LightFC的mobilenet和vit版本,本身应对扰动方面就容易丢失目标,它们的鲁棒性确实有不足。Fear系列有一个在线模板更新,所以它们的鲁棒性要比LightFC系列要强一点。所以,需要结合具体视频反映的跟踪挑战,来分析跟踪结果

assertdebug commented 1 month ago

使用同一个视频, 且初始化框是同一个位置roi = (1619, 181, 52, 51), 可以查看我分享的效果视频, 也有原始的视频文件 https://drive.google.com/drive/folders/1kiTFstGQdXhe-PaUnjNA7LGgJC9Ei0ix?usp=drive_link

assertdebug commented 1 month ago

测试同一个视频. 跟踪效果没有FearTrack 稳定, LightFC使用的是Vit的版本

你用的是FEAR-XXS吗?另外,LightFC的mobilenet和vit版本,本身应对扰动方面就容易丢失目标,它们的鲁棒性确实有不足。Fear系列有一个在线模板更新,所以它们的鲁棒性要比LightFC系列要强一点。所以,需要结合具体视频反映的跟踪挑战,来分析跟踪结果

使用的是LightFC vit 与 FEAR-XXS ,视频中没有干扰, Fear系列的作者其实并没有公开双模板更新的代码

assertdebug commented 1 month ago

分享下跑单个视频跟踪的代码实例 `import os import cv2 as cv import importlib import os import time from collections import OrderedDict from pathlib import Path import sys import numpy as np

from lib.test.utils import TrackerParams from lib.test.evaluation.environment import env_settings from lib.utils.lmdb_utils import decode_img from lib.test.evaluation.tracker import Tracker from lib.utils.load import load_yaml

if name == 'main': tracker = Tracker(name='lightfc', parameter_name="lightfc_datasets", dataset_name='OTB2015') video_path = '/home/devon/workspace/datasets/data_lyl_20231031/edit_4.mp4'

params = TrackerParams()
# yaml_file = '/home/devon/Project/TRACKER/SOT/LightFC/experiments/lightfc/mobilnetv2_p_pwcorr_se_scf_sc_iab_sc_adj_concat_repn33_se_conv33_center_wiou.yaml'
# params.cfg = load_yaml(yaml_file)
# params.template_factor = 2.0
# params.template_size = 128
# params.search_factor =  4.0
# params.search_size = 256
# params.checkpoint = '/home/devon/Project/TRACKER/SOT/LightFC/output/checkpoints/train/lightfc/mobilnetv2_p_pwcorr_se_scf_sc_iab_sc_adj_concat_repn33_se_conv33_center_wiou/lightfc_ep0400.pth.tar'

yaml_file = '/home/devon/Project/TRACKER/SOT/LightFC/experiments/lightfc/baseline_v1_release_backbone_tinyvit.yaml'
params.cfg = load_yaml(yaml_file)
params.template_factor = 2.0
params.template_size = 128
params.search_factor =  4.0
params.search_size = 256
params.checkpoint = '/home/devon/Project/TRACKER/SOT/LightFC/output_lightfc-vit/lightfc/baseline_v1_release_backbone_tinyvit/lightfc_ep0400.pth.tar'

light_tracker =tracker.create_tracker(params)

def _build_init_info(box):
    return {'init_bbox': box}

cap = cv.VideoCapture(video_path)

frame_width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
frame_rate = int(cap.get(cv.CAP_PROP_FPS))
print('frame_width:', frame_width)
print('frame_height:', frame_height)
print('frame_rate:', frame_rate)
writer = cv.VideoWriter('output_lightfc-vit.avi', cv.VideoWriter_fourcc(*'XVID'), frame_rate, (frame_width, frame_height))

count = 20
while count:
    ret, frame = cap.read()
    count = count-1
# x, y, w, h  = cv.selectROI('Video', frame)
x, y, w, h = 1619, 181, 52, 51

init_state = [x, y, w, h]
light_tracker.initialize(frame, _build_init_info(init_state))

print('Start tracking...')

while True:
    ret, frame = cap.read()

    if frame is None:
        break

    frame_disp = frame.copy()

    # Draw box
    out = light_tracker.track(frame)
    state = [int(s) for s in out['target_bbox']]

    cv.rectangle(frame_disp, (state[0], state[1]), (state[2] + state[0], state[3] + state[1]),
                     (0, 255, 0), 2)

    font_color = (0, 0, 0)
    cv.putText(frame_disp, 'Tracking!', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
                font_color, 1)
    cv.putText(frame_disp, 'Press r to reset', (20, 55), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
                font_color, 1)
    cv.putText(frame_disp, 'Press q to quit', (20, 80), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
                font_color, 1)

    writer.write(frame_disp)

    # Display the resulting frame
    cv.imshow('Video', frame_disp)
    key = cv.waitKey(1)
    if key == ord('q'):
        break

`
LiYunfengLYF commented 1 month ago

使用同一个视频, 且初始化框是同一个位置roi = (1619, 181, 52, 51), 可以查看我分享的效果视频, 也有原始的视频文件 https://drive.google.com/drive/folders/1kiTFstGQdXhe-PaUnjNA7LGgJC9Ei0ix?usp=drive_link

我找到问题了,是第初始化的包围框 (1619, 181, 52, 51),其中h=51包含了周围的环境信息,就是,外观模板里面包含了大量的环境信息,所以跟踪器认为环境信息也是目标的一部分,所以出现了问题,试着使用一下更精确的模板

05af49e9e37a88a898b8c37d9e876b3 7e8028024cc1857a24ba94416674eec

LiYunfengLYF commented 1 month ago

使用同一个视频, 且初始化框是同一个位置roi = (1619, 181, 52, 51), 可以查看我分享的效果视频, 也有原始的视频文件 https://drive.google.com/drive/folders/1kiTFstGQdXhe-PaUnjNA7LGgJC9Ei0ix?usp=drive_link

这个是我使用更精确的上面回答中下面的外观模板之后跑出来的结果 https://drive.google.com/file/d/1sKt1mb6GXaizaqFWuW6C9jY-tTnh6S8I/view?usp=drive_link

assertdebug commented 1 month ago

精确模板效果确实是可以的, 我也有尝试过, 但XFearTrack 能最终收敛到 包围整个车的边界, 但lightFC 好像并没有, 这个底层原因是什么啊?

LiYunfengLYF commented 1 month ago

精确模板效果确实是可以的, 我也有尝试过, 但XFearTrack 能最终收敛到 包围整个车的边界, 但lightFC 好像并没有, 这个底层原因是什么啊?

这里我的理解是,视觉目标跟踪器通常靠两点实现包围框预测,即外观匹配或目标类别的学习。前者的话,其实更像是按图索骥,模板里面有什么信息,它就去找,找到了就输出个包围框;后者的话,它更像是一种类检测的方法,知道类别,也知道类别长啥样,然后就直接盯着这个类别的目标的大致特征输出包围框。

可能LightFC更像是前者,FEAR更像是后者,我去查了一下FEAR,里面没找到具体的训练周期,但是他们使用4个A6000训练了5天,我们是2个A6000训练了3天多,然后他们使用的数据集也比我多了ImageNet,还有YoutubeBB(TrackingNet是它的子集),所以FEAR在类别的学习上,比我们的方法更深入一点。

如果想强化LightFC的类别学习的话,最好能在我们使用四个数据集的基础上,再额外加一些你要跟踪的类别的检测数据,强化一下算法对类别的学习,或许能解决这个问题,这里可以参考我们之前的工作https://github.com/LiYunfengLYF/UOSTrack 我们试过对跟踪器特别目标的类别学习是可以在遇到干扰时,保持对特定目标的精确框跟踪的,这时候起作用的不是模板中的目标外观轮廓,而是目标本身类别下的关键特征,论文里称之为判别性特征。其论文名为Underwater Object Tracker: UOSTrack for Marine Organism Grasping of Underwater Vehicles