1. 环境搭建github 主页:https://github.com/researchmm/Stark
- OS: Ubuntu18.04 LTS
- CUDA: 11.1
- TORCH: 1.8.1
创建一个新的虚拟环境:
conda create -n stark python=3.8
注意:这里首先只创建一个最基础的环境,以后差什么包,自己写在
requirements.txt
文件里面,然后通过pip install -r requirements.txt
安装缺少的包即可,最好不要使用官方提供的requirements.txt
或者environment.yml
部署工具来安装!!!因为里面包含了一些和硬件相关的信息,直接进行安装的话会出现各种错误,这也是长期以来踩坑的一个小小总结。
这里要说明一下,安装 TORCH
的时候,需要根据自己的机器来确定安装的版本,具体要和 nvcc -V
显示的 CUDA TOOLKIT
版本一致,如下图。
对应到 PyTorch
官网下载时,不要选择下载最新的 TORCH
,本文选择的是 1.8.1
版本,在这个页面进行下载:https://pytorch.org/get-started/previous-versions/
注意:下载的时候如果在官方提供的下载命令中,没有找到自己对应的
CUDA
版本的安装命令,可以使用后面的PIP
来进行安装!
由于TORCH 1.8.1
没有提供CUDA
下载,如果直接使用conda install
安装的话,默认安装的是CPU
版本,因此后面import torch
就会报错!这里选择使用PIP
来进行下载。
# CUDA 11.1
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
# CUDA 10.2
pip install torch==1.8.1+cu102 torchvision==0.9.1+cu102 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
# CUDA 10.1
pip install torch==1.8.1+cu101 torchvision==0.9.1+cu101 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
这里我们选择与自己机器 CUDA
版本匹配进行下载。
再次强调下:不是
nvidia-smi
而是nvcc -V
中的CUDA
版本!!!因为后者对应着RUN TIME
版本,运行的时候,实际调用的是这个!一般前者的版本一般都比后者高,后者只要不高于前者的版本即可。
这里再啰嗦一句,使用 CONDA
与 PIP
的区别:两者管理扩展包的方式不一样。
conda install
默认安装包的位置在anaconda3/pkgs/
里面,只要这里面有现成的扩展包,就首先引用这里的扩展包,不用重复下载。pip install
默认的安装位置是anaconda3/envs/虚拟环境名字/pkgs/
,它的管理范围只局限在当前的虚拟环境,不能跨越不同的环境,所以就算其他虚拟环境中有已经安装好的扩展包,每次安装的的时候,都会重新下载。管理的范围更小,更加独立。
以上是查阅资料后的个人理解,如果有不当的地方,望指正,谢谢!
安装好 PyTorch
之后,接下来有两种方法安装相应的扩展包,作者一般都会提供,一般有三种方法。
由于 STARK
的作者提供的是 shell
脚本来进行安装扩展包的,因此相对来说还是比较方便。
但还是需要查看里面的安装命令,看里面的某些命令是否和硬件环境相关,如果有,更改为和自己硬件匹配的安装命令(主要是版本的修改,比如说 PyTorch
的 CUDA
版本)。
echo "****************** Installing pytorch ******************"
conda install -y pytorch==1.7.0 torchvision==0.8.1 cudatoolkit=10.2 -c pytorch
echo "****************** Installing thop tool for FLOPs and Params computing ******************"
pip install --upgrade git+https://github.com/Lyken17/pytorch-OpCounter.git
pip install onnx onnxruntime-gpu==1.6.0
以上就是从作者提供的脚本中发现的存在 BUG
隐患的地方,就拿第一条来说,这里就是一个大坑,第二条也是,把安装的 torch
更新到了最新版本,好气!最后一条还好,不需要修改,将以上中的前两条删除,然后运行这个安装脚本就可以(可以使用 source
或者 bash
,这里不再解释这两个命令的区别,感兴趣的自行 GOOGLE
)。
source install_pytorch17.sh
# or
bash install_pytorch17.sh
1.2 使用 requirements.txt
安装(推荐)
思路:把作者提供的各种下载包复制到 requirements.txt
文件里面。
Step1. 找到需要 pip install 的包
requirements.txt
官方文档:https://pip.pypa.io/en/stable/reference/requirements-file-format/
(stark) xxx@xxx:~/username/proj/stark$ grep "install*" install_pytorch17.sh
conda install -y pytorch==1.7.0 torchvision==0.8.1 cudatoolkit=10.2 -c pytorch
pip install PyYAML
pip install easydict
pip install cython
pip install opencv-python
pip install pandas
conda install -y tqdm
pip install pycocotools
apt-get install libturbojpeg
pip install jpeg4py
pip install tb-nightly
pip install tikzplotlib
pip install --upgrade git+https://github.com/Lyken17/pytorch-OpCounter.git
pip install colorama
pip install lmdb
pip install scipy
pip install visdom
pip install git+https://github.com/votchallenge/vot-toolkit-python
pip install onnx onnxruntime-gpu==1.6.0
pip install timm==0.3.2
(stark) xxx@xxx:~/username/proj/stark$
这里作者使用的是 shell
脚本批量安装的命令,因此没有绑定一大堆的版本信息,这里还是比较方便的,把这里得到的所有安装包信息复制到 VSCode
里面,然后使用 VSCode
的查找替换功能删除指定的版本信息。
注意:由于这里演示的是使用
requirements.txt
部署安装(PIP
对应的部署管理工具,我之前写过一篇相关的博客,感兴趣的可以去看:使用配置文件创建conda环境),因此需要将里面和pip install
安装无关的都删除,虽然比较麻烦,但是安装管理是分开的,不会很混乱,不容易出错!
由于 shell
脚本中还有使用 apt
安装到系统中的扩展包,只需要找到,然后单独执行即可。
sudo apt-get install libturbojpeg
Step2. 使用 requirements.txt
安装部署
修改后的 requirements.txt
内容为:
torch==1.8.1+cu111 ## 注意这里修改为自己机器适应的 CUDA 版本!!!
torchvision==0.9.1+cu111 ## 注意这里修改为自己机器适应的 CUDA 版本!!!
torchaudio==0.8.1
-f https://download.pytorch.org/whl/torch_stable.html
PyYAML
easydict
cython
opencv-python
pandas
tqdm
pycocotools
jpeg4py
tb-nightly
tikzplotlib
colorama
lmdb
scipy
visdom
git+https://github.com/votchallenge/vot-toolkit-python
onnx
onnxruntime-gpu==1.6.0
timm==0.3.2
black
yacs
ipython
然后执行(当然是在激活的 stark
虚拟环境里面):
pip install -r requirements.txt
完成安装。
这里有一个小技巧,如果你已经有了 requirements.txt
文件,那么可以直接使用下面的命令创建新的环境:
conda create -n env_name --file requirements.txt
1.3 使用 environment.yml
安装(不推荐,因为只要某一个包没下载成功,后面所有的都不会下载,而该环境已经创建)
environment.yml
官方说明文档:https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?highlight=environment.yml
直接看官方文档就可以了,个人基本没有用到该工具。
简单地给个官方的示例:
name: stats2
channels:
- javascript
- nodefaults # 禁用默认的下载源,使得这里配置的下载源生效,自己看情况使用
dependencies:
- python=3.6 # or 2.7
- bokeh=0.9.2
- numpy=1.9.*
- nodejs=0.10.*
- flask
- pip # 安装 pip,不然后面无法执行 pip 命令,不然你都没安装怎么执行后面的 *** 作
- pip:
- Flask-Testing
这里说下和 requirements.txt
的区别,前者使用 ==
指定版本号,而后者的 dependencies
(注意为什么要强调下这个,因为 pip
中也要使用 ==
指定版本)使用 =
指定。
按照官方给的说明文档(README.md
) *** 作之前,需要更改下文件,更改之后就不用再手动修改创建的 local.py
文件了,方便很多。
首先看看作者的说明:
create_default_local_file_ITP_train
函数中修改训练集相关路径:
EnvSettings_ITP
类初始化函数 __init__
中修改路径(注意和 trainning
设置不一样!!!主要是调用方法不一样):
根据官方提供的数据集目录树,通过创建软链接的方法,将其联系起来,到之后直接就可以访问到相应的数据,如果某些存放结果的目录需要修改,还是要按照 方法1 来 *** 作。
创建软链接的方法示例。
ln -s /data/GOT-10k ${STARK_ROOT}/data/got10k # 注意这里最后不要和注释里面的一样加一个/
# ln -s /data/GOT-10k/ ${STARK_ROOT}/data/got10k # 这样会在原来的文件夹中创建一个新的文件 GOT-10k
## 如果创建错误,或者不需要了,直接使用下面的方法删除软链接就是
rm got10k
3. 下载预训练模型
用于测试的预训练模型,老规矩,根据官方提供的目录树创建好相应的目录。
然后把这些下载好的预训练模型放入到对应的文件夹中就可以了,这里提供下载好的预训练模型(阿里云盘),解压后直接放入到 STARK_ROOT
目录中就可以。
「STARK_LT」https://www.aliyundrive.com/s/6drwRrK2wcS 提取码: yl05
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
scp -r xxx@xxx:/home/xxx/checkpoints/stark/* .\Desktop\
4. 运行和测试这里只是个人记录下
scp
怎么从远程拷贝文件!!!
首先运行:
python tracking/create_default_local_file.py --workspace_dir . --data_dir ./data --save_dir .
生成 local.py
文件(train & test
文件夹下分别生成)。
这里直接引用作者原句:
Training with multiple GPUs using DDP(多 GPU 训练).
# STARK-S50
python tracking/train.py --script stark_s --config baseline --save_dir . --mode multiple --nproc_per_node 8 # STARK-S50
# STARK-ST50
python tracking/train.py --script stark_st1 --config baseline --save_dir . --mode multiple --nproc_per_node 8 # STARK-ST50 Stage1
python tracking/train.py --script stark_st2 --config baseline --save_dir . --mode multiple --nproc_per_node 8 --script_prv stark_st1 --config_prv baseline # STARK-ST50 Stage2
# STARK-ST101
python tracking/train.py --script stark_st1 --config baseline_R101 --save_dir . --mode multiple --nproc_per_node 8 # STARK-ST101 Stage1
python tracking/train.py --script stark_st2 --config baseline_R101 --save_dir . --mode multiple --nproc_per_node 8 --script_prv stark_st1 --config_prv baseline_R101 # STARK-ST101 Stage2
(Optionally) Debugging training with a single GPU
python tracking/train.py --script stark_s --config baseline --save_dir . --mode single
4.2 test
这部分暂时只测试了 GOT-10k
,VOT
部分遇到了很多困难,后续更新…
Test and evaluate STARK on benchmarks.
- LaSOT
python tracking/test.py stark_st baseline --dataset lasot --threads 32
python tracking/analysis_results.py # need to modify tracker configs and names
- GOT10K-test
python tracking/test.py stark_st baseline_got10k_only --dataset got10k_test --threads 32
python lib/test/utils/transform_got10k.py --tracker_name stark_st --cfg_name baseline_got10k_only
运行效果:
- TrackingNet
python tracking/test.py stark_st baseline --dataset trackingnet --threads 32
python lib/test/utils/transform_trackingnet.py --tracker_name stark_st --cfg_name baseline
- VOT2020
Before evaluating “STARK+AR” on VOT2020, please install some extra packages following external/AR/README.md
cd external/vot20/<workspace_dir>
export PYTHONPATH=<path to the stark project>:$PYTHONPATH
bash exp.sh
- VOT2020-LT
cd external/vot20_lt/<workspace_dir>
export PYTHONPATH=<path to the stark project>:$PYTHONPATH
bash exp.sh
二、STARK_LT
这个 github 暂时没有提供,只能通过 VOT Challenge 官网进行获取。
ST Trackers 获取链接:https://www.votchallenge.net/vot2021/trackers.html
STARK_LT 下载链接:http://data.votchallenge.net/vot2021/trackers/STARK_RT-code-2021-05-30T13_54_26.067770.zip
由于是在 STARK
的基础上修改的,因此配置运行基本差不多,直接参考 STARK
的即可,只是需要注意的是
对应到:
config.yaml
中的stack
~/anaconda3/envs/stark/lib/python3.8/site-packages/vot/workspace/__init__.py
文件中数据集的修改,具体怎么修改,参考下面第三部分的 *** 作。修改以下文件:
vim /home/guest/anaconda3/envs/stark/lib/python3.8/site-packages/vot/workspace/__init__.py +155
## 打开后,修改成如下,然后保存即可
155 #if not self.stack.dataset is None:
156 #Workspace.download_dataset(self.stack.dataset, dataset_directory)
157
158 # self._dataset = load_dataset(dataset_directory)
159 self._dataset = load_dataset("/data/VOT2020_LT") ## 这里是 VOT 数据集的路径
Step2. 修改配置文件 1. config.yaml 2. trackers.ini Step3. 修改相关源代码 1. CUDA 相关 2. vot 模块引入 三、问题记录 3.1 关于 VOT 测试运行记录这里的
VOT2020_LT
实际上是今年最新的longterm tracking datasets
,使用官方提供的toolkits
下载时也是这个名字。
由于只能使用官方提供的工具包进行测试,整个过程遇到很多错误,这里特地记录下来。
首先是 trackers.ini
文件的修改:
[stark_st101] ## tracker 的名称,后面执行命令时需要使用到
label = stark_st101 ## 这个目前不知道是什么意思
protocol = traxpython ## 指定通信协议
command = stark_st101 ## paths 路径下必须有该模块文件,作为启动
paths = >/lib/test/vot20 ## 指定与 trax 通信的模块路径
修改 config.yaml
配置文件:
registry:
- ./trackers.ini
stack: vot2021
主要是修改 stack
,对应哪个年份哪种数据集,名称可以在 vot-toolkit
GitHub 仓库中的 vot/stack
中找到。
修改 vot-toolkit
的源码。
find ~/anaconda3/envs/stark/ -name "vot" ## 找到 vot 的安装目录
修改以下文件:
vim /home/guest/anaconda3/envs/stark/lib/python3.8/site-packages/vot/workspace/__init__.py +155
## 打开后,修改成如下,然后保存即可
155 #if not self.stack.dataset is None:
156 #Workspace.download_dataset(self.stack.dataset, dataset_directory)
157
158 # self._dataset = load_dataset(dataset_directory)
159 self._dataset = load_dataset("/data/VOT2021") ## 这里是 VOT 数据集的路径
这是一种比较笨的方法,应该是可以通过其他方法解决的,不过目前这是最有效的方法,阅读源码有点费时间,看作者的注释可以猜到和 Workspace.load()
这个 staticmethod
有关。
2. evaluate 失败,提示找不到 lib 模块这里附上一个大神写的手动下载
VOT
数据集的方法:https://blog.csdn.net/laizi_laizi/article/details/122492396最好不要使用这个官方的工具集来下载,会出现各种问题,什么不能解压
.rar
文件错误(这里修改官方源码后,还是会报错),网络错误等等。
这里作者只提供了zip
解压缩的方法,没有写rar
文件(对应annotation.rar
)解压缩,因此文件格式不匹配发生异常,程序中断。至于为什么作者得到的文件是
rar
格式,这个不是很清楚。个人猜测和转换下载链接那里有关,将原始的下载链接转换为了从
GOOGLE DRIVE
链接。
数据集加载成功之后,在评估的时候出了问题,具体调用情况如下,如果没有看 vot-toolkit-python
源码,看不懂正常,这里只个人纪录下。
vot --- (vot-toolkit)__main__.py(main) --- cli.py(do_evaluate) --- do_evaluate(run_experient 到这里就出错了)
提示的错误是 TraxException
,通过日志文件 log
的内容查看,提示是模块没有导入成功,控制台输出的错误提示如下。
vot.tracker.TrackerException: Unable to connect to tracker
Tracker output written to file: /home/xxx/xxx/proj/stark/external/vot20/stark_st101/logs/stark_st101_2022-04-14T10-42-04.069526.log
Evaluation interrupted by tracker error: ('Experiment interrupted', TrackerException(TraxException('Unable to connect to tracker')))
log
文件中的日志信息如下。
Traceback (most recent call last):
File "/home/xxx/anaconda3/envs/stark/lib/python3.8/runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/home/xxx/anaconda3/envs/stark/lib/python3.8/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/xxx/xxx/proj/stark/lib/test/vot20/stark_st101.py", line 1, in <module>
from lib.test.vot20.stark_vot20 import run_vot_exp
ModuleNotFoundError: No module named 'lib'
Process not alive anymore, unable to retrieve return code
Solution #1
按照提示来 *** 作,在提示出错的文件前加入:
import sys
sys.path.append("${STARK_ROOT}")
不过这种方法比较耗时耗力,会修改很多文件,不推荐。
修改 trackers.ini
配置文件。
[stark_st101] ## tracker name
label = stark_st101
protocol = traxpython
## ini 文件中,";" 以及 "#" 都表示注释
; command = import pytracking.run_vot as run_vot; run_vot.run_vot('dimp', 'dimp50_vot18') # 这只是一个示例,作为参考记录
; command = stark_st101 # 作者提供的原始命令,要修改成以下的命令
command = import lib.test.vot20.stark_st101 as stark_st101
## Specify a path to trax python wrapper if it is not visible (separate by ; if using multiple paths)
## 修改 paths,和 command 对应,使得 paths 匹配 command 中的路径
; paths = /home/guest/XieBailian/proj/stark/lib/test/vot20
paths = /home/guest/XieBailian/proj/stark
## Additional environment paths: 尝试解决的过程,这种方式不起作用
; env_PATH = /home/guest/anaconda3/envs/stark/bin/python;${PATH}
; export PYTHONPATH=/home/guest/anaconda3/envs/stark/:$PYTHONPATH
3. 以上第二步解决了参考链接:https://github.com/votchallenge/toolkit/issues/26
lib
模块等路径的问题后,再次运行,又出现了以下错误
vot.tracker.TrackerException: Unable to connect to tracker
Tracker output written to file: /home/xxx/xxx/proj/stark/external/vot20/stark_st101/logs/stark_st101_2022-04-14T09-59-45.809897.log
Evaluation interrupted by tracker error: ('Experiment interrupted', TrackerException(TraxException('Unable to connect to tracker')))
其实这个错误类型和第二步中的一样,但是 log
中的信息不一样了。
test config: {'MODEL': {'HEAD_TYPE': 'CORNER', 'NLAYER_HEAD': 3, 'HIDDEN_DIM': 256, 'NUM_OBJECT_QUERIES': 1, 'POSITION_EMBEDDING': 'sine', 'PREDICT_MASK': False, 'BACKBONE': {'TYPE': 'resnet101', 'OUTPUT_LAYERS': ['layer3'], 'STRIDE': 16, 'DILATION': False}, 'TRANSFORMER': {'NHEADS': 8, 'DROPOUT': 0.1, 'DIM_FEEDFORWARD': 2048, 'ENC_LAYERS': 6, 'DEC_LAYERS': 6, 'PRE_NORM': False, 'DIVIDE_NORM': False}}, 'TRAIN': {'TRAIN_CLS': True, 'LR': 0.0001, 'WEIGHT_DECAY': 0.0001, 'EPOCH': 50, 'LR_DROP_EPOCH': 40, 'BATCH_SIZE': 16, 'NUM_WORKER': 8, 'OPTIMIZER': 'ADAMW', 'BACKBONE_MULTIPLIER': 0.1, 'GIOU_WEIGHT': 2.0, 'L1_WEIGHT': 5.0, 'DEEP_SUPERVISION': False, 'FREEZE_BACKBONE_BN': True, 'FREEZE_LAYERS': ['conv1', 'layer1'], 'PRINT_INTERVAL': 50, 'VAL_EPOCH_INTERVAL': 10, 'GRAD_CLIP_NORM': 0.1, 'SCHEDULER': {'TYPE': 'step', 'DECAY_RATE': 0.1}}, 'DATA': {'SAMPLER_MODE': 'trident_pro', 'MEAN': [0.485, 0.456, 0.406], 'STD': [0.229, 0.224, 0.225], 'MAX_SAMPLE_INTERVAL': [200], 'TRAIN': {'DATASETS_NAME': ['LASOT', 'GOT10K_vottrain', 'COCO17', 'TRACKINGNET'], 'DATASETS_RATIO': [1, 1, 1, 1], 'SAMPLE_PER_EPOCH': 60000}, 'VAL': {'DATASETS_NAME': ['GOT10K_votval'], 'DATASETS_RATIO': [1], 'SAMPLE_PER_EPOCH': 10000}, 'SEARCH': {'NUMBER': 1, 'SIZE': 320, 'FACTOR': 5.0, 'CENTER_JITTER': 4.5, 'SCALE_JITTER': 0.5}, 'TEMPLATE': {'NUMBER': 2, 'SIZE': 128, 'FACTOR': 2.0, 'CENTER_JITTER': 0, 'SCALE_JITTER': 0}}, 'TEST': {'TEMPLATE_FACTOR': 2.0, 'TEMPLATE_SIZE': 128, 'SEARCH_FACTOR': 5.0, 'SEARCH_SIZE': 320, 'EPOCH': 50, 'UPDATE_INTERVALS': {'LASOT': [200], 'GOT10K_TEST': [200], 'TRACKINGNET': [25], 'VOT20': [10], 'VOT20LT': [100]}}}
Downloading: "https://download.pytorch.org/models/resnet101-5d3b4d8f.pth" to /home/xxx/.cache/torch/hub/checkpoints/resnet101-5d3b4d8f.pth
0%| | 0.00/170M [00:00<?, ?B/s]
0%| | 40.0k/170M [00:00<18:14, 163kB/s]
0%| | 88.0k/170M [00:00<11:29, 259kB/s]
0%| | 120k/170M [00:00<11:34, 257kB/s]
0%| | 184k/170M [00:00<08:36, 346kB/s]
0%| | 264k/170M [00:00<06:17, 473kB/s]
0%| | 360k/170M [00:00<04:49, 617kB/s]
0%| | 488k/170M [00:00<03:38, 816kB/s]
0%| | 696k/170M [00:01<02:31, 1.18MB/s]
1%| | 952k/170M [00:01<01:51, 1.59MB/s]
1%| | 1.27M/170M [00:01<01:21, 2.18MB/s]
1%| | 1.76M/170M [00:01<00:58, 3.03MB/s]
1%|Process not alive anymore, unable to retrieve return code
原因,下载 resnet101
预训练模型失败,解决方法,直接手动下载放到提示的文件夹中(根据以上日志文件中的 Downloading
得出的判断):
wget https://download.pytorch.org/models/resnet101-5d3b4d8f.pth -P /home/xxx/.cache/torch/hub/checkpoints/
4. 关于 CUDA 的配置错误
以上修改之后,直接运行还是会报错。
test config: {'MODEL': {'HEAD_TYPE': 'CORNER', 'NLAYER_HEAD': 3, 'HIDDEN_DIM': 256, 'NUM_OBJECT_QUERIES': 1, 'POSITION_EMBEDDING': 'sine', 'PREDICT_MASK': False, 'BACKBONE': {'TYPE': 'resnet101', 'OUTPUT_LAYERS': ['layer3'], 'STRIDE': 16, 'DILATION': False}, 'TRANSFORMER': {'NHEADS': 8, 'DROPOUT': 0.1, 'DIM_FEEDFORWARD': 2048, 'ENC_LAYERS': 6, 'DEC_LAYERS': 6, 'PRE_NORM': False, 'DIVIDE_NORM': False}}, 'TRAIN': {'TRAIN_CLS': True, 'LR': 0.0001, 'WEIGHT_DECAY': 0.0001, 'EPOCH': 50, 'LR_DROP_EPOCH': 40, 'BATCH_SIZE': 16, 'NUM_WORKER': 8, 'OPTIMIZER': 'ADAMW', 'BACKBONE_MULTIPLIER': 0.1, 'GIOU_WEIGHT': 2.0, 'L1_WEIGHT': 5.0, 'DEEP_SUPERVISION': False, 'FREEZE_BACKBONE_BN': True, 'FREEZE_LAYERS': ['conv1', 'layer1'], 'PRINT_INTERVAL': 50, 'VAL_EPOCH_INTERVAL': 10, 'GRAD_CLIP_NORM': 0.1, 'SCHEDULER': {'TYPE': 'step', 'DECAY_RATE': 0.1}}, 'DATA': {'SAMPLER_MODE': 'trident_pro', 'MEAN': [0.485, 0.456, 0.406], 'STD': [0.229, 0.224, 0.225], 'MAX_SAMPLE_INTERVAL': [200], 'TRAIN': {'DATASETS_NAME': ['LASOT', 'GOT10K_vottrain', 'COCO17', 'TRACKINGNET'], 'DATASETS_RATIO': [1, 1, 1, 1], 'SAMPLE_PER_EPOCH': 60000}, 'VAL': {'DATASETS_NAME': ['GOT10K_votval'], 'DATASETS_RATIO': [1], 'SAMPLE_PER_EPOCH': 10000}, 'SEARCH': {'NUMBER': 1, 'SIZE': 320, 'FACTOR': 5.0, 'CENTER_JITTER': 4.5, 'SCALE_JITTER': 0.5}, 'TEMPLATE': {'NUMBER': 2, 'SIZE': 128, 'FACTOR': 2.0, 'CENTER_JITTER': 0, 'SCALE_JITTER': 0}}, 'TEST': {'TEMPLATE_FACTOR': 2.0, 'TEMPLATE_SIZE': 128, 'SEARCH_FACTOR': 5.0, 'SEARCH_SIZE': 320, 'EPOCH': 50, 'UPDATE_INTERVALS': {'LASOT': [200], 'GOT10K_TEST': [200], 'TRACKINGNET': [25], 'VOT20': [10], 'VOT20LT': [100]}}}
head channel: 256
########################
torch.cuda.is_available: False
torch.cuda.device_count: 0
########################
Traceback (most recent call last):
File "" , line 1, in <module>
File "/home/guest/XieBailian/proj/stark/lib/test/vot20/stark_st101.py", line 5, in <module>
run_vot_exp("stark_st", "baseline_R101", vis=True)
File "/home/guest/XieBailian/proj/stark/lib/test/vot20/stark_vot20.py", line 67, in run_vot_exp
tracker = stark_vot20(tracker_name=tracker_name, para_name=para_name)
File "/home/guest/XieBailian/proj/stark/lib/test/vot20/stark_vot20.py", line 32, in __init__
self.tracker = tracker_info.create_tracker(params)
File "/home/guest/XieBailian/proj/stark/lib/test/evaluation/tracker.py", line 101, in create_tracker
tracker = self.tracker_class(params, self.dataset_name)
File "/home/guest/XieBailian/proj/stark/lib/test/tracker/stark_st.py", line 19, in __init__
network = build_starkst(params.cfg)
File "/home/guest/XieBailian/proj/stark/lib/models/stark/stark_st.py", line 65, in build_starkst
box_head = build_box_head(cfg)
File "/home/guest/XieBailian/proj/stark/lib/models/stark/head.py", line 441, in build_box_head
corner_head = Corner_Predictor(
File "/home/guest/XieBailian/proj/stark/lib/models/stark/head.py", line 83, in __init__
self.indice.repeat((self.feat_sz, 1))
File "/home/guest/anaconda3/envs/stark/lib/python3.8/site-packages/torch/cuda/__init__.py", line 170, in _lazy_init
torch._C._cuda_init()
RuntimeError: No CUDA GPUs are available
Process not alive anymore, unable to retrieve return code
最前面输出的是配置文件 experiments/stark_st2/baseline_R101.yaml
里面的信息,关于 cuda
的打印输出为自己添加的调试输出,从最后的报错可以看到,没有检测到可用的 GPU
,但是通过在终端中进行测试,完全没有问题。
问题主要出现在这个文件里,入口处 lib/test/vot20/stark_st101.py
。
这里修改为自己机器对应的数量,注意不是机器 GPU
的数量,比如说我用的服务器为一台,带有 3
张 GPU
,那么这里就只能填写 0
,而不是显卡的数量!!!对应的是机器的数量。
个人猜测作者使用的是分布式训练,有 8
台机器,然后同时使用。
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
修改之后的效果如下:
test config: 这里就不复制,太长了
head channel: 256
########################
torch.cuda.is_available: True
torch.cuda.device_count: 1
########################
Update interval is: [10]
Traceback (most recent call last):
File "" , line 1, in <module>
File "/home/guest/XieBailian/proj/stark/lib/test/vot20/stark_st101.py", line 5, in <module>
run_vot_exp("stark_st", "baseline_R101", vis=True)
File "/home/guest/XieBailian/proj/stark/lib/test/vot20/stark_vot20.py", line 68, in run_vot_exp
handle = vot.VOT("mask")
AttributeError: module 'vot' has no attribute 'VOT'
Process not alive anymore, unable to retrieve return code
可以看到,成功检测到了 GPU
,但是只检测到了一张,这里不是很清楚……
好了,又产生了新的 BUG
,又是开心改 BUG
的一天😶。
这个比较简单,作者写了一个 vot.py
模块,里面就有 VOT
这个类,但是由于已经安装了 ,这里截图验证下。vot-toolkit
,应该是相冲突,优先调用的是后者里面的 vot.py
模块
(更正:不是这个原因,是由于没有将该模块所在的目录添加到 如果按照之前的理解,是由于重名引起的,那么没有 sys.path
中,而 Python
解释器就是从 sys.path
按照列表的顺序引入对应的包和模块,这里只是恰好 vot-toolkit
中有 vot.py
这个模块而已,如果没有,肯定会报错。vot-toolkit/vot.py
就不会报错,而事实上并不是这样
Solution #1. 最开始的做法(有效)按照更改里面的理解,可以有三种修改的方法。
首先,来到 lib/test/vot20/stark_vot20.py
目录下,找到 vot.VOT
,然后查看 vot
定义:
而这里本来要实现的是,调用作者自己写的 lib/test/vot20/vot.py
里面的 VOT
,以实现对应的功能。
解决方法很简单,只需要正确地引入 lib/test/vot20/vot.py
模块:修改 lib/test/vot20/stark_vot20.py
vot.py
所在的目录添加进入 PYTHONPATH
(经检验,无效)
Python
中模块的调用顺序:当前执行文件的工程目录–> Python
内置模块(已安装)–>第三方模块(anaconda3/envs/env_name/sites-packages
里面),官方说明:
参考链接1:Python模块调用顺序
参考链接2:https://docs.python.org/zh-cn/3/tutorial/modules.html#the-module-search-path
参考链接3:https://www.jianshu.com/p/04701cb81e38
参考链接4:Python module & package
按照以上教程,可以输出 sys.path
进行验证,因此,也可以不用修改上述源码,通过将模块路径添加进 PYTHONPATH
。
export PYTHONPATH=${STARK_ROOT}/lib/test/vot20
Solution #3. 将 vot.py
所在目录添加到 trackers.ini
文件的 paths
中(经检验,无效)
[stark_st101] #
label = stark_st101
protocol = traxpython
command = import lib.test.vot20.stark_st101 as stark_st101
# Specify a path to trax python wrapper if it is not visible (separate by ; if using multiple paths)
paths = /home/guest/XieBailian/proj/stark/;/home/guest/XieBailian/proj/stark/lib/test/vot20
按照生成的注释说明 Specify a path to trax python wrapper if it is not visible (separate by ; if using multiple paths
,也可以验证这种做法也是有效的。
这里做个小小的总结:最开始的时候理解不到位,误打误撞就解决了,在 #1
中,我们修改的是 from lib.test.vot import VOT
,这里使用了绝对路径,由于已经在 trackers.ini
中配置了 paths=/home/guest/XieBailian/proj/stark/
,因此可以找到,所以这里的等效写法是:import lib.test.vot
。
到此,基本上就结束了,成功运行的效果图如下。
终端查看显存实时占用情况:
watch -n 0.5 -t nvidia-smi
- 参考链接1:vot-toolkit-python 工具使用说明
- 参考链接2:官方提供的一个跟踪器 NCCPython,主要用于测试环境是否有问题。
如果这个能够运行成功,而自己写的追踪器跑不起来,说明是内部代码的问题,逐步调试就可以
- 参考链接3:https://www.votchallenge.net/howto/tutorial_python.html VOT Challenge 官方说明文档
- 参考链接4:https://blog.csdn.net/weixin_40367515/article/details/123818030
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)