一些单目标跟踪算法的代码执行命令非常相似,例如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目录中,存放格式如下:
OSTracktracking data lasot airplane basketball bear ... got10k test train val coco annotations images trackingnet TRAIN_0 TRAIN_1 ... TRAIN_11 TEST
下载预训练权重文件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设置成0ValueError: 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--42script_name: ostrack.py config_name: vitb_256_mae_ce_32x4_ep300.yaml
# OSTrack/lib/train/train_script.py line--32New 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--174No 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# 计算lossloss, 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×128im_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中的内容是对原始的输入数据进行处理,在这里面包括裁剪、数据增强、归一化等操作。