3. AI ISP核心组件

各位同学,今天我们来啃AI ISP里最硬核的三块内容。CNN怎么把一张糊图变清晰?轻量化网络怎么塞进芯片还不掉帧?注意力机制到底在“注意”什么?

这三样东西,说白了就是AI ISP的“发动机”、“变速箱”和“方向盘”。我做了这么多年ISP算法,踩过的坑有一半都跟这三块有关。咱们一个一个说。

3.1 CNN在图像恢复中的应用:从“盲猜”到“有依据”

传统ISP做去噪、超分、去马赛克,靠的是手工设计的滤波器。效果嘛,遇到简单场景还行,碰上复杂纹理就露馅了。CNN进来以后,整个局面变了——它学会了从数据里“看”出噪声和细节的规律。

我个人习惯把CNN在图像恢复里的角色分成三类:

  • 端到端映射:输入噪声图,直接输出干净图。典型代表是DnCNN、SRCNN。简单粗暴,但计算量大。
  • 残差学习:让网络去学“噪声”本身,而不是直接学干净图。我当年在项目里用ResNet做去噪,收敛速度比直接映射快了一倍不止。
  • 多阶段细化:先粗恢复,再细调。比如先做去噪,再做超分,分步走。这样做的好处是每个阶段可以单独优化,部署时也容易拆开。

关键洞察:CNN在图像恢复中的核心能力,其实是“非线性映射+局部感受野”。它能把一个像素周围几十个像素的关系学明白,这是传统滤波器做不到的。

举个例子,去马赛克(Demosaicing)这个任务。传统方法用插值,Bayer阵列里每个像素只采集一种颜色,另外两种颜色靠猜。CNN呢?它直接学一个映射:从Bayer模式的RAW图到完整RGB图。我在一个4K sensor项目里试过,CNN去马赛克比传统方法减少了30%的伪彩色,代价是计算量翻了5倍。嗯,这就是我们要面对的现实——效果和算力的博弈。

3.2 轻量化网络设计:MobileNet与ShuffleNet的ISP变体

把CNN塞进手机SoC或者边缘设备里,第一个拦路虎就是算力。你想想看,一个4K视频流,每秒30帧,每帧几百万像素,网络再大一点,芯片直接冒烟。

所以轻量化网络不是“可选项”,是“必选项”。MobileNet和ShuffleNet是两条主流路线,但直接拿来用往往不行——ISP场景有自己的特殊性。

3.2.1 MobileNet变体:深度可分离卷积的ISP适配

MobileNet的核心是深度可分离卷积(Depthwise Separable Convolution)。把标准卷积拆成两步:先做逐通道的深度卷积,再做1x1的点卷积。参数量能降到原来的1/8到1/9。

但我在实际部署时发现一个问题:深度卷积对每个通道独立处理,通道间的信息交互全靠后面的1x1卷积。在ISP任务里,比如去噪,不同通道的噪声特性可能差异很大,深度卷积学起来有点吃力。

我的做法是加一个“通道注意力”模块在深度卷积之后,让网络自己决定每个通道的重要性。代码大概长这样:

class ISP_MobileBlock(nn.Module):
    def __init__(self, in_ch, out_ch, stride):
        super().__init__()
        self.depthwise = nn.Conv2d(in_ch, in_ch, 3, stride, 1, groups=in_ch)
        self.pointwise = nn.Conv2d(in_ch, out_ch, 1)
        self.se = SEModule(out_ch, reduction=4)  # 通道注意力

    def forward(self, x):
        x = self.depthwise(x)
        x = self.pointwise(x)
        x = self.se(x)  # 重新校准通道权重
        return x

实战技巧:在ISP场景里,MobileNet的宽度乘数(alpha)我一般设0.75到1.0之间。设太小了,去噪能力下降明显;设太大了,帧率保不住。0.75是个不错的平衡点。

3.2.2 ShuffleNet变体:通道混洗的妙用

ShuffleNet的思路跟MobileNet不同。它用分组卷积(Group Convolution)加通道混洗(Channel Shuffle)来降低计算量。分组卷积把输入通道分成几组,每组独立做卷积,计算量直接除以组数。但问题是,组与组之间没有信息流通。通道混洗就是解决这个问题的——把不同组的通道打乱,再送到下一层。

