共计 2105 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在交通目标检测任务中,开发者常遇到以下几个典型问题:

- 数据集格式不统一:BDD100K 采用 JSON 格式标注,而 YOLO 系列需要 TXT 格式,转换过程中容易出现坐标归一化错误或类别 ID 错位
- 多数据集合并困难:TT100K 和 CCTSDB2017 都包含交通标志,但类别定义和标注标准不同,直接合并会导致模型混淆
- 小目标检测精度低:交通标志在远距离拍摄时可能只占几个像素,普通检测器容易漏检
技术方案
数据格式转换
- BDD100K JSON 转 YOLO 格式:
- 需要处理原始 JSON 中的多边形 / 矩形框统一转为 YOLO 中心坐标 + 宽高格式
-
注意坐标归一化时除以的是图像实际宽高而非固定值
-
多数据集合并策略:
- 建立统一的类别映射表(如将 TT100K 的 ”prohibitory” 和 CCTSDB 的 ” 禁止标志 ” 映射为同一 ID)
-
建议保留原始数据集划分(不同场景数据分开验证)
-
模型选型依据:
- YOLOv8 在 BDD100K 验证集上 mAP@0.5 达到 58.2%,比 YOLOv5 高 3.1%
- 640×640 输入下 FPS:YOLOv8(142) > YOLOX(128) > YOLOv5(135)
核心实现
数据配置模板
# data.yaml 示例
path: ./datasets/combined
train: images/train
val: images/val
names:
0: vehicle
1: traffic_light
2: prohibitory_sign
3: speed_limit
关键训练参数
-
基础配置:
yolo task=detect mode=train model=yolov8s.pt data=data.yaml \ imgsz=640 batch=16 epochs=100 patience=20 -
显存优化技巧:
- 添加
--rect参数启用矩形训练(减少 padding 内存占用) -
冻结骨干网络前 10 层:
freeze=10 -
数据增强:
- 交通场景建议禁用随机旋转(避免标志方向敏感)
- 适当降低 MixUp 强度(避免车辆 - 标志不合理的混合)
代码示例
JSON 转 YOLO 格式
import json
import os
def convert_bdd_json(json_path, output_dir):
with open(json_path) as f:
data = json.load(f)
for img in data:
txt_path = os.path.join(output_dir, img['name'].replace('.jpg','.txt'))
with open(txt_path, 'w') as f_txt:
for obj in img['labels']:
if 'box2d' not in obj: continue
# 归一化处理
x_center = (obj['box2d']['x1'] + obj['box2d']['x2']) / 2 / img['width']
y_center = (obj['box2d']['y1'] + obj['box2d']['y2']) / 2 / img['height']
width = (obj['box2d']['x2'] - obj['box2d']['x1']) / img['width']
height = (obj['box2d']['y2'] - obj['box2d']['y1']) / img['height']
# 写入 YOLO 格式
f_txt.write(f"{CLASS_MAP[obj['category']]} {x_center} {y_center} {width} {height}\n")
TensorRT 部署
# 导出 ONNX(带动态 batch)model.export(format='onnx', dynamic=True, imgsz=[640,640])
# TensorRT 推理示例
import tensorrt as trt
logger = trt.Logger(trt.Logger.INFO)
with open("yolov8s.engine", "rb") as f, trt.Runtime(logger) as runtime:
engine = runtime.deserialize_cuda_engine(f.read())
# 创建执行上下文
context = engine.create_execution_context()
# 设置动态输入尺寸
context.set_binding_shape(0, (batch_size, 3, 640, 640))
生产建议
- 标注一致性检查:
- 使用 LabelImg 可视化随机样本
-
计算标注框宽高比分布(异常值可能标注错误)
-
模型量化方案:
- Jetson Xavier 实测:FP16 精度损失 <1%,INT8 损失约 3%
-
建议交通灯等关键目标使用 FP16
-
误检过滤策略:
- 结合目标运动轨迹(连续帧检测稳定性)
- 设置 ROI 区域权重(如车道上方优先检测)
思考题
针对雨天夜间场景的检测系统设计建议:
- 数据层面:
- 收集雨雾 / 低光照条件下的增强数据集
-
使用 CLAHE 等算法预处理低对比度图像
-
模型层面:
- 在 Backbone 后添加低光照增强模块(如 Zero-DCE)
-
针对反光区域增加负样本
-
部署优化:
- 红外摄像头与可见光融合检测
- 动态调整检测阈值(夜间降低置信度要求)
正文完
