一、引言
- 配置:
ubuntu24.04+CUDA11.7+torch1.13.0+torchvision0.14.0(失败)
win11+CUDA11.6(成功) - 参考链接:
1). 商汤PySot的配置使用(1)
2). 商汤PySot的配置使用(2)
3). 使用Pysot框架遇到的问题 - 项目地址:https://github.com/STVIR/pysot
二、配置环境
这里我没有重新配置环境,而是使用的之前配置的一个环境,详细过程在这里,只需要重新安装一个 tensorboardX 库:
bash
pip install tensorboardX
三、demo
1. 添加路径
用 pycharm 打开项目并在终端中输入下面的命令,并检查是否添加成功:
bash
export PYTHONPATH=$PWD:$PYTHONPATH
echo $PYTHONPATH
win 添加路径的方式:
bash
# 配置临时环境变量
set PYTHONPATH=C:\path\to\dir
# 打印环境变量检查是否配置成功
echo %PYTHONPATH%
# 配置成功有如下输出
C:\path\to\dir
PS: 临时添加路径,每次都要添加。
2. stup.py
编译 stup.py 文件,生成 build 文件夹:
bash
python setup.py build_ext --inplace
3. 下载模型
官方链接:PySOT Model Zoo
百度云链接:https://pan.baidu.com/s/1GB9-aTtjG57SebraVoBfuQ 密码:j9yb
感谢大佬的分享。
将模型下载下来,将里面各个文件夹的 model.pth 文件,分别复制到 pysot 工程文件 experiments 对应的文件夹里。不要直接替换文件夹,里面的 config.yaml 文件不一样。直接替换的话,后面运行程序会报错。
4. demo.py
根据我个人的习惯,我在 demo.py 的 parser 中添加了 config、snapshot、video 的默认路径:
或者按照大佬的介绍在菜单栏 Run-->Edit configurations 中输入:
bash
--config
../experiments/siamrpn_alex_dwxcorr/config.yaml
--snapshot
../experiments/siamrpn_alex_dwxcorr/model.pth
--video
../demo/bag.avi
或者在终端中输入都可以。
然后运行 demo.py,用鼠标框个框,回车:
四、test
1. 错误1
在Ubuntu24.04中打开 test.py 文件,就有一个醒目的错误:Cannot find reference region in __init__.py
使用了非常多的方法都没有用,setup.py 文件改了又改,错误还是存在。而且 build 文件夹也顺利生成了,到底是什么原因呢?这里我在运行 setup.py 文件时还出现了两个警告:
Warning: Extension name toolkit.utils.region does not match fully qualified
toolkit/utils/region.pyx: cannot find cimported module 'c_region'
我最终的解决方案:
File→Settings→Editor→Inspections→在右侧框中选择python→Unresolved references
将Unresolved references后的"√"勾掉。。。
2. 错误2
bash
FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2)
解决方案:
在 setup.py 文件的开头第一行加上:
bash
# cython: language_level=3
或者在 anaconda3/envs/环境名称/lib/python3.7/site-packages/Cython/Compiler/Main.py 的第 757 行将 2 改为 3.
win11中没有出现错误。
3. 准备数据集(以 OTB100 为例)
- 下载 .json 文件
官方链接:https://pan.baidu.com/s/1js0Qhykqqur7_lNRtle1tA?at=1734357740544#list/path=/ - 配置数据集
将CVRP13.json,OTB100.json,OTB50.json放在OTB100数据集目录中(您需要将Jogging复制到Jogging-1和Jogging-2,并将Skating2复制到Skating2-1和Skating2-2或使用软链接,将 Human4 文件夹修改为 Human4-2
4. 编辑 test
运行 test.py。
会将测试结果保存在 ./results 下面,后面的评估需要测试结果。
五、eval
1. 编辑配置
在编辑配置中输入:
bash
--tracker_path
../tools/results
--dataset
OTB100
--num
1
--tracker_prefix
model
--show_video_level
点击运行。
2. 经典问题:
在ubuntu24.04中出现:
bash
ImportError: cannot import name 'calculate_failures' from 'toolkit.utils' (unknown location)
感觉可能还是 setup 运行的时候出了问题?我在 win11 中就没有遇到这个问题,运行 eval.py 非常顺利:
所以到底是怎么回事。后面我没有继续在Ubuntu24.04中配置了,只在win11中进行了下面的配置步骤。
五、安装 LaTeX
参考链接:
Latex安装教程
1. 安装 Texlive
- 下载地址:
win官方链接:https://tug.org/texlive/windows.html
清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/ - 下载
- 安装
解压 ISO 文件,右键 install-tl-windows.bat ,以管理员身份运行:
修改安装位置,路径中不能含有中文,然后点击 advance:
安装语言只选择了英文、中文:
点击确定,开始安装
- 检测安装结果
在终端中输入:
bash
tex -v
latex -v
xelatex -v
pdflatex -v
看是否显示版本号。若不显示则需添加环境变量,但一般应该是自动添加的。
2. 安装 TeXstudio
- 下载地址
win官方链接:https://texstudio.sourceforge.net/
清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/github-release/texstudio-org/texstudio/ - 下载
- 安装
安装路径需全英文
- 配置
1). 这里我打开就是中文版的,所以没有设置语言。
2). 设置编译环境
选项-->设置TeXstudio-->构建-->默认编译器-->XeLaTeX
写中文论文--->XeLaTeX,英文论文PdfLaTex - 测试效果
新建文件,编辑如下代码:
bash
\documentclass{article}
% 这里是导言区
\begin{document}
Hello, world!
\end{document}
点击构建并查看:
3. 更改eval.py的内容
bash
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import os
import argparse
from glob import glob
from tqdm import tqdm
from multiprocessing import Pool
from toolkit.datasets import OTBDataset, UAVDataset, LaSOTDataset, \
VOTDataset, NFSDataset, VOTLTDataset
from toolkit.evaluation import OPEBenchmark, AccuracyRobustnessBenchmark, \
EAOBenchmark, F1Benchmark
from toolkit.visualization import draw_success_precision, draw_eao, draw_f1
parser = argparse.ArgumentParser(description='tracking evaluation')
parser.add_argument('--tracker_path', '-p', type=str,
help='tracker result path')
parser.add_argument('--dataset', '-d', type=str,
help='dataset name')
parser.add_argument('--num', '-n', default=1, type=int,
help='number of thread to eval')
parser.add_argument('--tracker_prefix', '-t', default='',
type=str, help='tracker name')
parser.add_argument('--show_video_level', '-s', dest='show_video_level',
action='store_true')
parser.add_argument('--vis', dest='vis', action='store_true')
parser.set_defaults(show_video_level=False)
args = parser.parse_args()
def main():
tracker_dir = os.path.join(args.tracker_path, args.dataset)
trackers = glob(os.path.join(args.tracker_path,
args.dataset,
args.tracker_prefix+'*'))
trackers = [os.path.basename(x) for x in trackers]
assert len(trackers) > 0
args.num = min(args.num, len(trackers))
root = os.path.realpath(os.path.join(os.path.dirname(__file__),
'../testing_dataset'))
root = os.path.join(root, args.dataset)
if 'OTB' in args.dataset:
dataset = OTBDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
benchmark = OPEBenchmark(dataset)
success_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_success,
trackers), desc='eval success', total=len(trackers), ncols=100):
success_ret.update(ret)
precision_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_precision,
trackers), desc='eval precision', total=len(trackers), ncols=100):
precision_ret.update(ret)
benchmark.show_result(success_ret, precision_ret,
show_video_level=args.show_video_level)
if args.vis:
for attr, videos in dataset.attr.items():
draw_success_precision(success_ret,
name=dataset.name,
videos=videos,
attr=attr,
precision_ret=precision_ret)
elif 'LaSOT' == args.dataset:
dataset = LaSOTDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
benchmark = OPEBenchmark(dataset)
success_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_success,
trackers), desc='eval success', total=len(trackers), ncols=100):
success_ret.update(ret)
precision_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_precision,
trackers), desc='eval precision', total=len(trackers), ncols=100):
precision_ret.update(ret)
norm_precision_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_norm_precision,
trackers), desc='eval norm precision', total=len(trackers), ncols=100):
norm_precision_ret.update(ret)
benchmark.show_result(success_ret, precision_ret, norm_precision_ret,
show_video_level=args.show_video_level)
if args.vis:
draw_success_precision(success_ret,
name=dataset.name,
videos=dataset.attr['ALL'],
attr='ALL',
precision_ret=precision_ret,
norm_precision_ret=norm_precision_ret)
elif 'UAV' in args.dataset:
dataset = UAVDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
benchmark = OPEBenchmark(dataset)
success_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_success,
trackers), desc='eval success', total=len(trackers), ncols=100):
success_ret.update(ret)
precision_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_precision,
trackers), desc='eval precision', total=len(trackers), ncols=100):
precision_ret.update(ret)
benchmark.show_result(success_ret, precision_ret,
show_video_level=args.show_video_level)
if args.vis:
for attr, videos in dataset.attr.items():
draw_success_precision(success_ret,
name=dataset.name,
videos=videos,
attr=attr,
precision_ret=precision_ret)
elif 'NFS' in args.dataset:
dataset = NFSDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
benchmark = OPEBenchmark(dataset)
success_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_success,
trackers), desc='eval success', total=len(trackers), ncols=100):
success_ret.update(ret)
precision_ret = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval_precision,
trackers), desc='eval precision', total=len(trackers), ncols=100):
precision_ret.update(ret)
benchmark.show_result(success_ret, precision_ret,
show_video_level=args.show_video_level)
if args.vis:
for attr, videos in dataset.attr.items():
draw_success_precision(success_ret,
name=dataset.name,
video=videos,
attr=attr,
precision_ret=precision_ret)
elif args.dataset in ['VOT2016', 'VOT2017', 'VOT2018', 'VOT2019']:
dataset = VOTDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
ar_benchmark = AccuracyRobustnessBenchmark(dataset)
ar_result = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(ar_benchmark.eval,
trackers), desc='eval ar', total=len(trackers), ncols=100):
ar_result.update(ret)
benchmark = EAOBenchmark(dataset)
eao_result = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval,
trackers), desc='eval eao', total=len(trackers), ncols=100):
eao_result.update(ret)
ar_benchmark.show_result(ar_result, eao_result,
show_video_level=args.show_video_level)
elif 'VOT2018-LT' == args.dataset:
dataset = VOTLTDataset(args.dataset, root)
dataset.set_tracker(tracker_dir, trackers)
benchmark = F1Benchmark(dataset)
f1_result = {}
with Pool(processes=args.num) as pool:
for ret in tqdm(pool.imap_unordered(benchmark.eval,
trackers), desc='eval f1', total=len(trackers), ncols=100):
f1_result.update(ret)
benchmark.show_result(f1_result,
show_video_level=args.show_video_level)
if args.vis:
draw_f1(f1_result)
if __name__ == '__main__':
main()
4. 修改 eval.py 的 configurations
添加一行"--vis":
bash
--tracker_path
...\results
--dataset
OTB100
--num
1
--tracker_prefix
model
--show_video_level
--vis