CAE卷积自编码器实战:从零构建图像降噪模型

1次阅读
没有评论

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

image.webp

为什么需要 CAE?传统降噪的瓶颈

在图像处理中,高斯滤波、中值滤波等传统方法就像用同一把梳子给所有人梳头——简单粗暴但效果有限。它们会无差别模糊整张图片,导致边缘细节丢失(比如下图右侧树叶纹理完全糊掉)。而 CAE 的智能之处在于:

CAE 卷积自编码器实战:从零构建图像降噪模型

  • 像人类一样学习图像本质特征
  • 自动区分噪声与真实内容
  • 对不同类型的噪声自适应处理

解剖 CAE:比普通自编码器强在哪?

普通自编码器(AE)就像用全连接网络搭建的‘传送带’:

  1. 输入图像被展平成一维向量(破坏空间结构)
  2. 中间层像压缩包一样存储信息
  3. 输出层试图还原原始尺寸

而 CAE 引入了两大神器:

  • 卷积层:像放大镜一样逐区域扫描,保留局部特征(如边缘、纹理)
  • 池化层:逐步抽象高层语义(类似人眼从像素→边缘→物体部分的认知过程)

手把手搭建 CAE 模型

环境准备

import torch
import torch.nn as nn
import torchvision.transforms as transforms
from torchvision.datasets import CIFAR10

Encoder 设计要点

class Encoder(nn.Module):
    def __init__(self):
        super().__init__()
        # 卷积核 size= 3 能捕捉 8 邻域特征,stride= 2 实现下采样
        self.conv1 = nn.Conv2d(3, 32, kernel_size=3, stride=2, padding=1)  # 32x16x16
        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=2, padding=1) # 64x8x8

    def forward(self, x):
        x = torch.relu(self.conv1(x))
        x = torch.relu(self.conv2(x))
        return x

Decoder 的逆操作

class Decoder(nn.Module):
    def __init__(self):
        super().__init__()
        # 转置卷积实现上采样
        self.t_conv1 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, output_padding=1)
        self.t_conv2 = nn.ConvTranspose2d(32, 3, kernel_size=3, stride=2, padding=1, output_padding=1)

    def forward(self, x):
        x = torch.relu(self.t_conv1(x))
        x = torch.sigmoid(self.t_conv2(x))  # 输出压缩到 0 - 1 范围
        return x

实战中的血泪经验

数据增强的奇技淫巧

当只有少量数据时:

  • 对输入图片随机旋转 5 度(防止模型死记硬背)
  • 添加随机亮度扰动(模拟真实噪声场景)
  • 使用 cutout 随机遮挡(增强鲁棒性)
transform = transforms.Compose([transforms.RandomRotation(5),
    transforms.ColorJitter(brightness=0.1),
    transforms.ToTensor(),])

显存不够怎么破?

  1. 把 batch_size 从 32 降到 16
  2. 使用梯度累积:每 4 个 batch 更新一次参数
  3. 尝试混合精度训练
    scaler = torch.cuda.amp.GradScaler()
    with torch.cuda.amp.autocast():
        output = model(input)
        loss = criterion(output, target)
    scaler.scale(loss).backward()

进阶思考题

  1. 视频降噪中如何利用时间连续性?可以尝试将 CAE 与 LSTM 结合
  2. 能否用 CAE 做图像压缩?分析量化编码对重构质量的影响

完整代码已放在 Colab: 点击运行

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