PySOT调试
零、准备工作
文件下载:
注:详细见代码中的ReadMe部分,另外,以上文件除了数据集,我都保存至百度云盘 提取码:c215
数据集处理:
以VID数据集为例,将文件名进行对应的修改,并将VID/val移动到train的文件夹下。
# 在VID数据集下
Annotations/VID/train/ILSVRC2015_VID_train_0000 改为Annotations/VID/train/a
Annotations/VID/train/ILSVRC2015_VID_train_0001 改为Annotations/VID/train/b
Annotations/VID/train/ILSVRC2015_VID_train_0002 改为Annotations/VID/train/c
Annotations/VID/train/ILSVRC2015_VID_train_0003 改为Annotations/VID/train/d
Annotations/VID/val 修改并移动Annotations/VID/train/e
Data/VID/train/ILSVRC2015_VID_train_0000 改为Data/VID/train/a
Data/VID/train/ILSVRC2015_VID_train_0001 改为Data/VID/train/b
Data/VID/train/ILSVRC2015_VID_train_0002 改为Data/VID/train/c
Data/VID/train/ILSVRC2015_VID_train_0003 改为Data/VID/train/d
Data/VID/val 修改并移动Data/VID/train/e
准备好数据集后,依次运行training_dataset/vid下的python
文件:
parse_vid.py
// 注意修改VID文件路径 VID_base_path
,另外若不修改保存位置,则对应的文件都保存在parse_vid.py
所在文件夹下。
par_crop.py
// 进行图片的剪切,若使用服务器进行多进程操作,会很快。我在本地剪切完数据大概用了300min,另外,生成的内容大概有72G,在当前文件路径下的crop511文件夹下,所以要注意适当更改路径。
gen_json.py
// 生成相应的JSON
文件,同样也是注意读取和保存文件路径。
在数据集处理过程中需要注意的是,在windows下和Linux的路径表示和os.path.join
方法是不同的,因此在对文件名称进行路径分割是不同的,在Linux下路径使用./
进行划分,因此在parse_vid.py
的第44行使用的是/
进行划分。在WIndows下使用.\
或者是//
进行路径的划分,因此在进行路径分割时要修改对应的分割标志。路径分割不对时会导致第三步生成的JSON文件存在问题,以至于在train时加载数据过程中dataset.py
的第45行出错has no frames
。
一、使用PySOT进行训练
- 修改pysot/core/config.py文件
如果是对单个数据集进行训练,将DATASET.NAMES修改为单个数据集,同时将暂不使用的数据集的配置注释掉,如单独使用VID数据集时修改为如下:
__C.DATASET.NAMES = ['VID']
__C.DATASET.VID = CN()
# __C.DATASET.VID.ROOT = 'training_dataset/vid/crop511'
# __C.DATASET.VID.ANNO = 'training_dataset/vid/train.json'
# 路径修改为
__C.DATASET.VID.ROOT = '/home/user2/Documents/dataset/ILSVRC2015/croped'
__C.DATASET.VID.ANNO = '/home/user2/Documents/dataset/ILSVRC2015/train.json'
__C.DATASET.VID.FRAME_RANGE = 100
__C.DATASET.VID.NUM_USE = 100000 # repeat until reach NUM_USE
# __C.DATASET.YOUTUBEBB = CN()
# __C.DATASET.YOUTUBEBB.ROOT = 'training_dataset/yt_bb/crop511'
# __C.DATASET.YOUTUBEBB.ANNO = 'training_dataset/yt_bb/train.json'
# __C.DATASET.YOUTUBEBB.FRAME_RANGE = 3
# __C.DATASET.YOUTUBEBB.NUM_USE = -1 # use all not repeat
# __C.DATASET.COCO = CN()
# __C.DATASET.COCO.ROOT = 'training_dataset/coco/crop511'
# __C.DATASET.COCO.ANNO = 'training_dataset/coco/train2017.json'
# __C.DATASET.COCO.FRAME_RANGE = 1
# __C.DATASET.COCO.NUM_USE = -1
# __C.DATASET.DET = CN()
# __C.DATASET.DET.ROOT = 'training_dataset/det/crop511'
# __C.DATASET.DET.ANNO = 'training_dataset/det/train.json'
# __C.DATASET.DET.FRAME_RANGE = 1
# __C.DATASET.DET.NUM_USE = -1
- 修改experiments/./config.yaml
在训练过程中,若需要加入预训练模型,则在对应的实验文件夹下的config.yaml文件,将PRETRAINED后面参数修改为存放预训练模型的路径。
注:对于各个实验文件夹alex表示使用AlexNet
,r50_lxyz表示使用ResNet50
网络的不同阶段的输出,mobilev2表示使用MobileNetV2
。dwxcorr表示逐通道的深度互相关。otb代表OTB
数据集,lt表示VOT long-term tracking challenge
。不带后缀的为VOT short-term tracking challenge
。
- 训练
将config.yaml文件路径添加到train.py代码中38行,修改—cfg的默认参数。在config.yaml文件中:
RPN:
TYPE:'DepthwiseRPN' # SiamRPN
TYPE:'MultiRPN' # SiamRPN++
MASK:
MASK:True # SiamMASK
- 对于多卡和单卡训练
这块参考作者的说明文档,我是用的单卡训练。
二、使用PySOT进行测试与评估
准备OTB和VOT数据集:
JSON文件:百度云盘
我将对应的处理好的数据集保存在百度云盘中:
VOT2018 提取码:yo34
OTB100(OTB2015) 提取码:j6sy
- OTB数据集
需要将CVRP13.json,OTB100.json,OTB50.json文件放在OTB数据集下。此外,需要将Jogging文件复制为Jogging-1和Jogging-2,将Skating2复制为Skating2-1和Skating2-2。文件夹架构如下:
| -- OTB100/
| -- Basketball
| ......
| -- Woman
| -- OTB100.json
| -- OTB50.json
| -- CVPR13.json
- VOT数据集
将VOT2018.json文件放在VOT2018文件夹下,整体文件夹内容如下:
|--VOT2018/
|--annotions
|--ants1
|--color
|--00000...jpg
...
|--groundtruth.txt
...
|--ants3
...
|--zebrafist1
|--VOT2018.json
测试:
tools/test.py
--dataset # 'OTB100'或'VOT2018'
--config # 存放yaml文件的路径
--snapshot # 存放训练好的模型的路径
dataset_root # 确认对应数据集的路径
确认好以上文件的路径,然后运行基本上没什么问题。
测试OTB100:
测试VOT2018:
测试完成之后,默认在tools文件夹下生成一个result文件夹,下面存放在不同测试集上的测试结果:
评估:
tools/eval.py
--tracker_path # 即上面生成result的路径
--dataset # 'OTB100'或'VOT2018'
--tracker_prefix # 'model'
root # 为VOT2018或OTB2015数据集所在的文件夹路径
确认以上路径后,运行即可。
SiamRPN++在OTB100下评估结果:
SiamRPN++在VOT2018下评估结果:
三、使用多卡训练
最近想尝试多卡训练,参考作者给出的教程,我教研室的服务器是一台机器4张RTX2080Ti的配置,其中课题组同学用了两张,因此只剩下两张卡,所以我进行多卡训练时依次使用以下命令:
# step1:
conda activate pysot # 激活你的环境
# step2:
export PYTHONPATH=[your code path]:$PYTHONPATH # 写入你的code路径放入系统路径中
# step3:
cd experiments/siamrpn_r50_l234_dwxcorr_8gpu # 进入该文件夹下
# step4:
CUDA_VISIBLE_DEVICES=2,3 python -m torch.distributed.launch --nproc_per_node=2 --master_port=2333 ../../tools/train.py --cfg config.yaml
# 设置可用的显卡 我可用的显卡号为2和3,对应后面也改为2,然后就可以进行训练了
目前已经将PySOT的代码调通,并可以进行训练。
附:
PySOT代码调试起来比较简单,我一开始使用的是Window系统,所以很多路径问题得注意。还有就是对数据的预处理部分,默认生成的数据是在当前的training_dataset下具体数据集名称的文件夹下,导致整个工程很大,所以我对数据集的保存位置进行了修改。在服务器有空余的显卡后,我又将程序同步到服务器,在本地使用Pycharm进行远程调试,并将文件的路径做了相应的修改,因此很快就调通了。
按照作者给出的模型,最后评估的结果和文章上给出的结果还是存在一定的差距,目前这是比较困惑我的地方。