news 2026/9/22 9:21:51

PaddleDetection 中 BoT-SORT 多目标跟踪实战:从 BOTSORTTracker 配置到训练、评估与部署全流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PaddleDetection 中 BoT-SORT 多目标跟踪实战:从 BOTSORTTracker 配置到训练、评估与部署全流程

PaddleDetection 中 BoT-SORT 多目标跟踪实战:从 BOTSORTTracker 配置到训练、评估与部署全流程

【免费下载链接】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

BoT-SORT(Robust Associations Multi-Pedestrian Tracking)是一种以高精度检测器为核心、结合相机运动补偿(CMC)与两阶段关联策略的多目标跟踪(MOT)方案。本指南围绕 PaddleDetection 仓库中 configs/mot/botsort/README_cn.md 展开,系统讲解 BoT-SORT 在 PP-YOLOE 检测器上的组装配置、MOT-17 half 数据集上的精度表现,以及从检测器训练、跟踪评估、模型导出到 Python 部署推理的完整实战流程。读完本文,你将掌握BOTSORTTracker的每个配置参数含义、两条评估链路(检测与跟踪)的区别与用法,并能独立搭建一套可运行的 BoT-SORT 行人跟踪系统。

简介:什么是 BoT-SORT

BoT-SORT(BoT-SORT: Robust Associations Multi-Pedestrian Tracking)是 2022 年提出的一种基于检测的多目标跟踪算法,核心思想是在 ByteTrack 的两阶段关联框架之上引入两项增强:

  1. 相机运动补偿(Camera Motion Compensation, CMC):通过全局运动估计将历史轨迹坐标对齐到当前帧,缓解运动相机场景下的 ID 切换;
  2. 更高质量的检测框与更优的关联度量:对检测器的 NMS 阈值进行针对性收紧,并利用卡尔曼滤波对目标状态(位置、宽高比、速度)进行预测与更新。

在 PaddleDetection 中,BoT-SORT 被定位为一种"组装式"跟踪方案:训练阶段只训练独立的检测器,推理阶段再将检测器输出接入BOTSORTTracker组装成完整跟踪器,用于评估 MOT 指标或部署上线。它同时也是 PP-Human、PP-Vehicle 等 Pipeline 分析项目跟踪方向的主要方案。

论文引用:Aharon, Nir et al. "BoT-SORT: Robust Associations Multi-Pedestrian Tracking", arXiv:2206.14651(完整 BibTeX 见文末)。

模型库与精度表现

仓库在 configs/mot/botsort 目录下提供了以 PP-YOLOE-l 为检测器的 BoT-SORT 组装配置,其在MOT-17 half Val Set上的结果如下:

检测训练数据集检测器输入尺度检测 mAPMOTAIDF1配置文件
MOT-17 half trainPP-YOLOE-l640x64052.755.564.2botsort_ppyoloe.yml

注意要点:

  • 模型权重下载链接位于配置文件的det_weights字段中,运行验证命令时脚本会自动下载,无需手动准备权重。
  • MOT17-half train由 MOT17 train 序列(共 7 个视频)每个视频的前一半帧的图片与标注组成;验证精度时使用MOT17-half val(每个视频的后一半帧)。数据集可从仓库提供的下载地址获取后解压至dataset/mot/目录下。
  • 由于训练数据集、输入尺度、训练 epoch 数、NMS 阈值设置等不同均会导致模型精度与性能的差异,请根据自身需求适配。

配置文件深度解析

BoT-SORT 的跟踪评估配置 botsort_ppyoloe.yml 是一个"组装配置"(assembled config),通过_BASE_继承检测器、数据集与 reader 三个子配置:

_BASE_: [ '../bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml', '../bytetrack/_base_/mot17.yml', '../bytetrack/_base_/ppyoloe_mot_reader_640x640.yml' ] weights: output/botsort_ppyoloe/model_final log_iter: 20 snapshot_epoch: 2 metric: MOT # eval/infer 模式;设为 'COCO' 则为训练模式 num_classes: 1 architecture: ByteTrack pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/ppyoloe_crn_l_300e_coco.pdparams ByteTrack: detector: YOLOv3 # 实际为 PP-YOLOE 检测器 reid: None # BoT-SORT 不需要 ReID 模型 tracker: BOTSORTTracker det_weights: https://bj.bcebos.com/v1/paddledet/models/mot/ppyoloe_crn_l_36e_640x640_mot17half.pdparams reid_weights: None