我记得在做一个夜景降噪项目时,ShuffleNet v2的表现比MobileNet v2好了一截。原因可能是通道混洗让不同频段的信息更充分地融合了——夜景里的低频噪声和高频细节需要协同处理。

不过要注意,ShuffleNet的分组数不能太大。我试过g=8,结果精度掉了不少。一般g=2或g=4比较稳妥。

网络变体 核心机制 ISP场景优势 部署注意事项
MobileNet v2/v3 深度可分离卷积 + 倒残差 参数量小,易于硬件加速 深度卷积在部分NPU上效率低
ShuffleNet v2 分组卷积 + 通道混洗 通道融合好,适合多频段任务 分组数需调优,g=2~4最佳
ISP专用变体 上述结构 + 注意力/残差 针对噪声/色彩/纹理优化 需结合ISP pipeline裁剪

3.3 注意力机制:让网络学会“看哪里”

注意力机制,说白了就是告诉网络:“别什么都看,重点看有用的地方。”在ISP场景里,这个能力特别重要——一张图里,天空是平滑的,草地是纹理丰富的,人脸是边缘锐利的。不同区域需要的处理方式完全不同。

3.3.1 通道注意力:SENet的思路

SENet(Squeeze-and-Excitation Network)是最经典的通道注意力。它先对特征图做全局平均池化,压缩成一个通道描述符,然后通过两个全连接层学习每个通道的权重,最后乘回原特征图。

我在做AI ISP时,几乎每个模块后面都挂了SE模块。效果提升肉眼可见,尤其是去噪任务——网络学会了给噪声大的通道降权,给细节多的通道升权。

3.3.2 空间注意力:CBAM与坐标注意力

通道注意力告诉网络“看什么通道”,空间注意力告诉网络“看哪里”。CBAM把两者串起来,先做通道注意力,再做空间注意力。但CBAM的空间注意力用的是7x7卷积,计算量不小。

我更喜欢用坐标注意力(Coordinate Attention)。它把空间信息分解成水平和垂直两个方向,分别做池化和卷积,最后融合。这样做有两个好处:一是计算量小,二是能保留位置信息——在ISP里,边缘和纹理的位置信息非常关键。

避坑指南:我曾经在一个HDR项目里直接用了CBAM,结果帧率掉了15%。后来换成坐标注意力,帧率只掉了5%,效果还更好。所以,注意力机制不是越复杂越好,得看你的硬件能不能扛得住。

3.3.3 自注意力与Transformer的ISP尝试

最近Transformer也杀进ISP领域了。自注意力机制能捕捉全局依赖关系,对去模糊、去雨等任务特别有效。但问题是,自注意力的计算量跟图像尺寸的平方成正比。4K图像直接用自注意力,显存直接爆炸。

我的建议是:在低分辨率特征图上用自注意力,或者用窗口注意力(如Swin Transformer)。我在一个去雨项目里试过,在1/4分辨率的特征图上加自注意力,效果提升明显,计算量也能接受。

AI ISP核心组件关系图 RAW / 噪声图 CNN图像恢复 去噪 / 超分 / 去马赛克 轻量化网络 MobileNet / ShuffleNet变体 注意力机制 通道 / 空间 / 自注意力 特征融合与优化 残差连接 / 多尺度融合 / 知识蒸馏 高质量RGB图 部署关键 • 量化感知训练 • 算子融合 • 内存带宽优化

3.4 三者的协同:一个实际案例

光讲理论没意思,我分享一个实际项目里的做法。去年做一个手机夜景模式,要求1080p 30fps实时处理,功耗控制在500mW以内。

我们的方案是这样的:

  1. 前端用ShuffleNet v2变体做轻量级去噪,分组数设4,通道数64。这一步把噪声压下去,同时保留边缘。
  2. 中间插坐标注意力,在特征图上做空间权重校准。天空区域平滑,纹理区域增强。
  3. 后端用MobileNet v3的倒残差块做超分和色彩重建。这里用了SE模块做通道注意力,让网络自己决定R/G/B通道的权重。

最终效果:PSNR比传统ISP高了2.3dB,功耗480mW,帧率稳定在30fps。嗯,这个结果让我挺满意的。

我的建议:别一上来就堆大网络。先跑通一个小网络,看瓶颈在哪——是去噪不够?还是色彩偏了?然后针对性地加注意力或者换网络结构。迭代比一次到位靠谱得多。