快捷键

学习训练和测试

训练

本节将展示如何在支持的数据集上训练现有模型。以下训练环境得到支持

  • CPU

  • 单 GPU

  • 单节点多 GPU

  • 多节点

您也可以使用 Slurm 管理作业。

重要

  • 您可以通过修改 train_cfg 来更改训练过程中的评估间隔,例如 train_cfg = dict(val_interval=10)。这意味着每 10 个 epoch 评估一次模型。

  • 所有配置文件中的默认学习率适用于 8 个 GPU。根据 线性缩放规则,如果您使用不同的 GPU 或每个 GPU 的图像数量不同,则需要将学习率设置为与批大小成比例,例如 8 个 GPU * 1 个图像/GPU 使用 lr=0.01,而 16 个 GPU * 2 个图像/GPU 使用 lr=0.04

  • 在训练期间,日志文件和检查点将保存到工作目录,工作目录由 CLI 参数 --work-dir 指定。默认情况下,它使用 ./work_dirs/CONFIG_NAME

  • 如果您想要混合精度训练,只需指定 CLI 参数 --amp

1. 在 CPU 上训练

模型默认放在 cuda 设备上。只有在没有 cuda 设备的情况下,模型才会放在 cpu 上。因此,如果您想要在 CPU 上训练模型,您需要先 export CUDA_VISIBLE_DEVICES=-1 来禁用 GPU 可见性。更多详情请参见 MMEngine

CUDA_VISIBLE_DEVICES=-1 python tools/train.py ${CONFIG_FILE} [optional arguments]

在 CPU 上训练 MOT 模型 QDTrack 的示例

CUDA_VISIBLE_DEVICES=-1 python tools/train.py configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py

2. 在单个 GPU 上训练

如果您想要在单个 GPU 上训练模型,您可以直接使用 tools/train.py ,如下所示。

python tools/train.py ${CONFIG_FILE} [optional arguments]

您可以使用 export CUDA_VISIBLE_DEVICES=$GPU_ID 来选择 GPU。

在单个 GPU 上训练 MOT 模型 QDTrack 的示例

CUDA_VISIBLE_DEVICES=2 python tools/train.py configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py

3. 在单个节点上训练多个 GPU

我们提供 tools/dist_train.sh 来启动在多个 GPU 上的训练。基本用法如下。

bash ./tools/dist_train.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]

如果您想在一台机器上启动多个作业,例如在具有 8 个 GPU 的机器上启动 2 个 4-GPU 训练作业,则需要为每个作业指定不同的端口(默认值为 29500)以避免通信冲突。

例如,您可以在命令中设置端口,如下所示。

CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG_FILE} 4
CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG_FILE} 4

在单个节点上训练多个 GPU 的 MOT 模型 QDTrack 的示例

bash ./tools/dist_train.sh configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py 8

4. 在多个节点上训练

如果您使用以太网连接的多台机器启动,则只需运行以下命令即可

在第一台机器上

NNODES=2 NODE_RANK=0 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR bash tools/dist_train.sh $CONFIG $GPUS

在第二台机器上

NNODES=2 NODE_RANK=1 PORT=$MASTER_PORT MASTER_ADDR=$MASTER_ADDR bash tools/dist_train.sh $CONFIG $GPUS

如果您没有高速网络(如 InfiniBand),通常会很慢。

5. 使用 Slurm 训练

Slurm 是计算集群的良好作业调度系统。在由 Slurm 管理的集群上,您可以使用 slurm_train.sh 来生成训练作业。它支持单节点和多节点训练。

基本用法如下。

bash ./tools/slurm_train.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} ${WORK_DIR} ${GPUS}

使用 Slurm 训练 MOT 模型 QDTrack 的示例

PORT=29501 \
GPUS_PER_NODE=8 \
SRUN_ARGS="--quotatype=reserved" \
bash ./tools/slurm_train.sh \
mypartition \
mottrack
configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py
./work_dirs/QDTrack \
8

测试