检测器部分:为跟踪收紧的 NMS

配置中metric: MOT决定了该配置用于跟踪评估/推理;若要切换回纯检测训练模式,将其改为COCO即可。检测器部分沿用了 PP-YOLOE 结构(CSPResNet主干 +CustomCSPPAN颈部 +PPYOLOEHead),其中注释明确说明:

Tracking requires higher quality boxes, so NMS score_threshold will be higher

PPYOLOEHead: fpn_strides: [32, 16, 8] grid_cell_scale: 5.0 grid_cell_offset: 0.5 static_assigner_epoch: -1 # 100 use_varifocal_loss: True loss_weight: {class: 1.0, iou: 2.5, dfl: 0.5} static_assigner: name: ATSSAssigner topk: 9 assigner: name: TaskAlignedAssigner topk: 13 alpha: 1.0 beta: 6.0 nms: name: MultiClassNMS nms_top_k: 1000 keep_top_k: 100 score_threshold: 0.1 # 原检测器为 0.01 nms_threshold: 0.4 # 原检测器为 0.6

对比 ppyoloe_crn_l_36e_640x640_mot17half.yml 中的原始检测器配置可以发现:跟踪版配置将 NMS 的score_threshold从 0.01 提升到 0.1、nms_threshold从 0.6 收紧到 0.4。这是因为跟踪关联对边界框质量敏感:更严格的 NMS 过滤掉低质量、高重叠的重复框,减少误关联,是 BoT-SORT 获得稳健关联的前提。

跟踪器部分:BOTSORTTracker 参数

BOTSORTTracker: track_high_thresh: 0.3 track_low_thresh: 0.2 new_track_thresh: 0.4 match_thresh: 0.7 track_buffer: 30 min_box_area: 0 camera_motion: False cmc_method: 'sparseOptFlow' # 仅当 camera_motion 为 True 时生效 # 可选:sparseOptFlow | files (Vidstab GMC) | orb | ecc

各参数含义(与 botsort_tracker.py 中BOTSORTTracker.__init__的默认值一一对应):

参数默认值含义
track_high_thresh0.3高分检测框阈值,用于第一阶段关联
track_low_thresh0.2低分检测框过滤阈值,低于此分数的检测被丢弃
new_track_thresh0.4新建轨迹所需的最低检测分数
match_thresh0.7关联(IoU 匹配)阈值
track_buffer30轨迹保留帧数;buffer_size = int(frame_rate / 30.0 * track_buffer),即按帧率折算
min_box_area0保留的最小检测框面积,用于过滤过小目标
camera_motionFalse是否启用相机运动补偿(CMC)
cmc_methodsparseOptFlow相机运动估计方法:sparseOptFlow(稀疏光流)、files(读取 Vidstab GMC 文件)、orb(ORB 特征)、ecc(ECC 变换)

数据集部分:MOT 评估与推理

EvalMOTDataset: !MOTImageFolder dataset_dir: dataset/mot data_root: MOT17/images/half keep_ori_im: True # DeepSORT 和 ByteTrack 中均设为 True TestMOTDataset: !MOTImageFolder dataset_dir: dataset/mot keep_ori_im: True # 如需保存可视化图片或视频须设为 True

keep_ori_im: True表示保留原始尺寸图像——评估跟踪效果需要基于原图坐标计算 MOTA/IDF1,同时保存可视化结果也依赖它。数据集目录结构要求为dataset/mot/MOT17/images/half(对应 mot17.yml 中训练的MOT17/images/train)。

快速开始:完整实战流程

1. 训练检测器

BoT-SORT 的训练即训练检测器。使用 ppyoloe_crn_l_36e_640x640_mot17half.yml 一键式启动训练与评估:

# 单卡训练 CUDA_VISIBLE_DEVICES=0 python tools/train.py -c configs/mot/bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml --eval --amp # 多卡训练 python -m paddle.distributed.launch --log_dir=ppyoloe --gpus 0,1,2,3,4,5,6,7 tools/train.py -c configs/mot/bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml --eval --amp

该检测器配置在 PP-YOLOE-l 基础上做了 MOT 适配:epoch: 36的微调 schedule(CosineDecay + LinearWarmup)、num_classes: 1(仅行人单类)、批量大小 8,并开启use_ema: true指数滑动平均提升稳定性。

2. 评估

