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 更适合降噪?因为降噪需要同时保留细节和抑制噪声。编码器丢了细节,解码器靠跳跃连接捡回来。没有跳跃连接,细节就真丢了。
4.2 跳跃连接的意义:不只是「拼特征」
跳跃连接在 U-Net 里是核心,但很多人只把它当成「特征拼接」。其实它的意义更深。
我总结了三层作用:
- 梯度传导:深层网络的梯度可以直接通过跳跃连接传到浅层,缓解梯度消失。训练更稳。
- 细节保留:下采样丢了高频信息(边缘、纹理),跳跃连接把这些信息直接送到解码器。降噪时边缘更锐利。
- 多尺度融合:浅层特征分辨率高、语义弱;深层特征分辨率低、语义强。拼接在一起,相当于模型同时看了「局部细节」和「全局结构」。
部署小技巧:
在移动端部署 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 还提出了四条实用准则:
- 输入输出通道数相等时,内存访问成本最低。
- 分组数不宜过大(建议 2~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。
嗯,这就是轻量化的魅力。不是所有场景都需要大模型,有时候「够用就好」才是工程的真谛。