AODNet预训练实战:解决小样本场景下的图像去雾难题

1次阅读
没有评论

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

image.webp

为什么图像去雾值得关注

在自动驾驶、航拍监测等场景中,雾气会导致关键物体识别率下降 40% 以上。传统基于物理模型的方法(如暗通道先验)依赖人工设计的先验知识,难以适应复杂多变的真实雾天环境。

AODNet 预训练实战:解决小样本场景下的图像去雾难题

小样本去雾的两大核心痛点

  1. 物理模型偏差问题
  2. 传统方法假设大气光恒定,但实际场景中存在点光源、反射光等干扰
  3. 大气散射模型 $I(x)=J(x)t(x)+A(1-t(x))$ 中, 透射率图 $t(x)$ 的估计误差会随传播累积

  4. 数据饥渴现象

  5. 真实雾天数据标注成本高(需同步拍摄无雾图像)
  6. 实验显示:当训练样本 <1000 张时,PSNR 指标波动超过 3dB(附模拟曲线):
    # 小样本训练曲线示例
    plt.plot(epochs, psnr_val, label='5k samples')
    plt.plot(epochs, psnr_sparse, '--', label='500 samples')

AODNet 的轻量级解决方案

网络结构创新

采用端到端编码器 - 解码器结构,核心是大气散射模型的嵌入式学习:
$$\hat{J}(x) = \frac{I(x) – A}{\max(t(x),0.1)} + A$$
其中:
– $A$ 通过全局平均池化层估计
– $t(x)$ 由 3 个卷积块组成的轻量级分支预测

预训练数据工程

合成数据时采用 HSV 空间增强:

  1. 色相扰动:±15°随机旋转
  2. 饱和度缩放:0.8~1.2 倍随机系数
  3. 明度噪声:添加 5% 高斯噪声

关键 PyTorch 实现:

class AODBlock(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 16, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(16+3, 32, kernel_size=5, padding=2)  # 多尺度特征融合

    def forward(self, x):
        feat1 = F.relu(self.conv1(x))
        feat2 = torch.cat([x, feat1], dim=1)  # 通道拼接
        return self.conv2(feat2)

工业级训练技巧

精度与效率平衡

采用 AMP 混合精度训练(节省 30% 显存):

scaler = torch.cuda.amp.GradScaler()
with torch.cuda.amp.autocast():
    output = model(input)
    loss = criterion(output, target)
scaler.scale(loss).backward()
scaler.step(optimizer)

关键超参组合

  • batch_size=16 时推荐 lr=1e-4
  • batch_size=32 时建议 lr=5e-5(线性缩放规则)

部署避坑指南

  1. 量化部署陷阱
  2. TensorRT 要求输入通道数对齐 4 的倍数
  3. 解决方案:

    pad = (4 - in_channels % 4) % 4  # 动态计算补零数
    self.pad = nn.ZeroPad2d((0,0,0,pad)) 

  4. 显存优化

  5. 使用梯度检查点技术:
    from torch.utils.checkpoint import checkpoint
    def forward(self, x):
        return checkpoint(self._forward, x)

待解决的开放问题

如何实现雾浓度估计与去雾的协同优化?现有方案中二者往往是解耦的,这可能导致:
– 浓雾区域去雾不足
– 薄雾区域过度增强
或许可以借鉴扩散模型中的条件引导机制,将雾浓度作为控制变量引入网络。

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