YOLOv8交通目标检测实战:从BDD100K数据集到道路监控部署全流程

1次阅读
没有评论

共计 2105 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

在交通目标检测任务中,开发者常遇到以下几个典型问题:

YOLOv8 交通目标检测实战:从 BDD100K 数据集到道路监控部署全流程

  • 数据集格式不统一:BDD100K 采用 JSON 格式标注,而 YOLO 系列需要 TXT 格式,转换过程中容易出现坐标归一化错误或类别 ID 错位
  • 多数据集合并困难:TT100K 和 CCTSDB2017 都包含交通标志,但类别定义和标注标准不同,直接合并会导致模型混淆
  • 小目标检测精度低:交通标志在远距离拍摄时可能只占几个像素,普通检测器容易漏检

技术方案

数据格式转换

  1. BDD100K JSON 转 YOLO 格式
  2. 需要处理原始 JSON 中的多边形 / 矩形框统一转为 YOLO 中心坐标 + 宽高格式
  3. 注意坐标归一化时除以的是图像实际宽高而非固定值

  4. 多数据集合并策略

  5. 建立统一的类别映射表(如将 TT100K 的 ”prohibitory” 和 CCTSDB 的 ” 禁止标志 ” 映射为同一 ID)
  6. 建议保留原始数据集划分(不同场景数据分开验证)

  7. 模型选型依据

  8. YOLOv8 在 BDD100K 验证集上 mAP@0.5 达到 58.2%,比 YOLOv5 高 3.1%
  9. 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

关键训练参数

  1. 基础配置:

    yolo task=detect mode=train model=yolov8s.pt data=data.yaml \
    imgsz=640 batch=16 epochs=100 patience=20

  2. 显存优化技巧:

  3. 添加 --rect 参数启用矩形训练(减少 padding 内存占用)
  4. 冻结骨干网络前 10 层:freeze=10

  5. 数据增强:

  6. 交通场景建议禁用随机旋转(避免标志方向敏感)
  7. 适当降低 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))

生产建议

  1. 标注一致性检查
  2. 使用 LabelImg 可视化随机样本
  3. 计算标注框宽高比分布(异常值可能标注错误)

  4. 模型量化方案

  5. Jetson Xavier 实测:FP16 精度损失 <1%,INT8 损失约 3%
  6. 建议交通灯等关键目标使用 FP16

  7. 误检过滤策略

  8. 结合目标运动轨迹(连续帧检测稳定性)
  9. 设置 ROI 区域权重(如车道上方优先检测)

思考题

针对雨天夜间场景的检测系统设计建议:

  1. 数据层面:
  2. 收集雨雾 / 低光照条件下的增强数据集
  3. 使用 CLAHE 等算法预处理低对比度图像

  4. 模型层面:

  5. 在 Backbone 后添加低光照增强模块(如 Zero-DCE)
  6. 针对反光区域增加负样本

  7. 部署优化:

  8. 红外摄像头与可见光融合检测
  9. 动态调整检测阈值(夜间降低置信度要求)
正文完
 0
评论(没有评论)