> 文章列表 > OSTrack的一些代码执行命令讲解

OSTrack的一些代码执行命令讲解

OSTrack的一些代码执行命令讲解

一些单目标跟踪算法的代码执行命令非常相似,例如Stark、OSTrack、CSWinTT、AiATrack等,因此对一些命令进行讲解,有助于提升代码研究效率。下面以OSTrack为例进行讲解。

执行如下命令可以生成路径文件,分别会在OSTrack/lib/train/admin目录和OSTrack/lib/test/evaluation目录下生成local.py文件,里面是各种路径的默认设置。而后想配置自己的路径也只需在这两个目录中的local.py文件中进行修改即可。

python tracking/create_default_local_file.py --workspace_dir . --data_dir ./data --save_dir ./output

训练数据集放在OSTrack/tracking/data目录中,存放格式如下:

OSTracktrackingdatalasotairplanebasketballbear...got10ktesttrainvalcocoannotationsimagestrackingnetTRAIN_0TRAIN_1...TRAIN_11TEST

下载预训练权重文件MAE ViT-Base weights,并将其放在OSTrack/pretrained_models目录中。

如果想在本地编译器进行train的运行测试,那么需要在lib/train/run_training.py文件中进行运行,其中的参数设置如下:

--script ostrack
--config vitb_256_mae_ce_32x4_ep300  # 这个可以在OSTrack/experiments/ostrack目录中进行相应选择 
--save_dir ./output
--use_lmdb 0
--script_prv None
--config_prv baseline
--distill 0
--script_teacher None
--config_teacher None
--use_wandb 0  # 值为1时,可以使用wandb来记录详细的训练日志;不想用wandb则可以置成0

使用如下命令行进行正式训练,如果是单卡训练,需要设置参数–mode single,wandb可以设置成0:

python tracking/train.py --script ostrack --config vitb_256_mae_ce_32x4_ep300 --save_dir ./output --mode multiple --nproc_per_node 4 --use_wandb 1

如果只想用部分数据集来训练模型,例如只用GOT-10k进行训练,则需要在相应配置文件中注释掉其它数据集。配置文件为OSTrack/experiments/ostrack/vitb_256_mae_ce_32x4_ep300.yaml。

DATA:......TRAIN:DATASETS_NAME:
# 		 - LASOT- GOT10K_vottrain
#		 - COCO17
#		 - TRACKINGNET

可能出现的问题及解决办法:

ValueError: Caught ValueError in DataLoader worker process 0.  # 可以将yaml配置文件中TRAIN的NUM_WORKER设置成0
ValueError: The number of weights does not match the population  # 可能是因为只用了部分数据集进行训练导致的,可以将dataset = random.choices(self.datasets, self.p_datasets)[0]替换成dataset = self.datasets[0]
FileNotFoundError: [Errno 2] No such file or directory: '/OSTrack/tracking/data/got10k/train/GOT-10k_Train_008341/groundtruth.txt'  # 将train文件夹中所有split目录下的文件放到train下即可
RuntimeError: CUDA out of memory. Tried to allocate 24.00 MiB (GPU 0; 10.76 GiB total capacity; 9.68 GiB already allocated; 13.56 MiB free; 9.74 GiB reserved in total by PyTorch)  # 可以将yaml配置文件中TRAIN的BATCH_SIZE调小

在以下地方会打印日志:

