
1. 项目缘起为什么我们需要一个“一站式”的检测与跟踪资源库在计算机视觉领域尤其是自动驾驶、智能交通监控、机器人导航等应用场景中车辆和行人的检测与跟踪是两项最基础、最核心的任务。我接触过不少刚入行的朋友也包括一些需要快速验证算法的团队他们面临的第一个难题往往不是模型本身而是“数据”和“代码”从哪里来。网上资源确实很多但散落在各个论文官网、GitHub仓库、学术数据集平台质量参差不齐标注格式五花八门代码依赖的环境可能早已过时。光是整理和复现就要耗费大量精力更别提进行有效的对比实验了。这个项目或者说这篇总结就是源于我过去几年里无数次“找数据、跑代码”的切身体会。我希望能整理一份相对全面、经过一定验证的“资源地图”把那些真正好用、有代表性的公开数据集和开源代码汇总起来并附上我踩过的坑和调试经验。这不仅仅是一个列表更是一个带有实操指南的索引目标是让你拿到这份资料后能快速定位到适合自己需求的数据和工具并少走弯路地跑起来。无论是想学习经典算法还是为新产品做原型验证这份汇总都能提供一个扎实的起点。2. 核心数据集盘点从经典基准到垂直场景数据集是算法训练的基石。选择合适的数据集意味着你的模型在一开始就站在了正确的赛道上。下面我将从通用性、规模、场景特点等维度对主流的车辆行人检测与跟踪数据集进行分类梳理。2.1 通用大型基准数据集这类数据集规模大、标注质量高、场景多样是学术研究和算法性能评测的“黄金标准”。2.1.1 COCO (Common Objects in Context)虽然COCO以80类物体检测闻名但其包含的‘person’和‘car’类别数据量巨大且场景极其丰富。对于行人检测任务COCO提供了超过25万张标注了行人的图像姿态、遮挡、尺度变化都很大是检验模型泛化能力的试金石。对于车辆虽然类别不如专用数据集精细但用于训练一个通用的车辆检测器仍然足够。它的标注格式JSON已成为业界事实标准绝大多数开源代码都支持。2.1.2 KITTI自动驾驶领域无人不知的经典数据集。它最大的特点是提供了多传感器同步数据摄像头、激光雷达、GPS/IMU并且标注包含了2D/3D边界框、朝向、遮挡/截断程度等丰富信息。其目标检测基准涵盖了‘Car’, ‘Pedestrian’, ‘Cyclist’等类别。需要注意的是KITTI的数据采集于2011年左右图像分辨率1242x375和场景复杂度以今天的标准看略显简单但其严谨的评测标准和在学术界的深远影响使其仍是入门自动驾驶视觉的必选项。2.1.3 BDD100K (Berkeley DeepDrive)这是一个更现代、规模更大的驾驶场景数据集。它包含了10万段高清视频序列约1000万帧覆盖了不同天气晴天、雨天、雪天、不同时间白天、夜晚和不同地点。其标注不仅包括2D边界框10类物体还包括车道线、可行驶区域、语义分割等。对于需要研究时序一致性、复杂天气下鲁棒性或者进行多任务学习的项目BDD100K是极佳的选择。它的数据量足以训练大型模型而不易过拟合。2.2 行人与车辆检测专项数据集这类数据集针对特定任务进行了更精细的标注。2.2.1 CityPersons CrowdHuman两者都是专注于密集行人检测的数据集专门解决遮挡和小尺度行人的难题。CityPersons基于Cityscapes语义分割数据集的行人子集在德国多个城市的街景中标注了行人。它的标注区分了可见区域和全身区域对于研究严重遮挡下的行人检测非常有价值。CrowdHuman一个大规模、高密度的行人检测数据集图像主要来自互联网场景拥挤平均每张图有22.6个人最高可达400多人。它提供了三种标注人体可见框、人体全身框以及人体关键点。如果你想挑战极端密集场景或者训练一个“人挤人”环境下依然稳健的检测器这是不二之选。2.2.2 UA-DETRAC这是一个专门用于车辆检测与跟踪的数据集包含超过10小时的真实交通监控视频约14万帧在北京和天津的24个不同地点拍摄。它标注了超过8250辆车总计121万个边界框。其挑战在于光照变化、车辆尺度变化以及不同程度的遮挡。数据集提供了清晰的训练集/测试集划分并有一套完整的评测工具包括检测精度和跟踪指标如MOTA、MOTP非常适合用于研究多目标跟踪MOT算法。2.3 多目标跟踪MOT专用数据集跟踪任务不仅需要框更需要跨帧的身份ID关联。2.3.1 MOT Challenge 系列这是多目标跟踪领域最权威的评测基准。它包含多个子数据集如MOT17、MOT20等。这些数据集提供已标注好行人ID的视频序列标注格式统一。MOT17在相对简单的场景下提供了清晰的边界框和ID。MOT20则专注于极度拥挤的场景人群密度非常大对跟踪算法的数据关联和抗遮挡能力提出了终极挑战。几乎所有最新的跟踪算法如ByteTrack, OC-SORT, BoT-SORT都会在此基准上报告性能。2.3.2 DanceTrack这是一个比较新的跟踪数据集其目标不是行人或车辆而是舞者。但正是这个特性使其成为检验跟踪算法泛化能力和解决“相似外观干扰”的利器。视频中多个舞者穿着相似服装做着相似动作外观区分度极低传统的基于外观重识别Re-ID的跟踪方法在这里会遭遇滑铁卢。它迫使研究者更关注运动模型和稳健的数据关联策略。注意选择数据集时务必考虑其许可协议。大部分学术数据集仅限非商业研究使用。若用于商业产品可能需要购买商业许可证或自行采集数据。3. 关键代码仓库与框架实战指南有了数据下一步就是让代码跑起来。这里我按任务类型推荐几个经过社区验证、文档相对完善且我个人成功部署过的开源项目。3.1 检测任务YOLO系列与MMDetection3.1.1 YOLOv5 / YOLOv8 (Ultralytics)对于需要快速原型验证和部署的开发者Ultralytics维护的YOLOv5和YOLOv8是首选。它们的最大优点是“开箱即用”。环境配置通常一个pip install ultralytics就能安装核心库。但如果你想从源码训练建议使用Python 3.8和PyTorch 1.7。我遇到过在Python 3.10上某些依赖包冲突的问题回退到3.8后解决。数据准备你需要将数据集转换为YOLO格式每个图像对应一个.txt文件内容为class_id x_center y_center width height坐标归一化。COCO、KITTI等都有现成的转换脚本。关键点务必检查转换后标签文件中的类别ID是否与你的data.yaml配置文件中的names列表顺序一致这是最常见的报错来源。训练与验证命令极其简单如yolo train datacoco.yaml modelyolov8n.pt epochs100。实操心得在自定义数据集上不要一上来就训练很多轮。先用小模型如YOLOv8n、少轮数如50轮跑一个快速实验确认数据管道、损失曲线正常。关注val/box_loss和val/cls_loss在验证集上的表现确保它们没有持续上升过拟合。部署Ultralytics提供了导出到ONNX、TensorRT、CoreML等格式的一键命令yolo export。在部署到边缘设备如Jetson系列时TensorRT版本与CUDA、PyTorch版本的兼容性是最大的坑。建议严格按照官方Docker镜像或文档中指定的版本组合来搭建环境。3.1.2 MMDetection (OpenMMLab)如果你需要更前沿的算法、更灵活的模块化设计或者进行严谨的学术研究MMDetection是更强大的工具箱。它实现了数十种检测算法Faster R-CNN, Cascade R-CNN, RetinaNet, DETR系列等。环境搭建MMDetection的依赖管理更严格强烈建议使用其提供的MIM工具和Dockerfile。我的经验是在Ubuntu系统上按照官方“安装”文档一步步走成功率最高。避免手动混用conda和pip安装容易导致版本地狱。配置文件系统这是MMDetection的核心也是学习曲线最陡的部分。它采用模块化继承设计。例如你想在COCO数据集上用ResNet-50 backbone训练Faster R-CNN配置文件可能继承自多个基础配置。调试技巧使用python tools/misc/print_config.py /path/to/your_config.py可以打印出完整的、解析后的配置方便你确认所有参数是否按预期合并。自定义数据集你需要编写一个新的数据集类继承CustomDataset并修改配置文件中的data部分。MMDetection支持COCO格式和VOC格式。我通常将数据转为COCO格式因为其标注信息更丰富且社区工具支持更广。训练技巧MMDetection默认配置是针对8 GPU设计的。在单卡或双卡上训练时必须等比缩放学习率LR和批次大小batch size。经典规则是new_lr old_lr * new_bs / old_bs。同时要相应调整训练总轮数max_epochs因为更小的batch size意味着参数更新更频繁可能需要更多轮次来收敛。3.2 多目标跟踪MOT任务ByteTrack与BoT-SORT跟踪是在检测的基础上增加跨帧的ID关联。目前主流范式是“检测关联”Tracking-by-Detection。3.2.1 ByteTrackByteTrack的核心思想非常简单却有效充分利用低分数检测框在YOLOX中通常指分数在0.1-0.5之间的框进行关联。传统方法会直接过滤掉这些低分框认为它们是背景。但ByteTrack发现很多被遮挡目标的检测分数会下降直接丢弃会导致ID丢失ID Switch。它先使用高分框与已有轨迹进行第一次关联Kalman滤波预测IoU匹配再将未匹配的高分框和低分框一起与第一次未匹配的轨迹进行第二次关联。这个策略显著提升了在遮挡和运动模糊情况下的跟踪稳定性。复现要点官方实现基于YOLOX和PyTorch。你需要先准备好YOLOX检测器在目标数据集如MOT17上训练好的模型。关键步骤是数据预处理必须将公开数据集的标注或你自己的视频处理成MOT Challenge规定的输入格式[frame_id, obj_id, x, y, w, h, score, class, visibility_ratio]。ByteTrack仓库提供了对MOT数据的预处理脚本。参数调试最重要的两个参数是检测阈值track_thresh第一次关联的高分阈值和match_threshIoU匹配阈值。在人群密集场景下可以适当降低match_thresh如从0.8调到0.6并提高track_buffer参数允许轨迹短暂丢失后恢复的帧数以应对频繁遮挡。3.2.2 BoT-SORT ByteTrack的演进BoT-SORT在ByteTrack的基础上引入了相机运动补偿CMC和更精细的外观嵌入Re-ID融合策略。CMC通过特征点匹配估计相邻帧间的仿射变换补偿因相机抖动或运动带来的整体位移使得基于IoU的关联更准确。这对于车载或手持摄像头拍摄的视频至关重要。部署经验BoT-SORT的代码结构更复杂依赖OpenCV的ECC算法做运动估计。在部署时确保你的OpenCV版本编译了opencv_contrib模块。如果跟踪实时性要求高CMC计算可能成为瓶颈可以尝试每N帧计算一次而不是每帧都算。关于Re-ID许多跟踪框架包括FastReID库支持集成Re-ID模型。但引入Re-ID会显著增加计算量并且在外观相似目标多的场景如DanceTrack可能起反作用。我的建议是先只用运动信息IoUKalman跑通基线在ID Switch严重时再考虑加入轻量级的Re-ID分支并仔细调整运动模型和外观相似度的融合权重。3.3 一站式解决方案PySlowFast 与 Detectron2对于希望在一个框架内同时完成检测、跟踪甚至行为分析的研究团队Meta AI前Facebook AI推出的PySlowFast和Detectron2是工业级的选择。3.3.1 Detectron2这是一个模块化、高性能的视觉算法库基于PyTorch。它不仅是检测还涵盖了分割、关键点检测等。其模型动物园Model Zoo提供了大量预训练模型。对于跟踪它通过Detectron2-Dev等分支项目提供了MOT任务的实现参考。它的数据加载器DatasetMapper、模型构建build_model和流水线设计非常优雅适合中大型项目进行二次开发。但它的学习曲线比YOLO和MMDetection更陡对编程能力要求更高。3.3.2 PySlowFast如果你主要处理视频数据并需要时空特征PySlowFast是专为视频理解设计的。它天然支持从视频中提取片段进行训练和推理其核心的“慢快通路”网络结构能高效捕捉时空信息。虽然它本身不直接提供“跟踪”模块但其强大的视频特征提取能力可以作为跟踪算法中外观表征部分的上游网络。例如你可以用PySlowFast提取每帧或每个目标区域的特征再输入到自定义的关联算法中。4. 从数据到结果全流程实操与避坑指南这一部分我将以一个具体的例子串联起整个流程使用YOLOv8在BDD100K数据集上训练一个车辆行人检测器并用ByteTrack在一段新视频上进行跟踪。4.1 数据准备与预处理获取数据从BDD100K官网下载“100K Images”和“Detection Labels”。你会得到图片文件夹和一个大的det_v2_train_release.json标签文件。格式转换BDD100K使用JSON格式需要转换为YOLO格式。你需要写一个解析脚本关键步骤如下import json import os # 加载JSON文件 with open(det_v2_train_release.json, r) as f: data json.load(f) # BDD100K类别映射到YOLO类别ID # 假设我们只关心‘car’, ‘person’, ‘traffic light’, ‘traffic sign’, ‘bus’, ‘truck’ category_map {car: 0, person: 1, traffic light: 2, traffic sign: 3, bus: 4, truck: 5} for img_info in data: img_name img_info[name] img_width img_info[width] img_height img_info[height] labels img_info[labels] txt_path os.path.join(labels/train, img_name.replace(.jpg, .txt)) with open(txt_path, w) as txt_f: for label in labels: cat label[category] if cat not in category_map: continue # 跳过不关心的类别 box label[box2d] x_center (box[x1] box[x2]) / 2.0 / img_width y_center (box[y1] box[y2]) / 2.0 / img_height width (box[x2] - box[x1]) / img_width height (box[y2] - box[y1]) / img_height # 写入 class_id x_center y_center width height txt_f.write(f{category_map[cat]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n)避坑点务必检查转换后的边界框坐标是否在[0, 1]之间且宽高是否为正数。我曾遇到过原始标注有误x1 x2导致训练时损失为NaN的情况。组织目录创建datasets/bdd100k目录内部结构如下bdd100k/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/将图片和对应的.txt标签文件分别放入images和labels的对应子文件夹。4.2 模型训练与调优配置文件创建一个bdd100k.yaml文件放在YOLOv8项目根目录。# bdd100k.yaml path: /path/to/your/datasets/bdd100k train: images/train val: images/val # 类别数 nc: 6 # 类别名称顺序必须与转换脚本中的category_map一致 names: [car, person, traffic light, traffic sign, bus, truck]开始训练yolo taskdetect modetrain modelyolov8m.pt databdd100k.yaml epochs150 imgsz640 batch16 workers8modelyolov8m.pt使用中等大小的预训练模型在速度和精度间取得平衡。imgsz640BDD100K图像原始分辨率多样统一缩放到640x640训练是常见做法。如果显存充足可以尝试768或1024可能带来精度提升。workers8数据加载线程数根据你的CPU核心数调整。设置过高可能导致内存溢出。监控与调优训练开始后使用TensorBoard或YOLOv8自带的日志工具监控损失曲线和验证集指标mAP0.5。如果训练损失下降但验证集mAP不升可能是过拟合。尝试增加数据增强在bdd100k.yaml中配置augment: True并调整增强参数或使用更大的模型如yolov8l.pt或减少训练轮数。如果验证集mAP在某个轮数后剧烈波动可能是学习率太大。尝试使用cos学习率调度器并降低初始学习率lr0参数。4.3 跟踪推理与集成训练好检测模型假设保存为best.pt后我们使用ByteTrack进行跟踪。准备ByteTrack环境克隆ByteTrack仓库安装依赖。注意其requirements.txt可能与你训练YOLO的环境有冲突建议使用虚拟环境。修改检测器ByteTrack官方示例使用YOLOX。我们需要将其替换为我们的YOLOv8模型。核心是编写一个适配器类将YOLOv8的输出格式转换成ByteTrack需要的格式[x1, y1, x2, y2, score, class]。# 伪代码示例在ByteTrack的tools/demo_track.py中修改 from ultralytics import YOLO class YOLOv8Detector: def __init__(self, model_path): self.model YOLO(model_path) def __call__(self, img): results self.model(img, verboseFalse)[0] # 推理单张图片 boxes results.boxes if boxes is None: return np.empty((0, 6)) # 提取框、分数、类别 dets boxes.data.cpu().numpy() # [N, 6] (x1, y1, x2, y2, conf, cls) # ByteTrack需要分数在0-1之间且类别为整数 dets[:, 4] dets[:, 4].astype(np.float32) dets[:, 5] dets[:, 5].astype(np.int32) return dets # 替换原来的检测器初始化 detector YOLOv8Detector(path/to/your/best.pt)运行跟踪配置好视频输入路径和输出路径运行脚本。关键要调整ByteTrack的参数特别是track_thresh和match_thresh。对于车辆跟踪由于车辆大小和运动相对规律match_thresh可以设高一点如0.7。对于行人尤其是密集行人可能需要降低到0.5。结果可视化ByteTrack会输出带ID的边界框。你可以使用OpenCV将ID和框绘制在视频帧上。一个实用技巧为不同ID分配固定颜色太难可以为每个ID生成一个随机的但持续的颜色这样在视频中更容易追踪单个目标的运动轨迹。4.4 常见问题排查清单训练时CUDA out of memory降低batch_size和imgsz。检查是否有其他进程占用显存。使用torch.cuda.empty_cache()。验证时mAP为0或极低首先检查数据标注路径是否正确。其次验证数据集中是否有目标用训练好的模型在几张验证集图片上可视化一下看是否能检测出东西。最常见的原因是类别ID不匹配或标注文件为空。跟踪时ID Switch频繁首先检查检测器在单帧上的性能是否稳定有无漏检、误检。如果检测没问题尝试调整ByteTrack的track_buffer增加以容忍短暂丢失和match_thresh降低以在遮挡时也能关联。考虑是否引入相机运动补偿CMC。跟踪速度慢瓶颈通常在检测阶段。可以尝试换用更小的检测模型如YOLOv8n或者使用TensorRT加速推理。对于ByteTrack关联算法的复杂度与目标数量成平方关系在目标极多时100可以考虑使用更高效的距离计算方式如向量化操作。整个流程走下来你会发现从数据准备到最终跟踪每一步都有细节需要注意。这份汇总和指南的目的就是帮你捋顺这条路径把宝贵的精力集中在算法改进和业务逻辑上而不是重复解决环境配置和数据格式这些“脏活累活”。在实际项目中你可能还需要考虑模型量化、部署优化、前后端集成等一系列工程问题但有了一个稳定可靠的检测跟踪基础这些后续工作就有了坚实的立足点。