使用YOLOv3与DeepSort实现车辆计数追踪时FPS过低及ID切换问题求助
解决YOLOv3+DeepSort车辆追踪计数的FPS与ID切换问题
一、先确认GPU加速是否真的启用
你的设备GTX1650支持CUDA,但需要确保代码确实在调用GPU:
- 检查代码中是否指定了设备并将模型加载到GPU:
运行时添加验证代码:device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Darknet(cfg_path).to(device)
若输出print("CUDA可用:", torch.cuda.is_available()) print("模型运行设备:", next(model.parameters()).device)cuda:0则说明GPU已启用;若显示cpu,检查CUDA与PyTorch版本是否匹配(CUDA11.6对应PyTorch 1.12.0及以上版本)。 - 用
nvidia-smi命令查看运行时GPU利用率:如果利用率低于30%,大概率是代码未调用GPU,或模型误加载到CPU上。
二、同时提升FPS与检测精度的方案
针对GTX1650的性能,推荐以下优化方向:
1. 优化原版YOLOv3的推理速度
- 半精度推理:将模型和输入转为FP16,显存占用减半,速度提升明显,精度损失可忽略:
model.half() # 转换模型为半精度 # 推理时输入同步转成半精度 img = img.to(device).half() - 减小输入尺寸:将YOLOv3的输入从默认608x608改为416x416,推理速度提升约50%,精度仅小幅下降。
- 调整检测阈值:提高
conf_thresh(如从0.5调到0.6)和nms_thresh(如从0.4调到0.5),减少冗余检测框,加快推理流程。
2. 替换为更高效的YOLO变体
- YOLOv5s:精度接近原版YOLOv3,速度远超YOLOv3-tiny,在GTX1650上可达到20+FPS,且自带半精度、TensorRT加速等成熟优化方案。
- YOLOv4-tiny:比YOLOv3-tiny精度更高,速度相当,适合资源有限的设备。
3. 用TensorRT加速推理
将YOLO模型转为ONNX格式,再用TensorRT优化,可进一步提升20%-30%的推理速度:
- 导出YOLOv3为ONNX(以PyTorch为例),再用TensorRT构建推理引擎,实际运行时调用引擎即可。
三、解决DeepSort的ID切换问题
ID切换主要源于检测不稳定或追踪参数不合理,可从以下方向修复:
1. 提升检测稳定性
- 放弃YOLOv3-tiny,改用优化后的原版YOLOv3或YOLOv5s,保证检测框的连续性和准确性,避免因检测框飘移、漏检导致ID重置。
- 对检测框做平滑处理,比如用卡尔曼滤波的预测结果修正检测框坐标,减少框体抖动。
2. 调整DeepSort追踪参数
修改deep_sort/configs/deep_sort.yaml中的关键参数:
- 增大
max_age:允许目标消失更多帧(如从30改为50),避免短暂遮挡导致ID丢失。 - 增大
min_hits:需要连续检测到多次(如从3改为5)才分配ID,减少误检测带来的ID混乱。 - 降低
max_cosine_distance:从0.2改为0.15,让特征匹配更严格,减少错误的ID分配。
3. 优化ReID模型
- 替换DeepSort默认的ResNet50为轻量级模型(如MobileNetV2),减少特征提取的计算量,同时保证追踪稳定性。
- 减小ReID模型的输入尺寸(如从128x64改为64x32),加快特征提取速度。
四、综合建议
结合你的设备,优先按以下步骤操作:
- 确认GPU加速已启用,开启半精度推理,将YOLOv3输入改为416x416,此时FPS可提升至8-12,精度接近原版。
- 替换为YOLOv5s,配合TensorRT加速,FPS可达20+,精度优于YOLOv3。
- 调整DeepSort的
max_age和min_hits参数,解决ID切换问题。
内容的提问来源于stack exchange,提问作者Hải Dương Phạm
相关产品推荐
相关产品推荐