# OSTrack/lib/train/run_training.py  line--42
script_name: ostrack.py  config_name: vitb_256_mae_ce_32x4_ep300.yaml
# OSTrack/lib/train/train_script.py  line--32
New configuration is shown below.
MODEL configuration: {'PRETRAIN_FILE': 'mae_pretrain_vit_base.pth', 'EXTRA_MERGER': False, 'RETURN_INTER': False, 'RETURN_STAGES': [], 'BACKBONE': {'TYPE': 'vit_base_patch16_224_ce', 'STRIDE': 16, 'MID_PE': False, 'SEP_SEG': False, 'CAT_MODE': 'direct', 'MERGE_LAYER': 0, 'ADD_CLS_TOKEN': False, 'CLS_TOKEN_USE_MODE': 'ignore', 'CE_LOC': [3, 6, 9], 'CE_KEEP_RATIO': [0.7, 0.7, 0.7], 'CE_TEMPLATE_RANGE': 'CTR_POINT'}, 'HEAD': {'TYPE': 'CENTER', 'NUM_CHANNELS': 256}}
TRAIN configuration: {'LR': 0.0004, 'WEIGHT_DECAY': 0.0001, 'EPOCH': 300, 'LR_DROP_EPOCH': 240, 'BATCH_SIZE': 4, 'NUM_WORKER': 0, 'OPTIMIZER': 'ADAMW', 'BACKBONE_MULTIPLIER': 0.1, 'GIOU_WEIGHT': 2.0, 'L1_WEIGHT': 5.0, 'FREEZE_LAYERS': [0], 'PRINT_INTERVAL': 50, 'VAL_EPOCH_INTERVAL': 20, 'GRAD_CLIP_NORM': 0.1, 'AMP': False, 'CE_START_EPOCH': 20, 'CE_WARM_EPOCH': 80, 'DROP_PATH_RATE': 0.1, 'SCHEDULER': {'TYPE': 'step', 'DECAY_RATE': 0.1}}
DATA configuration: {'SAMPLER_MODE': 'causal', 'MEAN': [0.485, 0.456, 0.406], 'STD': [0.229, 0.224, 0.225], 'MAX_SAMPLE_INTERVAL': 200, 'TRAIN': {'DATASETS_NAME': ['GOT10K_vottrain'], 'DATASETS_RATIO': [1, 1, 1, 1], 'SAMPLE_PER_EPOCH': 60000}, 'VAL': {'DATASETS_NAME': ['GOT10K_votval'], 'DATASETS_RATIO': [1], 'SAMPLE_PER_EPOCH': 10000}, 'SEARCH': {'SIZE': 256, 'FACTOR': 4.0, 'CENTER_JITTER': 3, 'SCALE_JITTER': 0.25, 'NUMBER': 1}, 'TEMPLATE': {'NUMBER': 1, 'SIZE': 128, 'FACTOR': 2.0, 'CENTER_JITTER': 0, 'SCALE_JITTER': 0}}
# OSTrack/lib/train/trainers/base_trainer.py  line--174
No matching checkpoint file found
# OSTrack/lib/train/trainers/ltr_trainer.py  line--112
[train: 1, 50 / 15000] FPS: 5.9 (5.0)  ,  DataTime: 0.508 (0.002)  ,  ForwardTime: 0.171  ,  TotalTime: 0.681  ,  Loss/total: 50.35498  ,  Loss/giou: 1.22484  ,  Loss/l1: 0.28600  ,  Loss/location: 46.47531  ,  IoU: 0.07033

以下地方是模型的一些入口:

# OSTrack/lib/train/train_script.py  line--48
# 建立dataloader;数据的加载与Dataloader和Dataset的机制有关,自己定义导入数据时需要继承Dataset父类,并重写__len__和__getitem__方法,这一块代码实现主要在OSTrack/lib/train/data/sampler.py中
loader_train, loader_val = build_dataloaders(cfg, settings)
# OSTrack/lib/train/train_script.py  line--55
# 创建模型,这里面包括预训练权重的加载和整个模型的加载
net = build_ostrack(cfg)
# OSTrack/lib/train/train_script.py  line--71
# 加载损失和优化
actor这一步就是在执行训练过程
# OSTrack/lib/train/train_script.py  line--88
# train过程开始
trainer.train(cfg.TRAIN.EPOCH, load_latest=True, fail_safe=True)
# OSTrack/lib/train/actors/ostrack.py  line--69  数据送入模型
# OSTrack/lib/models/ostrack/ostrack.py  line--40  这里才算是数据送入模型的开始
# OSTrack/lib/train/actors/ostrack.py  line--31
# 前向传播过程
out_dict = self.forward_pass(data)
# OSTrack/lib/train/actors/ostrack.py  line--34
# 计算loss
loss, status = self.compute_losses(out_dict, data)
# OSTrack/lib/train/trainers/base_trainer.py  line--169
断点续训
# OSTrack/lib/train/data/sampler.py  line--156
# 建立一个data训练单位
data = TensorDict({'template_images': template_frames,'template_anno': template_anno['bbox'],'template_masks': template_masks,'search_images': search_frames,'search_anno': search_anno['bbox'],'search_masks': search_masks,'dataset': dataset.get_name(),'test_class': meta_obj_test.get('object_class_name')})
# OSTrack/lib/train/data/processing_utils.py  line--68
# 裁剪的区域是根据bbox来的,将输入resize为128×128
im_crop_padded = cv.resize(im_crop_padded, (output_sz, output_sz))
数据的加载过程都是在OSTrack/lib/train/data/sampler.py中实现的,它重写了Dataset类中的方法,所以Dataloader加载导入输入数据是从这里进行的。
而OSTrack/lib/train/data/processing.py中的内容是对原始的输入数据进行处理,在这里面包括裁剪、数据增强、归一化等操作。