2.1 评估检测效果——使用tools/eval.py

CUDA_VISIBLE_DEVICES=0 python tools/eval.py -c configs/mot/bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml

2.2 评估跟踪效果——使用tools/eval_mot.py

CUDA_VISIBLE_DEVICES=0 python tools/eval_mot.py -c configs/mot/botsort/botsort_ppyoloe.yml --scaled=True

注意:

  • 评估检测使用tools/eval.py,评估跟踪使用tools/eval_mot.py,两者不可混用;跟踪评估时会自动加载det_weights指定的检测权重。
  • --scaled表示检测模型输出的坐标是否已缩放回原图:若检测模型是 JDE YOLOv3 则为False,若使用通用检测模型(如 PP-YOLOE)则为True,默认值为False(见 eval_mot.py 中的参数定义)。
  • 跟踪结果会保存在{output_dir}/mot_results/中({output_dir}通过--output_dir设置,默认output),每个视频序列对应一个 txt,每行格式为frame,id,x1,y1,w,h,score,-1,-1,-1

3. 导出预测模型

BoT-SORT 的导出部署是单独导出检测模型,再组装跟踪器运行的:

python tools/export_model.py -c configs/mot/bytetrack/detector/ppyoloe_crn_l_36e_640x640_mot17half.yml --output_dir=output_inference -o weights=https://bj.bcebos.com/v1/paddledet/models/mot/ppyoloe_crn_l_36e_640x640_mot17half.pdparams

4. 用导出的模型基于 Python 预测

# 下载 demo 视频 wget https://bj.bcebos.com/v1/paddledet/data/mot/demo/mot17_demo.mp4 CUDA_VISIBLE_DEVICES=0 python deploy/pptracking/python/mot_sde_infer.py --model_dir=output_inference/ppyoloe_crn_l_36e_640x640_mot17half --tracker_config=deploy/pptracking/python/tracker_config.yml --video_file=mot17_demo.mp4 --device=GPU --threshold=0.5

注意:

  • 运行前需手动修改 tracker_config.yml 中的跟踪器类型为type: BOTSORTTracker(该文件同时预置了JDETrackerOCSORTTrackerDeepSORTTrackerBOTSORTTracker四套参数,其中BOTSORTTracker参数与配置文件中的一致,可用于多方案对比)。
  • 跟踪模型针对视频进行预测,不支持单张图预测。默认保存跟踪结果可视化后的视频;可添加--save_mot_txts(每个视频保存一个 txt)、--save_mot_txt_per_img(每张图片保存一个 txt)或--save_images(保存跟踪结果可视化图片)。
  • 跟踪结果 txt 每行格式同样是frame,id,x1,y1,w,h,score,-1,-1,-1
  • 部署推理入口为 mot_sde_infer.py,其中SDE_Detector将检测器输出逐帧送入跟踪器,属于典型的 SDE(Separate Detection and Embedding)范式。

源码级原理:BOTSORTTracker 的关联流程

PaddleDetection 中的BOTSORTTracker位于 botsort_tracker.py,实现参考了 SMILEtrack 项目中的 BoT-SORT 跟踪器。其核心状态由三组轨迹列表构成:tracked_stracks(已确认轨迹)、lost_stracks(丢失轨迹)、removed_stracks(已移除轨迹)。每次update()调用按以下步骤推进:

  1. 检测过滤与分档:先按track_low_thresh过滤掉低分检测,再按track_high_thresh将剩余检测分为高分与低分两档;
  2. 卡尔曼预测:对tracked_strackslost_stracks的并集调用STrack.multi_predict,用卡尔曼滤波预测当前帧位置(状态空间为 8 维:中心坐标 x/y、宽高比 a、高度 h 及其速度,见 kalman_filter.py);
  3. 相机运动补偿(可选):当camera_motion: True时,通过GMC估计帧间全局变换矩阵,并用multi_gmc将轨迹均值与协方差变换到当前帧坐标系(见 gmc.py,支持稀疏光流、ORB、ECC 与文件四种方法);
  4. 第一阶段关联(高分检测):用 IoU 距离 + 线性分配(Hungarian)以match_thresh关联已跟踪/丢失轨迹与高分检测,命中的丢失轨迹执行re_activate恢复;
  5. 第二阶段关联(低分检测):对剩余未匹配轨迹与低分检测以阈值 0.5 再关联一次,弥补遮挡导致的短时检测降级;
  6. 未确认轨迹处理与新建轨迹:单帧未确认的轨迹以 0.7 阈值尝试确认;未匹配的高分检测若分数超过new_track_thresh则激活为新轨迹;
  7. 状态更新:超过max_time_lost(由track_buffer折算)的丢失轨迹被移除,最后合并轨迹列表并做去重。

