3、AI ISP核心组件:基于CNN的去噪模块、基于GAN的超分辨率、基于Transformer的色彩重建
各位好,欢迎来到第三章。今天咱们聊聊AI ISP里最核心的三个“打手”——CNN去噪、GAN超分、Transformer色彩重建。这三个模块,说白了就是现代AI ISP的“三驾马车”。我个人习惯把它们比作一个摄影团队:CNN是那个负责清理画面噪点的后期修图师,GAN是那个能把小图脑补成大图的“想象力担当”,而Transformer则是那个对色彩极其敏感、能把灰蒙蒙的片子调出电影感的调色师。
嗯,咱们一个一个来看。
3.1 基于CNN的去噪模块:从“磨皮”到“智能降噪”
去噪,是ISP最古老也最头疼的问题之一。传统方法像什么中值滤波、双边滤波,说白了就是“暴力磨皮”,细节和噪点一起干掉。我在项目中遇到过,用双边滤波处理夜景照片,人脸是光滑了,但头发丝和衣服纹理全糊了,用户投诉说“照片像油画”。
CNN来了之后,情况完全不一样了。它学的是“哪些是噪点,哪些是细节”,然后只对噪点下手。
3.1.1 经典架构:U-Net与残差学习
目前工业界最常用的去噪CNN架构,我个人推荐U-Net。为什么?因为它有“编码-解码”结构,能同时捕捉全局上下文和局部细节。你想想看,一张照片里的噪点,有的在暗部(全局),有的在边缘(局部),U-Net正好两头都能照顾到。
另一个关键技巧是残差学习。模型不直接学“干净图像”,而是学“噪声图”。输入是带噪图,输出是噪声,然后用输入减去噪声得到干净图。这样做的好处是,模型只需要关注“差异”,学习难度大大降低。
核心公式:
I_clean = I_noisy - N(I_noisy)
其中N(·)是CNN预测的噪声图。
我曾经在低光场景下测试过,直接学干净图,PSNR大概在32dB左右;换成残差学习,直接跳到36dB。差距很明显。
3.1.2 实战中的“坑”与避坑指南
这里分享一个我踩过的坑。有一次,我用一个在公开数据集上训练好的去噪模型,直接部署到手机ISP流水线上。结果发现,拍出来的照片在天空区域出现了奇怪的“色块”。
避坑指南:我曾经以为公开数据集(如SIDD)足够通用,但忽略了真实传感器噪声的“非高斯性”。手机传感器的噪声,其实是“泊松-高斯混合噪声”,而且不同ISO下噪声分布完全不同。解决方案是:在训练时加入“噪声模拟器”,模拟真实传感器的噪声特性。
另外,计算量也是个问题。U-Net虽然效果好,但参数量大,移动端跑不动。我建议用“轻量化设计”,比如用深度可分离卷积替换标准卷积,或者用“通道注意力”机制(如ECA-Net)来减少冗余计算。
3.2 基于GAN的超分辨率:让模糊变清晰,但别“脑补”过头
超分辨率(SR),说白了就是“放大图片并补全细节”。传统方法插值出来的图,边缘是锯齿状的,像马赛克。GAN的出现,让SR有了“想象力”——它能生成高频细节,让放大后的照片看起来像真的。
3.2.1 SRGAN与ESRGAN:从“像”到“真”
SRGAN是开山之作。它用生成器做上采样,用判别器判断“这是真实高分辨率图还是生成的”。生成器为了骗过判别器,会努力生成更逼真的纹理。
但SRGAN有个问题:生成的纹理有时候是“假的”。比如,一张人脸照片放大后,GAN可能会在皮肤上“脑补”出毛孔,但位置和真实情况对不上。这就是所谓的“伪影”。
后来ESRGAN做了改进,引入了“残差密集块”(RRDB)和“相对判别器”。我个人在项目中测试过,ESRGAN生成的纹理更自然,伪影少了很多。但注意,它依然不是“无损放大”,只是“看起来合理”。
我的经验:在安防监控场景下,人脸超分用GAN效果很好,因为人眼对“是否像真人”很敏感。但在医学影像(如CT)上,我坚决不用GAN,因为“脑补”出来的细节可能会误导医生诊断。这种情况下,我更推荐用基于CNN的“保真度优先”超分模型。
3.2.2 训练GAN的“玄学”
训练GAN,说白了就是“生成器和判别器打架”。我刚开始做的时候,经常遇到“模式崩塌”——生成器只学会生成一种纹理,比如所有草地都生成同一种草。
怎么解决?我建议用“WGAN-GP”损失函数,它用Wasserstein距离代替JS散度,训练更稳定。另外,学习率要调小,我一般设成1e-4,判别器比生成器多训练一步。
3.3 基于Transformer的色彩重建:从“调色盘”到“全局理解”
色彩重建,包括白平衡、色调映射、色彩校正等。传统方法依赖统计假设(如灰度世界假设),但遇到复杂光源(比如舞台灯光)就崩了。Transformer的优势在于,它能通过自注意力机制,理解“全局色彩关系”。
3.3.1 为什么是Transformer?
CNN的感受野是局部的,它看一个像素的颜色,只能看到周围一小块区域。但色彩是全局的——比如一张夕阳照片,天空的暖色和地面的冷色是相互影响的。Transformer的self-attention能让每个像素“看到”整张图,从而做出更合理的色彩调整。
我举个例子。有一次处理一张室内照片,一半是暖色灯光,一半是自然光。传统方法要么整体偏暖,要么整体偏冷。用Transformer模型,它自动识别出“左侧是暖光源,右侧是冷光源”,然后分别做白平衡,效果非常自然。
3.3.2 实战架构:IPT与Restormer
目前比较成熟的方案是IPT(Image Processing Transformer)和Restormer。IPT把图像切成patch,然后用Transformer编码器处理,最后用解码器重建。Restormer则引入了“多尺度”和“门控机制”,计算量更小。
这里给出一段简化的Restormer核心代码(PyTorch风格):
class RestormerBlock(nn.Module):
def __init__(self, dim):
super().__init__()
self.norm1 = LayerNorm(dim)
self.self_attn = MultiHeadAttention(dim, num_heads=8)
self.norm2 = LayerNorm(dim)
self.ffn = FeedForward(dim, hidden_dim=dim*4)
def forward(self, x):
x = x + self.self_attn(self.norm1(x))
x = x + self.ffn(self.norm2(x))
return x
注意:Transformer的计算量是O(n²),n是patch数量。对于4K图像,patch数量可能达到几十万,显存直接爆炸。我建议用“窗口注意力”(如Swin Transformer)或“轴向注意力”来降低复杂度。
3.4 三者的协同:AI ISP的“混合架构”
在实际ISP流水线中,这三个模块不是孤立的。我通常这样安排:
- 先去噪,再超分:如果先超分,噪点会被放大,后续去噪更难。
- 色彩重建放在最后:因为去噪和超分可能会改变色彩分布,最后做色彩重建可以统一校正。
下面这张图展示了我在一个项目中使用的混合架构流程:
嗯,这个流程我用了两年了,效果稳定。但要注意,每个模块的输入输出格式要统一。比如CNN去噪输出是16位线性数据,GAN超分可能要求8位sRGB,中间需要做格式转换。我曾经因为忘记做gamma校正,导致色彩重建模块输入数据范围不对,结果输出偏色严重。
3.5 性能对比与选型建议
最后,我整理了一个表格,方便大家在实际项目中做选型参考:
| 模块 | 优势 | 劣势 | 适用场景 | 推荐模型 |
|---|---|---|---|---|
| CNN去噪 | 速度快,保真度高 | 细节恢复有限 | 移动端、实时视频 | U-Net轻量版 |
| GAN超分 | 纹理逼真,视觉效果好 | 可能产生伪影,训练不稳定 | 照片美化、安防人脸放大 | ESRGAN |
| Transformer色彩 | 全局色彩准确,适应复杂光源 | 计算量大,显存占用高 | 专业摄影、影视后期 | Restormer |
我的建议:如果你做的是手机ISP,算力有限,优先保证CNN去噪和轻量级色彩校正,GAN超分可以做成“可选增强”功能,让用户自己决定是否开启。如果是云端处理,那三个模块全上,效果拉满。