PaddleDetection 多目标跟踪任务二次开发指南:从数据准备到跟踪类别修改
【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection
本篇技术指南以 PaddleDetection 开源仓库中的多目标跟踪(MOT)二次开发教程为主体,围绕 ByteTrack 方案(PP-YOLOE 检测器 + BYTETracker 跟踪器)展开,系统讲解自定义数据集准备、基于 COCO 预训练权重的模型优化,以及跟踪类别修改的完整开发流程。读者读完本文后,能够掌握在产业场景中按需定制多目标跟踪模型的实操方法,包括训练命令、超参数调整与配置文件修改技巧,并可直接参考仓库中的真实配置与源码进行二次开发。
引言:多目标跟踪二次开发的核心思路
在产业落地过程中应用多目标跟踪算法,不可避免地会出现两类需求:一是希望自定义跟踪目标类型(如从行人扩展到车辆、人头等);二是对已有多目标跟踪模型进行优化,以提升特定场景下的效果。PaddleDetection 将这两种需求统一为"检测器二次开发"流程:训练 ByteTrack 本质上就是训练检测器,因此只要准备好检测标注即可开始定制化开发。
PaddleDetection 中提供了 SDE(分离式检测与嵌入)和 JDE(联合式检测与嵌入)两系列 MOT 算法,而本文涉及的 ByteTrack 属于SDE 系列,其显著优势是只需要检测框标注,不需要 ReID 标注,数据标注成本低,检测器与跟踪器可分别调优,鲁棒性较高(详见 docs/tutorials/data/PrepareMOTDataSet.md)。若数据集中只有检测框标注而没有 ReID 标注,无法使用 JDE 系列算法训练,此时 SDE 系列(ByteTrack/DeepSORT)是更合适的选择。
ByteTrack 的原始论文只支持行人单类别跟踪,而 PaddleDetection 额外支持了多类别同时跟踪(如 bytetrack_ppyoloe_ppvehicle9cls.yml 中的 9 类车辆跟踪)。从仓库中的装配配置 bytetrack_ppyoloe.yml 可以看到,ByteTrack 方案由三部分组装而成:
- detector:PP-YOLOE 检测器(配置中以
YOLOv3名称承载 PPYOLOe 检测头),负责输出每一帧的检测框; - reid:默认
None,即默认不使用 ReID 权重; - tracker:JDETracker(此处即 BYTETracker),负责跨帧关联检测框生成轨迹。
依据仓库 configs/mot/bytetrack/bytetrack_ppyoloe.yml 中的
ByteTrack配置块,跟踪器默认不依赖 ReID 模型;如需使用 ReID 权重,可参考 bytetrack_ppyoloe_pplcnet.yml 修改reid_weights字段。
一、数据准备
1.1 数据集要求
采用 ByteTrack 方案的多目标跟踪模型,其数据集只需要检测标注,不需要 ReID 标注信息,即"当成纯检测来做"即可。特别需要注意的是:
- 数据集最好是从连续视频中抽取出来的,而不是无关联的图片集合——跟踪任务依赖帧间的时序关联,连续帧数据才能让跟踪器学到有效的轨迹关联能力;
- 针对场景特点采集合适的数据,能同时提升模型效果和泛化性能。
1.2 数据标注与格式转换
二次开发首先需要针对实际场景采集数据,然后使用 Labeme、LabelImg 等标注工具标注目标检测框,并将标注结果转化为COCO或VOC数据格式。详细的标注工具与转换流程可参考 数据准备文档。
对于 MOT 任务,还可参考 PrepareMOTDataSet.md 中"SDE 数据集"一节:SDE 数据集即纯检测标注数据集,用户自定义数据集可参照 PrepareDetDataSet.md 准备。以 MOT17 为例,下载解压到dataset/mot目录后,数据集部分的配置如下:
num_classes: 1 TrainDataset: !COCODataSet dataset_dir: dataset/mot/MOT17 anno_path: annotations/train_half.json image_dir: images/train data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd'] EvalDataset: !COCODataSet dataset_dir: dataset/mot/MOT17 anno_path: annotations/val_half.json image_dir: images/train TestDataset: !ImageFolder dataset_dir: dataset/mot/MOT17 anno_path: annotations/val_half.json仓库中的 mot17.yml 正是上述结构的完整实现,它还额外定义了 MOT 评估与推理所需的EvalMOTDataset/TestMOTDataset(使用MOTImageFolder,且keep_ori_im: True),用于跟踪指标的评估与可视化输出。
二、模型优化
2.1 使用自定义数据集训练
由于 ByteTrack 方案的数据集只需检测标注,训练过程与纯检测任务完全一致。参照 MOT数据集准备 与 MOT数据集教程,可执行如下命令:
# 单卡训练 CUDA_VISIBLE_DEVICES=0 python tools/train.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml --eval --amp # 多卡训练 python -m paddle.distributed.launch --log_dir=log_dir --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/ppyoloe/ppyoloe_crn_l_300e_coco.yml --eval --amp参数说明:
-c:指定配置文件,上述命令以 PP-YOLOE-L COCO 检测配置 ppyoloe_crn_l_300e_coco.yml 为例;--eval:边训练边验证精度;--amp:开启混合精度训练,可避免精度溢出并加速训练,推荐使用 PaddlePaddle 2.2.2 及以上版本;--log_dir:多卡训练时的日志保存目录。
更详细的命令参考 30分钟快速上手PaddleDetection 与 ByteTrack 检测器配置。
需要说明的是,上述训练命令使用的是通用 COCO 检测配置;若要在 MOT 场景中直接训练 ByteTrack 的检测器,仓库提供了现成的配置,例如 ppyoloe_crn_l_36e_640x640_mot17half.yml,其训练、评估与导出命令可参考 detector/README_cn.md:
job_name=ppyoloe_crn_l_36e_640x640_mot17half config=configs/mot/bytetrack/detector/${job_name}.yml log_dir=log_dir/${job_name} # 1. training python -m paddle.distributed.launch --log_dir=${log_dir} --gpus 0,1,2,3,4,5,6,7 tools/train.py -c ${config} --eval --amp # 2. evaluation CUDA_VISIBLE_DEVICES=0 python tools/eval.py -c ${config} -o weights=output/${job_name}/model_final.pdparams # 3. export CUDA_VISIBLE_DEVICES=0 python tools/export_model.py -c ${config} -o weights=output/${job_name}/model_final.pdparams2.2 加载 COCO 模型作为预训练权重
PaddleDetection 提供的配置文件默认加载的预训练模型为ImageNet 数据集权重,仅加载到检测算法的骨干网络中。实际使用(尤其是产业落地)时,强烈建议加载 COCO 数据集训练好的权重,通常能对模型精度带来较大提升。具体操作分两步:
第一步:设置预训练权重路径
COCO 数据集训练好的模型权重均在各算法配置文件夹下。例如configs/ppyoloe下提供了 PP-YOLOE-L 的 COCO 数据集权重(ppyoloe_crn_l_300e_coco.pdparams),在配置文件中设置:
pretrain_weights: https://paddledet.bj.bcebos.com/models/ppyoloe_crn_l_300e_coco.pdparams该字段在 ppyoloe_crn_l_300e_coco.yml 中实际体现为pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/CSPResNetb_l_pretrained.pdparams(ImageNet 预训练骨干);而在 ByteTrack 装配配置 bytetrack_ppyoloe.yml 中,pretrain_weights已直接指向ppyoloe_crn_l_300e_coco.pdparams,det_weights则指向 MOT 场景训练好的检测器权重,可直接作为二次开发起点。
第二步:修改超参数
加载 COCO 预训练权重后,模型已具备较强的特征提取能力,需要相应调整学习率超参数。以 optimizer_300e.yml 为例,原配置为:
epoch: 300 LearningRate: base_lr: 0.01 schedulers: - name: CosineDecay max_epochs: 360 - name: LinearWarmup start_factor: 0. epochs: 5加载 COCO 权重后建议修改为:
epoch: 120 # 原始配置为300epoch,加载COCO权重后可以适当减少迭代轮数 LearningRate: base_lr: 0.005 # 原始配置为0.025,加载COCO权重后需要降低学习率 schedulers: - !CosineDecay max_epochs: 144 # 依据epoch数进行修改,一般为epoch数的1.2倍 - !LinearWarmup start_factor: 0. epochs: 5参数调整要点:
- epoch:COCO 权重已提供充分预训练,迭代轮数可从 300 缩减至 120 左右;
- base_lr:预训练权重下使用过大的学习率容易破坏已学特征,应从 0.01~0.025 量级降至 0.005;
- max_epochs:CosineDecay 的周期需与 epoch 匹配,一般为 epoch 数的 1.2 倍(120 × 1.2 = 144);
- LinearWarmup:
start_factor: 0.表示从 0 开始线性预热,epochs: 5表示前 5 个 epoch 完成预热,此项通常保持默认。
从源码结构看,
base_lr会经 optimizer 模块 解析并作用于动量 SGD 优化器(momentum: 0.9、L2 正则factor: 0.0005),因此微调时保持优化器类型不变、仅降学习率即可获得稳定的收敛行为。
三、跟踪类别修改
当实际使用场景的类别发生变化时(例如从单类行人跟踪改为多类车辆跟踪),需要修改数据配置文件。以 coco_detection.yml 为例:
metric: COCO num_classes: 10 # 原始类别1配置修改完成后,同样可以加载 COCO 预训练权重。PaddleDetection 支持自动加载 shape 匹配的权重:类别数变化会导致检测头输出层的权重 shape 不匹配,框架会自动忽略这些不匹配的权重,仅加载骨干与特征提取部分,因此无需其他额外修改。
3.1 单类别与多类别跟踪的配置差异
仓库中提供了单类别与多类别 ByteTrack 的对照实现,可直观看出差异:
单类别(行人):bytetrack_ppyoloe.yml 中metric: MOT、num_classes: 1,跟踪器参数针对行人设置(如vertical_ratio: 1.6,用于过滤高宽比异常的竖直条状框、min_box_area: 100)。
多类别(车辆 9 类):bytetrack_ppyoloe_ppvehicle9cls.yml 中metric: MCMOT、num_classes: 9,类别依次为 pedestrian(1)、rider(2)、car(3)、truck(4)、bus(5)、van(6)、motorcycle(7)、bicycle(8)、others(9)。同时跟踪器参数调整为min_box_area: 0、vertical_ratio: 0——因为多类别目标形状差异大,不再适用行人的竖直比例过滤策略。
3.2 多类别跟踪的推理配置
多类别 ByteTrack 没有跟踪 ground truth 标签,无法进行跟踪指标评估,因此只做跟踪预测。需修改TestMOTDataset确保路径存在,其中anno_path指向一个手写的label_list.txt,一行表示一个类别:
TestMOTDataset: !MOTImageFolder dataset_dir: dataset/mot keep_ori_im: True # set True if save visualization images or video anno_path: dataset/mot/label_list.txt # absolute pathlabel_list.txt内容示例:
pedestrian rider car truck bus van motorcycle bicycle others注意:anno_path如果写错或找不到,将默认使用 COCO 数据集 80 类的类别名。
预测多类别车辆跟踪的命令:
# 下载demo视频 wget https://bj.bcebos.com/v1/paddledet/data/mot/demo/bdd100k_demo.mp4 # 使用PPYOLOE 多类别车辆检测模型 CUDA_VISIBLE_DEVICES=1 python tools/infer_mot.py -c configs/mot/bytetrack/bytetrack_ppyoloe_ppvehicle9cls.yml --video_file=bdd100k_demo.mp4 --scaled=True --save_videos参数说明:
--scaled:模型输出结果的坐标是否已缩放回原图。若使用通用检测模型(如 PP-YOLOE)则为True;若使用 JDE 的 YOLOv3 检测模型则为False;--save_videos:保存可视化视频,同时会在{output_dir}/mot_outputs/保存可视化图片,{output_dir}可通过--output_dir设置,默认文件夹名为output;- 使用前请确保已安装 ffmpeg(Ubuntu 可用
apt-get update && apt-get install -y ffmpeg安装)。
如需更换检测器权重,可修改配置文件中的det_weights:为自定义权重路径,并同步调整数据集路径、label_list.txt和类别数。
3.3 跟踪器关键参数(以 BYTETracker 为例)
在 bytetrack_ppyoloe.yml 中,JDETracker(即 BYTETracker)的核心参数如下:
JDETracker: use_byte: True match_thres: 0.9 conf_thres: 0.2 low_conf_thres: 0.1 min_box_area: 100 vertical_ratio: 1.6 # for pedestrianuse_byte: True:启用 Byte 关联机制,同时关联高分框与低分框,通过低分框与轨迹片段的相似性恢复被遮挡目标、过滤背景框,这是 ByteTrack 的核心思想;match_thres:轨迹匹配阈值,值越高对匹配的相似度要求越严格;conf_thres:高置信度检测框阈值,高于该值的框参与第一轮匹配;low_conf_thres:低置信度检测框阈值,介于low_conf_thres与conf_thres之间的框参与第二轮 Byte 关联;min_box_area:过滤面积过小的框(行人场景通常设 100,多类别场景建议设 0);vertical_ratio:行人场景设为 1.6,用于过滤高宽比过大的竖直条状框;多类别场景应设为 0。
跟踪对检测框质量要求更高,因此 ByteTrack 配置中的 NMS 后处理也做了针对性调整(如 bytetrack_ppyoloe.yml 中score_threshold: 0.1、nms_threshold: 0.4,比纯检测任务的 0.01 / 0.6 更严格),以确保送入跟踪器的检测框具有较高的精度。
3.4 评估与部署延伸
二次开发完成后,可按如下方式验证与部署:
- 评估检测效果:使用
tools/eval.py,如CUDA_VISIBLE_DEVICES=0 python tools/eval.py -c configs/mot/bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml -o weights=...; - 评估跟踪效果:使用
tools/eval_mot.py,如CUDA_VISIBLE_DEVICES=0 python tools/eval_mot.py -c configs/mot/bytetrack/bytetrack_ppyoloe.yml --scaled=True,跟踪结果存于{output_dir}/mot_results/,每个视频序列对应一个 txt,每行信息为frame,id,x1,y1,w,h,score,-1,-1,-1; - 导出与部署:ByteTrack 的导出部署是单独导出检测模型、再组装跟踪器运行(参照 PP-Tracking)。跟踪器运行参数可在 tracker_config.yml 中调整,该文件同时提供 JDETracker、OCSORTTracker、DeepSORTTracker、BOTSORTTracker 四类跟踪器配置,可按需切换跟踪算法。
总结
PaddleDetection 的多目标跟踪二次开发是一条完整且低门槛的链路:由于 ByteTrack 方案训练等价于纯检测训练,只需准备带检测标注的连续帧数据集即可起步;随后通过加载 COCO 预训练权重并适当降低学习率、缩减迭代轮数,可在少量数据上快速收敛;最后通过修改num_classes、metric与数据集配置,即可将模型从单类行人跟踪平滑迁移到任意多类别跟踪场景。整个过程在仓库中均有对应的完整配置可供参考与复制,开发者可以在此基础上按需调整跟踪器参数,完成从数据、训练、评估到部署的端到端定制。
【免费下载链接】PaddleDetectionObject Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleDetection
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考