Yolov5 + Deepsort 实战:从零构建自定义多目标追踪系统(避坑指南)

张开发
2026/4/18 14:57:39 15 分钟阅读

分享文章

Yolov5 + Deepsort 实战:从零构建自定义多目标追踪系统(避坑指南)
1. 环境配置与版本选择避坑指南第一次接触Yolov5Deepsort组合时我最头疼的就是环境版本冲突问题。记得去年用conda安装时torch和torchvision版本不匹配导致CUDA报错整整折腾了两天。这里分享我的终极解决方案基础环境推荐Ubuntu 20.04 Python 3.8组合实测兼容性最佳。Windows用户建议使用WSL2原生Windows下编译opencv容易出问题关键版本# 核心库版本2023年实测稳定组合 torch1.10.0cu113 torchvision0.11.1cu113 opencv-python4.5.5.64常见坑点安装torch时一定要带cu后缀指定CUDA版本否则默认安装CPU版Deepsort的nms模块需要单独编译遇到ImportError: cannot import name nms错误时cd deep_sort_pytorch/deep_sort/nms python setup.py build_ext --inplace显卡驱动版本建议≥470低版本可能导致CUDA out of memory假报错注意不要直接pip install最新版我在RTX 3090上测试发现torch 2.0会导致Yolov5推理速度下降30%2. 数据准备的特殊处理技巧2.1 目标检测数据集制作Yolov5训练需要YOLO格式标注但很多公开数据集是VOC或COCO格式。这里给出我的转换脚本import xml.etree.ElementTree as ET import os def voc2yolo(xml_path, classes): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w float(size.find(width).text) img_h float(size.find(height).text) results [] for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue xmlbox obj.find(bndbox) xmin float(xmlbox.find(xmin).text) ymin float(xmlbox.find(ymin).text) xmax float(xmlbox.find(xmax).text) ymax float(xmlbox.find(ymax).text) # 转换为中心点宽高归一化 x_center ((xmin xmax)/2) / img_w y_center ((ymin ymax)/2) / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h results.append(f{classes.index(cls)} {x_center} {y_center} {width} {height}) return \n.join(results)2.2 ReID数据集的特殊处理Deepsort的ReID模块需要行人重识别数据集必须遵循以下规则目录结构示例dataset/ ├── train/ │ ├── person_001/ # 每个ID单独文件夹 │ │ ├── 001.jpg │ │ └── 002.jpg │ └── person_002/ └── test/ └── ...图像尺寸建议统一为128x256可以使用这个批量处理脚本from PIL import Image import os def resize_images(input_dir, output_dir, size(128,256)): os.makedirs(output_dir, exist_okTrue) for root, _, files in os.walk(input_dir): for file in files: if file.endswith((.jpg,.png)): img_path os.path.join(root, file) rel_path os.path.relpath(root, input_dir) save_dir os.path.join(output_dir, rel_path) os.makedirs(save_dir, exist_okTrue) with Image.open(img_path) as img: img img.resize(size, Image.ANTIALIAS) img.save(os.path.join(save_dir, file))3. 模型训练实战细节3.1 Yolov5自定义训练使用官方仓库训练时这几个参数最影响效果# data/custom.yaml train: ../train/images val: ../valid/images nc: 3 # 类别数 names: [person, car, bike] # 按实际修改启动训练命令关键参数说明python train.py \ --img 640 \ # 输入尺寸 --batch 16 \ # 根据显存调整 --epochs 100 \ # 小数据集建议增加 --data custom.yaml \ # 配置文件 --weights yolov5s.pt \ # 预训练模型 --device 0 \ # GPU ID --rect \ # 矩形训练提升小目标检测 --adam # 小数据集推荐使用实测发现当训练样本少于1000张时使用--adam优化器比默认SGD效果提升约15%3.2 Deepsort重识别模型训练修改deep_sort_pytorch/deep_sort/deep/train.py中的关键配置# 数据集路径设置 parser.add_argument(--data-dir, defaultdata/, help训练数据根目录) # 模型参数调整适用于1080Ti级别显卡 parser.add_argument(--lr, typefloat, default0.01, help学习率) parser.add_argument(--momentum, typefloat, default0.9) parser.add_argument(--weight-decay, typefloat, default1e-4)启动训练前务必执行export CUDA_LAUNCH_BLOCKING1 # 调试时显示具体CUDA错误 nohup python train.py --data-dir your_dataset train.log 21 常见问题处理出现NaN loss降低学习率或增加batch size准确率波动大添加--warmup-epochs 5参数4. 集成测试与性能优化4.1 联合推理脚本修改官方track.py需要调整以下关键点# 在track.py开头添加 import warnings warnings.filterwarnings(ignore, categoryUserWarning) # 过滤PyTorch警告 # 修改检测阈值根据实际场景调整 parser.add_argument(--conf-thres, typefloat, default0.5, help目标置信度阈值) parser.add_argument(--iou-thres, typefloat, default0.5, helpIOU阈值) # 增加异常处理避免空检测崩溃 try: bbox_xywh detections[:, :4] confs detections[:, 4] clss detections[:, 5] except IndexError: continue4.2 实时性能优化技巧在我的RTX 3060上测试1080p视频时通过这些优化将FPS从15提升到28模型量化model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8 )OpenCV加速cap cv2.VideoCapture() cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*MJPG)) cap.set(cv2.CAP_PROP_FPS, 30)多进程处理from multiprocessing import Process, Queue def detect(queue): while True: img queue.get() # 检测逻辑 ... if __name__ __main__: queue Queue() p Process(targetdetect, args(queue,)) p.start()最后测试时建议使用这个命令python track.py \ --yolo-weights best.pt \ --deep-sort-weights ckpt1.t7 \ --source test.mp4 \ --show-vid \ --save-vid \ --device 0 \ --half # 使用FP16加速遇到跟踪ID跳变问题时可以调整deep_sort/configs/deep_sort.yaml中的max_dist: 0.2 # 特征距离阈值越小匹配越严格 max_iou_distance: 0.7 # IOU距离阈值 max_age: 30 # 目标丢失保持帧数

更多文章