共计 2338 个字符,预计需要花费 6 分钟才能阅读完成。
背景与痛点分析
雨天环境下采集的图像常存在雨纹遮挡、对比度下降等问题,直接影响自动驾驶的物体检测准确率和监控系统的识别性能。传统方法如高斯滤波或非局部均值去噪存在明显局限性:

- 高频雨纹与图像细节频谱重叠,导致去雨同时损失边缘信息
- 雨线方向随机性使基于方向滤波的方法失效
- 大雨密度时出现雨雾效应,传统方法无法联合处理
相比而言,深度学习方法通过数据驱动可自动学习雨纹特征。CVPR’17 提出的深度细节网络(Detail-recovery Network)创新性地将问题分解为高频细节重建和低频内容恢复两个子任务,在 Rain100H 数据集上 PSNR 达到 27.6dB,较同期算法提升 2.3dB。
网络架构解析
三层核心结构
-
基础层(Base Layer)
采用 7×7 大卷积核捕捉低频背景:B = ReLU(Conv_{7×7}(I_{rain}))其中 $I_{rain}$ 为输入图像,输出基础层特征图 $B∈R^{H×W×64}$
-
细节层(Detail Layer)
级联 3 个残差块提取高频细节,每个块含:D_i = D_{i-1} + Conv_{3×3}(ReLU(Conv_{3×3}(D_{i-1})))输出细节特征 $D∈R^{H×W×128}$
-
重建层(Reconstruction Layer)
通过特征融合模块合并多尺度信息:R = Conv_{1×1}([B↑, D, B↓])$[·]$ 表示通道拼接,$↑/↓$ 为双线性插值上 / 下采样
多尺度融合机制
设计金字塔式特征提取策略:
- 基础层输出下采样至 1 / 2 和 1 / 4 尺度
- 各尺度特征经 3×3 卷积后加权求和:
F_{fusion} = ∑_{s=1}^4 α_s·Conv_{3×3}(B_s)系数 $α_s$ 通过可学习参数自适应调整
PyTorch 实现详解
数据加载
class RainDataset(Dataset):
def __init__(self, root, patch_size=64):
self.clean_paths = sorted(glob(f'{root}/clean/*.png'))
self.rain_paths = sorted(glob(f'{root}/rain/*.png'))
self.ps = patch_size
def __getitem__(self, idx):
clean = TF.to_tensor(Image.open(self.clean_paths[idx]))
rain = TF.to_tensor(Image.open(self.rain_paths[idx]))
# 随机裁剪
i, j = random.randint(0, clean.shape[1]-self.ps), \
random.randint(0, clean.shape[2]-self.ps)
clean = clean[:, i:i+self.ps, j:j+self.ps]
rain = rain[:, i:i+self.ps, j:j+self.ps]
return rain, clean
模型定义
class DetailNet(nn.Module):
def __init__(self):
super().__init__()
# 基础层
self.base = nn.Sequential(nn.Conv2d(3, 64, 7, padding=3),
nn.ReLU())
# 细节层
self.detail = nn.Sequential(ResBlock(64, 128), # 自定义残差块
ResBlock(128, 128),
ResBlock(128, 128)
)
# 重建层
self.recon = nn.Conv2d(64+128+64, 3, 1)
def forward(self, x):
b = self.base(x) # 基础特征
d = self.detail(b) # 细节特征
# 多尺度融合
b_up = F.interpolate(b, scale_factor=2)
b_down = F.interpolate(b, scale_factor=0.5)
out = self.recon(torch.cat([b_up, d, b_down], dim=1))
return torch.sigmoid(out)
损失函数
组合 L1 损失与 SSIM 损失(λ=0.05):
def loss_fn(pred, target):
l1_loss = F.l1_loss(pred, target)
ssim_loss = 1 - ssim(pred, target) # 需提前实现 SSIM 计算
return l1_loss + 0.05 * ssim_loss
实验对比
在 Rain100H 测试集上的性能指标:
| 方法 | PSNR ↑ | SSIM ↑ | 推理时间(ms) |
|---|---|---|---|
| Gaussian | 18.7 | 0.62 | 12 |
| DSC | 23.1 | 0.81 | 28 |
| DetailNet | 27.6 | 0.89 | 34 |
显存占用与 batch size 关系(GTX 1080Ti):
- batch=8 → 3.2GB
- batch=16 → 5.1GB
- batch=32 → OOM(超出 11GB 显存)
训练技巧
学习率调整
采用余弦退火策略:
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6)
过拟合应对
- 数据增强:添加随机旋转 (90°,180°,270°) 和水平翻转
- 早停机制:验证集 PSNR 连续 5 轮不提升时终止训练
- 权重衰减:设置 λ =1e- 4 的 L2 正则化
延伸思考
视频去雨可考虑以下改进方向:
- 时序特征利用:在细节层加入 3D 卷积或 LSTM 模块
- 光流引导:相邻帧运动补偿提升稳定性
- 实时优化:将重建层替换为轻量级 MobileNet 块
实验表明,该方案在静态图像去雨任务中具有显著优势,但处理视频时需考虑时序一致性。后续研究可结合光流估计进一步提升动态场景表现。
正文完
发表至: 未分类
近一天内
