基于CCPD数据集的车辆检测实战:从数据清洗到模型优化全流程解析

1次阅读
没有评论

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

image.webp

背景痛点

CCPD 数据集作为国内最大的车牌检测数据集,在实际落地时面临三个典型挑战:

基于 CCPD 数据集的车辆检测实战:从数据清洗到模型优化全流程解析

  1. 模糊车牌问题 :约 12% 的样本存在运动模糊或失焦,导致传统检测器容易漏检
  2. 极端光照干扰 :夜间强光照射(如逆光)使车牌区域过曝 / 欠曝占比达 8.3%
  3. 部分遮挡场景 :车牌被泥土、积雪或物体遮挡的样本占训练集的 5.7%

技术方案

数据层面优化

采用两阶段增强策略:

  1. 自适应 ROI 裁剪 :根据标注框长宽比动态调整裁剪区域,保留更多上下文信息
  2. GridMask 增强 :设置概率性网格遮挡,模拟现实中的部分遮挡情况

关键参数配置:

# 自适应 ROI 示例代码
def adaptive_crop(img, bbox, expand_ratio=0.2):
    h, w = img.shape[:2]
    x1, y1, x2, y2 = bbox
    # 根据长宽比动态扩展
    if (x2-x1)/(y2-y1) > 3:  # 宽车牌
        expand_x = expand_ratio * (x2-x1)
    else:  # 普通车牌
        expand_x = expand_ratio * (y2-y1)
    new_x1 = max(0, int(x1 - expand_x))
    new_x2 = min(w, int(x2 + expand_x))
    return img[:, new_x1:new_x2]

模型改进方案

在 YOLOv5s 基础上引入:

  1. ECA 注意力模块 :替换原 Neck 中的 C3 结构,提升对车牌字符的敏感度
  2. 跨阶段特征复用 :在 Backbone 第 3 / 4 层间添加特征跳连

改进后结构变化:

graph TD
    Input --> Backbone
    Backbone --> Neck
    Neck --> Head
    Neck -.-> ECA_Block
    ECA_Block --> Head

完整代码实现

数据加载器关键逻辑

class CCPDDataset(Dataset):
    def __init__(self, img_dir, transform=None):
        self.img_dir = img_dir
        self.transform = transform
        # 过滤无效标注
        self.samples = [x for x in load_annotations() 
                       if self._check_valid(x['bbox'])]

    def _check_valid(self, bbox):
        # 剔除旋转角度 >45 度的样本
        return abs(bbox['angle']) < 45

    def __getitem__(self, idx):
        img = Image.open(self.samples[idx]['path'])
        if self.transform:
            img = self.transform(img)
        # 多尺度训练逻辑
        if random.random() > 0.5:  # 50% 概率启用
            img = F.resize(img, size=(random.randint(640, 800), 800))
        return img

性能优化对比

模型版本 mAP@0.5 FLOPs(G) 推理时延 (T4)
YOLOv5s 0.723 7.2 4.2ms
改进版 0.832 8.1 4.8ms

TensorRT 部署建议 :
1. 融合 Conv+BN+SiLU 组合层
2. 使用 FP16 精度时需固定 ECA 模块的输出尺度

常见问题避坑指南

  1. 旋转标注解析错误 :CCPD 的旋转角度采用 OpenCV 坐标系,需注意与模型期望格式的转换
    # 正确转换方式
    angle = -annotation['angle']  # 坐标系统一转换 
  2. 评估指标误用 :避免使用 AP@0.5 单独评估,应采用 AP@0.5:0.95 更全面
  3. 数据泄漏问题 :同一车辆的不同角度样本需确保在同一个数据划分中

延伸思考

对于摩托车车牌检测的特殊性,可考虑:

  1. 长宽比适配:摩托车牌比例通常为 2:1(汽车为 3:1)
  2. 字符间距分析:摩托车牌字符间距更大,需调整 NMS 阈值
  3. 动态 ROI 策略:针对摩托车安装位置不固定的特点改进候选框生成

整套方案在深圳某停车场系统实测显示,恶劣天气下的检出率从 68% 提升至 83%。未来可探索将车牌质量评估模块集成到检测流程中,实现端到端的质量感知检测。

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