从整体架构看,ppdet/engine/tracker.py 中的Tracker类统一承载了 JDE(FairMOT 等)与 SDE(DeepSORT、ByteTrack、BoT-SORT)两类跟踪器的评估逻辑,BOTSORTTracker在评估时由配置中的ByteTrack.tracker: BOTSORTTracker字段动态创建,这也解释了为什么 BoT-SORT 能直接复用 ByteTrack 的检测器训练与导出链路。

延伸:Pipeline 场景中的 BoT-SORT

BoT-SORT 是 PP-Human 与 PP-Vehicle 等 Pipeline 分析项目跟踪方向的主要方案,在行人/车辆流量统计、出入口计数等场景中可直接落地。相关使用方式参见:

  • Pipeline 项目说明 与 PP-Human MOT 教程;
  • PP-Tracking Python 部署文档。

引用

@article{aharon2022bot, title={BoT-SORT: Robust Associations Multi-Pedestrian Tracking}, author={Aharon, Nir and Orfaig, Roy and Bobrovsky, Ben-Zion}, journal={arXiv preprint arXiv:2206.14651}, year={2022} }

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/22 9:21:33

3个msn lite源码解析坑让新手白忙活

3个msn lite源码解析坑让新手白忙活 刚学会几行代码,对着屏幕发呆?是不是觉得语法都背下来了,可一旦要搭个像样的项目,脑子瞬间空白?别慌,这病我治过不少。很多初学者卡在“知道”和“做到”之间,根源在于没看懂底层逻辑。今天不整虚的,直接拆解 msn lite 这类轻量级框架的 源码解析…

作者头像 李华
网站建设 2026/9/22 9:21:22

3道高频面试题讲透无所为而为原理

3道高频面试题讲透无所为而为原理 复制来的代码跑不通,报错信息看得头晕,这是很多开发者在准备面试或接手老项目时的噩梦。你以为是环境问题,其实是逻辑没懂;你以为背了答案就行,结果面试官换个问法就卡壳。在Python和Java的高频面试题中,“无所为而为”这个概念经常被混淆,它不像线程池或缓存那样有明确…

作者头像 李华
网站建设 2026/9/22 9:21:03

3个实战项目搞定侠盗飞车代码底层逻辑

3个实战项目搞定侠盗飞车代码底层逻辑 刚学会Python语法,却连个像样的实战项目都搭不起来?这是不是你的现状?很多应届生盯着文档看,代码能跑,但一到做项目就懵。别慌,今天用【侠盗飞车代码】这个经典游戏案例,带你从0到1搭一个可运行的实战项目。 项目目标:我们要造什么…

作者头像 李华
网站建设 2026/9/22 9:20:59

3个坑让你soduso图解原理彻底吃透

3个坑让你soduso图解原理彻底吃透 刚把soduso从2.0升到3.0,我盯着报错日志看了半小时。原本跑得飞快的数据同步脚本,现在全是 AttributeError 。这不是你代码写错了,是soduso底层重构了API,连核心的初始化方式都变了。…

作者头像 李华
网站建设 2026/9/22 9:20:50

单片机最小系统性能优化避坑指南:3个步骤让响应快10倍

单片机最小系统性能优化避坑指南:3个步骤让响应快10倍 看了一堆教程还是不会写项目?别急着怪自己笨。90%的新手卡在“最小系统”这一步,明明代码跑通了,一到实际硬件上就卡顿、死机、数据丢包。今天这篇避坑指南,直接带你拆解单片机最小系统的性能瓶颈,用真实项目数据说话,让你从“能跑”变成“好用”。…

作者头像 李华
网站建设 2026/9/22 9:20:47

5步搞定宋体字转换器在线工具从入门到精通

5步搞定宋体字转换器在线工具从入门到精通 看了一堆教程还是不会写项目?别急,很多开发者卡在“在线工具”和“本地代码”的鸿沟上。想真正掌握 宋体字转换器在线 这类前端字体处理技术,必须打通从 入门到精通 的闭环。…

作者头像 李华