4、经典降噪网络架构(二):U-Net架构详解、跳跃连接的意义、自注意力机制(Non-local/Transformer)、轻量化网络设计(Mobilenet/ShuffleNet变体)

好,我们接着聊降噪网络架构。上一章讲了 FFDNet 和 CBDNet,算是给 ISP 降噪打了个底。这一章要啃的硬骨头更多——U-Net、注意力机制、还有轻量化设计。这些在部署实战里几乎天天见。

我个人习惯把 U-Net 叫做「降噪界的瑞士军刀」。为什么?因为它结构简单,但改一改就能用在各种任务上。在 ISP 里,U-Net 的出镜率尤其高。

4.1 U-Net 架构:从医学图像到 ISP 的跨界明星

U-Net 最早是搞医学图像分割的,2015 年提出。但后来大家发现,它的编码器-解码器结构特别适合图像恢复任务。降噪、去模糊、超分,都能用。

核心结构就三部分:

  • 编码器(下采样):一步步缩小特征图,提取高层语义。说白了就是「看全局」。
  • 解码器(上采样):一步步恢复分辨率,把抽象特征还原成图像。
  • 跳跃连接:把编码器的特征直接拼到解码器对应层。这是 U-Net 的精髓。

我刚开始用 U-Net 做降噪时,总觉得跳跃连接可有可无。直到有一次,去掉跳跃连接后,模型输出的边缘全是锯齿……嗯,从那以后我再也不敢省这步了。

U-Net 在 ISP 降噪中的典型配置:

  • 输入:RAW 图或 RGB 图(通常 4 通道或 3 通道)
  • 下采样 4 次(每次 stride=2 卷积或 pooling)
  • 中间层:3×3 卷积 + ReLU + BN
  • 上采样:转置卷积或双线性插值 + 卷积
  • 输出:残差图(噪声估计)或直接去噪图

你想想看,为什么 U-Net 比普通 CNN 更适合降噪?因为降噪需要同时保留细节和抑制噪声。编码器丢了细节,解码器靠跳跃连接捡回来。没有跳跃连接,细节就真丢了。

U-Net 降噪架构示意图 输入图像 Conv+ReLU 下采样 Conv+ReLU 下采样 瓶颈层 上采样 Conv+ReLU 上采样 Conv+ReLU 输出图像 跳跃连接的作用 保留编码器细节 缓解梯度消失 加速收敛 编码器-解码器 编码器:提取特征,降低分辨率 解码器:恢复分辨率,生成去噪图

4.2 跳跃连接的意义:不只是「拼特征」

跳跃连接在 U-Net 里是核心,但很多人只把它当成「特征拼接」。其实它的意义更深。

我总结了三层作用:

  1. 梯度传导:深层网络的梯度可以直接通过跳跃连接传到浅层,缓解梯度消失。训练更稳。
  2. 细节保留:下采样丢了高频信息(边缘、纹理),跳跃连接把这些信息直接送到解码器。降噪时边缘更锐利。
  3. 多尺度融合:浅层特征分辨率高、语义弱;深层特征分辨率低、语义强。拼接在一起,相当于模型同时看了「局部细节」和「全局结构」。

部署小技巧:

在移动端部署 U-Net 时,跳跃连接会带来额外的内存开销。我曾经在某个项目里,因为跳跃连接导致显存爆了。后来改成「加法拼接」而不是「通道拼接」,省了一半内存,效果几乎没变。

说白了,跳跃连接就是 U-Net 的「记忆线」。没有它,解码器就是盲人摸象。

4.3 自注意力机制:Non-local 和 Transformer 在降噪中的应用

CNN 有个天然缺陷:感受野有限。3×3 卷积只能看到周围 9 个像素。对于大面积的噪声(比如暗光下的彩色噪声),CNN 经常力不从心。

自注意力机制就是来解决这个问题的。它让每个像素都能「看到」整张图。

4.3.1 Non-local 模块

Non-local 是 2018 年提出的,核心思想很简单:计算所有像素之间的相似度,然后用相似度加权聚合特征。

