共计 1968 个字符,预计需要花费 5 分钟才能阅读完成。
问题背景
雾天目标检测是计算机视觉中的经典难题。根据统计数据,雾天场景下图像的对比度平均下降 40-60%,目标边缘信噪比(SNR)降低约 30dB。主要挑战来自两方面:

- 光散射效应 :雾气中的悬浮颗粒导致光线发生 Mie 散射,使图像出现白蒙蒙的覆盖层。这种物理现象可以用公式描述为:
$$I(x) = J(x)t(x) + A(1-t(x))$$
其中 $I$ 是观测图像,$J$ 是清晰场景,$A$ 是大气光,$t$ 是透射率。
- 目标模糊 :行人 / 车辆的轮廓模糊度比晴天场景高 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 改进方案
-
注意力机制 :在 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 -
多尺度处理 :改进 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"}}
)
避坑指南
- 标注处理 :
- 对模糊目标采用软标签(soft label)
-
边缘框扩展 5 -10 像素
-
模型量化 :
- 对检测头使用 FP16 精度
- 校准集需包含 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% 的召回率。关键收获:
- 数据层面:GAN 合成数据 + 物理去雾的组合效果最佳
- 模型层面:注意力机制对小目标检测提升显著
- 部署时建议:
- 使用 TensorRT 加速
- 对浓雾场景单独训练专用模型
正文完
发表至: 未分类
近两天内
