基于CCPD车牌数据集的深度学习模型优化实战:从数据清洗到模型部署

1次阅读
没有评论

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

image.webp

背景与痛点分析

CCPD 车牌数据集作为国内最大的开源车牌数据集,包含 20 万 + 真实场景车牌图像,但在实际应用中仍存在以下典型问题:

基于 CCPD 车牌数据集的深度学习模型优化实战:从数据清洗到模型部署

  • 光照条件复杂 :强光、逆光、夜间低光等场景导致车牌区域对比度不足
  • 模糊与遮挡 :车速过快或摄像头抖动产生的运动模糊,以及车牌部分遮挡
  • 小目标检测 :远距离拍摄时车牌仅占图像极小区域(最小 20×10 像素)
  • 长宽比极端 :新能源车牌长度是普通车牌的 1.5 倍
  • 样本不均衡 :某些省份车牌样本量不足常规车牌的 1 /10

技术方案设计

数据层面优化

  1. 自适应直方图均衡化(CLAHE)
  2. 对 HSV 空间的 V 通道进行处理,避免颜色失真
  3. 设置 clipLimit=2.0, tileGridSize=(8,8) 取得最佳效果

  4. 随机擦除增强

  5. 模拟车牌污损场景,擦除区域面积控制在 10%-25%
  6. 采用任意宽高比矩形框,增强模型抗遮挡能力

  7. 难样本挖掘

  8. 第一阶段训练后,统计漏检样本的特征分布
  9. 针对性补充相似场景数据到训练集

模型结构改进

基于 YOLOv5s 的改进方案:

  • 检测头改进 :
  • 增加 P2 特征层(160×160)提升小目标检测能力
  • 在 Neck 部分引入 BiFPN 结构加强特征融合
  • 损失函数优化 :
  • 分类任务使用 Focal Loss(α=0.25, γ=2)
  • 回归任务采用 SIoU Loss 替代 CIoU

训练技巧

  • EMA 模型平滑 :衰减系数设为 0.9998
  • Warmup 策略 :前 500 迭代线性增加学习率
  • 余弦退火 :初始 lr=0.01,最小 lr=0.0001

关键代码实现

数据预处理 Pipeline

import cv2
import albumentations as A

# CLAHE 增强实现
def apply_clahe(img):
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    hsv[:,:,2] = clahe.apply(hsv[:,:,2])
    return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

# Albumentations 增强组合
transform = A.Compose([A.RandomErasing(p=0.5, scale=(0.1, 0.25)),
    A.RandomBrightnessContrast(p=0.3),
    A.HueSaturationValue(p=0.2)
], bbox_params=A.BboxParams(format='yolo'))

模型改进部分

# models/yolov5s.yaml 中修改检测头
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 3], 1, Concat, [1]],  # P2 输出层
   [-1, 3, C3, [512, False]],
   ...]

性能验证

在 CCPD-test 集上的实验结果:

方法 mAP@0.5 推理速度 (FPS)
YOLOv5s 基线 0.872 142
+ 数据增强 0.891 138
+ 检测头改进 0.903 125
完整方案 0.916 118

部署优化指南

  1. TensorRT 加速 :
  2. 使用 FP16 精度可提升 30% 推理速度
  3. 设置 opt_shape 参数时需考虑最大车牌尺寸

  4. 长宽比处理技巧 :

  5. 测试时保持原始图像比例
  6. 对检测结果做后处理时,按 10:3 宽高比过滤误检

开放性问题

  • 如何提升中文省份字符的识别准确率?
  • 能否设计专用字符分类器处理新能源车牌?

欢迎在 GitHub 示例项目中提交您的解决方案 PR,共同完善车牌检测技术生态。

正文完
 0
评论(没有评论)