雾天行人车辆目标检测实战:从数据增强到模型优化的完整指南

1次阅读
没有评论

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

image.webp

问题背景

雾天目标检测是计算机视觉中的经典难题。根据统计数据,雾天场景下图像的对比度平均下降 40-60%,目标边缘信噪比(SNR)降低约 30dB。主要挑战来自两方面:

雾天行人车辆目标检测实战:从数据增强到模型优化的完整指南

  1. 光散射效应 :雾气中的悬浮颗粒导致光线发生 Mie 散射,使图像出现白蒙蒙的覆盖层。这种物理现象可以用公式描述为:

$$I(x) = J(x)t(x) + A(1-t(x))$$

其中 $I$ 是观测图像,$J$ 是清晰场景,$A$ 是大气光,$t$ 是透射率。

  1. 目标模糊 :行人 / 车辆的轮廓模糊度比晴天场景高 3 - 5 倍,传统检测器的召回率可能骤降 50% 以上。

技术方案

数据增强策略

物理模型去雾

基于 Dark Channel Prior(DCP)的传统方法:

  • 优点:物理可解释性强,无需训练数据
  • 缺点:处理速度慢(1080P 图像约 500ms),对浓雾效果有限

核心代码片段:

def dark_channel(img, patch_size=15):
    min_channel = torch.min(img, dim=1)[0]
    kernel = torch.ones(patch_size, patch_size)
    dc = -F.max_pool2d(-min_channel, kernel.size())
    return dc

GAN 合成数据

采用 CycleGAN 进行雾合成:

  • 训练时使用 Foggy Cityscapes 数据集
  • 每张晴天图像可生成 3 - 5 种不同浓度的雾天变体
  • 合成数据可使训练集规模扩大 4 倍

模型架构选择

YOLOv5 改进方案

  1. 注意力机制 :在 Backbone 末端添加 CBAM 模块

    class CBAM(nn.Module):
        def __init__(self, channels):
            super().__init__()
            self.cam = ChannelAttention(channels)
            self.sam = SpatialAttention()
    
        def forward(self, x):
            x = self.cam(x) * x
            x = self.sam(x) * x
            return x

  2. 多尺度处理 :改进 SPP 层为 ASPP 结构

模块类型 mAP@0.5 参数量 (M)
SPP 0.63 7.2
ASPP 0.68 7.9

Faster R-CNN 对比

  • 优点:two-stage 架构对模糊目标更鲁棒
  • 缺点:推理速度慢(约 15FPS vs YOLOv5 的 45FPS)

代码实战

混合数据加载

class HybridDataset:
    def __init__(self, real_data_dir, synthetic_data_dir):
        self.real_images = load_coco(real_data_dir)
        self.syn_images = load_synthetic(synthetic_data_dir)

    def __getitem__(self, idx):
        if idx < len(self.real_images):
            return self.real_images[idx]
        else:
            return self.syn_images[idx - len(self.real_images)]

SPP-ASPP 实现

class ASPP(nn.Module):
    def __init__(self, in_ch):
        super().__init__()
        self.conv1 = nn.Conv2d(in_ch, 256, 1)
        self.conv3 = nn.Conv2d(in_ch, 256, 3, padding=6, dilation=6) 
        # ... 其他扩张卷积层

    def forward(self, x):
        return torch.cat([self.conv1(x), self.conv3(x)], dim=1)

ONNX 导出技巧

torch.onnx.export(
    model, 
    dummy_input,
    "model.onnx",
    dynamic_axes={"images": {2: "height", 3: "width"}}
)

避坑指南

  1. 标注处理
  2. 对模糊目标采用软标签(soft label)
  3. 边缘框扩展 5 -10 像素

  4. 模型量化

  5. 对检测头使用 FP16 精度
  6. 校准集需包含 20% 以上小目标样本
    quant_model = quantize_dynamic(
        model,
        {nn.Linear: torch.quantization.default_dynamic_qconfig},
        dtype=torch.qint8
    )

性能验证

测试环境:RTX 3090, CUDA 11.3

场景类型 模型变体 mAP@0.5 FPS
晴天 YOLOv5s 0.75 62
雾天 YOLOv5s 0.58 61
雾天 改进版 0.67 45

经验总结

经过 3 个月的迭代验证,这套方案在真实路测中达到 92% 的召回率。关键收获:

  1. 数据层面:GAN 合成数据 + 物理去雾的组合效果最佳
  2. 模型层面:注意力机制对小目标检测提升显著
  3. 部署时建议:
  4. 使用 TensorRT 加速
  5. 对浓雾场景单独训练专用模型
正文完
 0
评论(没有评论)