本节将展示如何在支持的数据集上测试现有模型。以下测试环境得到支持

  • CPU

  • 单 GPU

  • 单节点多 GPU

  • 多节点

您也可以使用 Slurm 管理作业。

重要

  • 在 MOT 中,一些算法,如 DeepSORTSORTStrongSORT 需要分别加载 reiddetector 的权重。其他算法,如 ByteTrackOCSORTQDTrack 则不需要。因此,我们提供 --checkpoint--detector--reid 来加载权重。

  • 我们提供两种评估和测试模型的方法:基于视频的测试和基于图像的测试。一些算法,如 StrongSORTMask2former 仅支持基于视频的测试。如果您的 GPU 内存无法容纳整个视频,您可以通过设置采样器类型来切换测试方式。例如:基于视频的测试:sampler=dict(type='DefaultSampler', shuffle=False, round_up=False) 基于图像的测试:sampler=dict(type='TrackImgSampler')

  • 您可以通过修改评估器中的键 outfile_prefix 来设置结果保存路径。例如,val_evaluator = dict(outfile_prefix='results/sort_mot17')。否则,将创建一个临时文件,并在评估后将其删除。

  • 如果您只想获取格式化的结果,而无需评估,则可以设置 format_only=True。例如,test_evaluator = dict(type='MOTChallengeMetric', metric=['HOTA', 'CLEAR', 'Identity'], outfile_prefix='sort_mot17_results', format_only=True)

1. 在 CPU 上测试

模型默认放在 cuda 设备上。只有在没有 cuda 设备的情况下,模型才会放在 cpu 上。因此,如果您想要在 CPU 上测试模型,您需要先 export CUDA_VISIBLE_DEVICES=-1 来禁用 GPU 可见性。更多详情请参见 MMEngine

CUDA_VISIBLE_DEVICES=-1 python tools/test_tracking.py ${CONFIG_FILE} [optional arguments]

在 CPU 上测试 MOT 模型 SORT 的示例

CUDA_VISIBLE_DEVICES=-1 python tools/test_tracking.py configs/sort/sort_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py --detector ${CHECKPOINT_FILE}

2. 在单个 GPU 上测试

如果您想要在单个 GPU 上测试模型,您可以直接使用 tools/test_tracking.py ,如下所示。

python tools/test_tracking.py ${CONFIG_FILE} [optional arguments]

您可以使用 export CUDA_VISIBLE_DEVICES=$GPU_ID 来选择 GPU。

在单个 GPU 上测试 MOT 模型 QDTrack 的示例

CUDA_VISIBLE_DEVICES=2 python tools/test_tracking.py configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py --detector ${CHECKPOINT_FILE}

3. 在单个节点上测试多个 GPU

我们提供 tools/dist_test_tracking.sh 来启动在多个 GPU 上的测试。基本用法如下。

bash ./tools/dist_test_tracking.sh ${CONFIG_FILE} ${GPU_NUM} [optional arguments]

在单个节点上测试多个 GPU 的 MOT 模型 DeepSort 的示例

bash ./tools/dist_test_tracking.sh configs/qdtrack/qdtrack_faster-rcnn_r50_fpn_8xb2-4e_mot17halftrain_test-mot17halfval.py 8 --detector ${CHECKPOINT_FILE} --reid ${CHECKPOINT_FILE}

4. 在多个节点上测试

您可以在多个节点上测试,这与“在多个节点上训练”类似。

5. 使用 Slurm 测试

在由 Slurm 管理的集群上,您可以使用 slurm_test_tracking.sh 来生成测试作业。它支持单节点和多节点测试。

基本用法如下。

[GPUS=${GPUS}] bash tools/slurm_test_tracking.sh ${PARTITION} ${JOB_NAME} ${CONFIG_FILE} [optional arguments]

使用 Slurm 测试 VIS 模型 Mask2former 的示例

GPUS=8
bash tools/slurm_test_tracking.sh \
mypartition \
vis \
configs/mask2former_vis/mask2former_r50_8xb2-8e_youtubevis2021.py \
--checkpoint ${CHECKPOINT_FILE}