共计 1430 个字符,预计需要花费 4 分钟才能阅读完成。
为什么图像去雾值得关注
在自动驾驶、航拍监测等场景中,雾气会导致关键物体识别率下降 40% 以上。传统基于物理模型的方法(如暗通道先验)依赖人工设计的先验知识,难以适应复杂多变的真实雾天环境。

小样本去雾的两大核心痛点
- 物理模型偏差问题
- 传统方法假设大气光恒定,但实际场景中存在点光源、反射光等干扰
-
大气散射模型 $I(x)=J(x)t(x)+A(1-t(x))$ 中, 透射率图 $t(x)$ 的估计误差会随传播累积
-
数据饥渴现象
- 真实雾天数据标注成本高(需同步拍摄无雾图像)
- 实验显示:当训练样本 <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 空间增强:
- 色相扰动:±15°随机旋转
- 饱和度缩放:0.8~1.2 倍随机系数
- 明度噪声:添加 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(线性缩放规则)
部署避坑指南
- 量化部署陷阱
- TensorRT 要求输入通道数对齐 4 的倍数
-
解决方案:
pad = (4 - in_channels % 4) % 4 # 动态计算补零数 self.pad = nn.ZeroPad2d((0,0,0,pad)) -
显存优化
- 使用梯度检查点技术:
from torch.utils.checkpoint import checkpoint def forward(self, x): return checkpoint(self._forward, x)
待解决的开放问题
如何实现雾浓度估计与去雾的协同优化?现有方案中二者往往是解耦的,这可能导致:
– 浓雾区域去雾不足
– 薄雾区域过度增强
或许可以借鉴扩散模型中的条件引导机制,将雾浓度作为控制变量引入网络。
正文完