公式长这样(别怕,理解意思就行):

y_i = (1 / C(x)) * Σ_j f(x_i, x_j) * g(x_j)

其中 f 是相似度函数(点积或高斯),g 是特征变换。说白了就是:每个像素的新值,是所有像素的加权平均,权重由相似度决定。

我在项目中用过 Non-local 做降噪,效果确实好,但计算量也大。一张 1080p 的图,Non-local 能跑几十秒。部署时基本要砍掉。

部署警告:

Non-local 的计算复杂度是 O(N²),N 是像素数。对于 512×512 的图,N=262144,计算量约 680 亿次。移动端基本跑不动。建议只在瓶颈层使用,或者用局部注意力替代。

4.3.2 Transformer 在降噪中的应用

Transformer 原本是 NLP 的,但这两年杀进 CV 领域了。在降噪里,Transformer 主要用来建模长距离依赖。

典型结构是:把图像切成 patch(比如 8×8),每个 patch 当成一个 ,然后用自注意力计算 之间的关系。

我试过 SwinIR 和 Uformer,效果确实比 CNN 好,但部署难度也大。Transformer 的显存占用和计算量都高,量化时精度掉得也厉害。

方法 感受野 计算量 部署难度 降噪效果
普通 CNN 局部(3×3~7×7) 低 低 一般
U-Net 多尺度 中 中 好
Non-local 全局 极高 极高 很好
Transformer 全局(patch 级) 高 高 很好

4.4 轻量化网络设计:MobileNet 和 ShuffleNet 变体

在 ISP 里部署降噪模型,最头疼的就是算力限制。手机芯片、安防摄像头、无人机,算力都有限。轻量化设计是必修课。

4.4.1 MobileNet 的核心:深度可分离卷积

MobileNet 的核心就是深度可分离卷积。把标准卷积拆成两步:

  • 深度卷积:每个通道单独卷积,不跨通道。
  • 逐点卷积:1×1 卷积,跨通道融合。

计算量对比:标准卷积是 K²×C_in×C_out×H×W,深度可分离是 K²×C_in×H×W + C_in×C_out×H×W。当 K=3 时,计算量大约减少到 1/9。

我曾在某款安防芯片上部署 MobileNet 变体的降噪模型。原来标准卷积的模型跑 30fps,换成深度可分离后直接跑到 90fps,效果只掉了 0.3dB。这买卖划算。

4.4.2 ShuffleNet 的核心:通道混洗

ShuffleNet 在 MobileNet 基础上更进一步。它用分组卷积 + 通道混洗来减少计算量。

通道混洗的作用是让不同分组的特征能够交互。否则分组卷积就像「各自为政」,信息不流通。

ShuffleNet v2 还提出了四条实用准则:

  1. 输入输出通道数相等时,内存访问成本最低。
  2. 分组数不宜过大(建议 2~4 组)。
  3. 碎片化操作(如多分支)会降低并行效率。
  4. 逐元素操作(如 ReLU、加法)也有成本,不能忽略。

轻量化降噪网络设计建议:

  • 用深度可分离卷积替代标准卷积(计算量降 80%~90%)
  • 控制通道数,不要超过 128(移动端建议 32~64)
  • 减少下采样次数(3 次足够,4 次会丢太多细节)
  • 用加法拼接替代通道拼接(省显存)
  • 量化到 INT8(精度损失通常小于 0.5dB)

4.4.3 轻量化 U-Net 实战案例

我在一个手机 ISP 项目里,把标准 U-Net 改成了轻量化版本:

  • 编码器:用深度可分离卷积,通道数从 64 降到 32
  • 跳跃连接:用加法替代拼接
  • 瓶颈层:用 1×1 卷积压缩通道
  • 解码器:双线性插值上采样,不用转置卷积

最终模型大小从 12MB 降到 1.8MB,推理速度从 50ms 降到 12ms(骁龙 865),PSNR 只掉了 0.2dB。

嗯,这就是轻量化的魅力。不是所有场景都需要大模型,有时候「够用就好」才是工程的真谛。