3. AI ISP核心算法

这一章,我们聊聊 AI ISP 里最核心的几个算法模块。去噪、超分辨率、HDR、AWB、AE——这些名字你肯定不陌生。但把它们塞进一个实时 ISP Pipeline 里,还要在 RTL 上跑得动,那就是另一回事了。

我个人习惯把算法分成两类:一类是“画质修复型”,比如去噪和超分;另一类是“场景适应型”,比如 HDR、AWB 和 AE。前者主要靠模型能力,后者更多依赖策略和统计。咱们一个一个拆开看。

核心观点: AI ISP 不是简单地把某个 CNN 模型塞进传统流程,而是要让算法理解 sensor 的物理特性,同时适配硬件流水线的时序和带宽约束。

3.1 去噪算法:从空域到频域,再到 AI

去噪是 ISP 里最基础也最头疼的问题。传统方法有 BM3D、NLM,效果不错但太慢。后来有了 CNN 去噪,比如 DnCNN、FFDNet,效果更好,但计算量也上来了。

在 AI ISP 里,我建议把去噪分成两级:

  • 轻量级去噪: 放在前端,处理 sensor 的 raw 域噪声。常用小卷积核 + 残差结构,模型大小控制在 50K 参数以内。
  • 深度去噪: 放在后端,处理 RGB 域的复杂噪声。可以用 U-Net 变体,但要注意延迟。

我在项目中遇到过一个问题:模型在训练集上 PSNR 很高,但实际拍摄夜景时,暗部出现了奇怪的条纹。后来发现是 sensor 的读出噪声分布和训练数据不一致。嗯,这里要注意——训练数据必须覆盖 sensor 的真实噪声模型,否则模型会“过拟合”到仿真噪声上。

避坑指南: 我曾经在某个项目中,直接把公开数据集训好的去噪模型部署到 ISP 里,结果效果一塌糊涂。后来花了两个月重新采集 sensor 的噪声特性,才把效果拉回来。记住:噪声模型是去噪算法的地基。

3.2 超分辨率算法:细节重建的艺术

超分辨率(SR)在 AI ISP 里主要做两件事:一是提升分辨率(比如从 1080p 到 4K),二是补偿光学系统的 MTF 损失。说白了,就是让图像更清晰。

SR 模型的主流架构有:

架构 特点 适用场景 硬件代价
ESPCN 亚像素卷积,效率高 实时视频超分 低
EDSR 残差块堆叠,效果好 静态图像超分 高
RCAN 通道注意力,细节丰富 高质量输出 极高
FSRCNN 紧凑结构,速度快 移动端 ISP 极低

我个人比较推荐 ESPCN 作为 ISP 里的 SR 主力。为什么?因为它把上采样放在最后一层,前面的计算都在低分辨率空间进行,计算量小很多。你想想看,如果全程在高分辨率空间做卷积,带宽和计算量都扛不住。

但 ESPCN 有个坑:它对输入的低频信息比较敏感。如果输入图像本身模糊,超分效果会大打折扣。所以我的做法是:在 SR 前面加一个轻量的锐化模块,先把边缘提一提,再送进 ESPCN。

注意: 超分辨率模型在 RTL 实现时,最头疼的是“边界处理”。卷积核在图像边缘需要 padding,而不同的 padding 方式会导致超分结果出现“黑边”或“伪影”。我建议在硬件里统一用“镜像 padding”,效果最稳定。

3.3 HDR 算法:多帧融合的艺术

HDR 的核心思路很简单:拍多张不同曝光的图像,然后合成一张高动态范围的图。但难点在于:

  • 对齐: 多帧之间可能有运动,需要做运动补偿。
  • 融合: 不同曝光区域的权重怎么分配?
  • 色调映射: 把高动态范围压缩到显示设备能支持的范围内。

传统 HDR 用直方图分析 + 加权平均,效果还行,但遇到大光比场景容易过曝或欠曝。AI HDR 的做法是用一个 CNN 来学习融合权重,甚至直接端到端地生成 HDR 结果。

我在项目中用过一种“注意力融合”的方法:把三帧图像(欠曝、正常、过曝)叠成一个 9 通道的输入,然后用一个轻量级网络输出每帧的权重图。这样模型可以自适应地选择哪些区域用哪一帧的信息。

你可能会问:为什么不直接用单帧 HDR?嗯,单帧 HDR 靠的是 sensor 的宽动态模式,但代价是信噪比下降。多帧融合虽然需要缓存和运动补偿,但画质上限更高。

经验之谈: 我曾经在调试 HDR 时发现,运动补偿的精度直接影响融合效果。如果运动矢量不准,融合结果会出现“鬼影”。后来我加了一个“运动置信度”分支,让模型自己判断哪些区域运动补偿不可靠,然后降低这些区域的融合权重。效果立竿见影。

3.4 AWB 算法:让白色回归白色

AWB(自动白平衡)的目标是让图像中的白色物体在不同光源下都呈现白色。传统方法基于灰度世界假设或完美反射假设,但遇到大面积单色场景(比如蓝天、绿草)就容易翻车。

AI AWB 的做法通常有两种:

  1. 色温估计: 用 CNN 直接估计光源的色温,然后做颜色校正。
  2. 端到端校正: 输入 raw 图,输出校正后的 RGB 图。

我个人更倾向于第一种。为什么?因为色温估计是一个低维问题(只需要输出两个值:R/G 和 B/G 的增益),模型可以做得非常轻量。而端到端校正需要处理高维输出,计算量大,而且容易过拟合。

色温估计的模型结构可以很简单:几个卷积层 + 全局平均池化 + 全连接层。输入是 raw 域的 Bayer 图,输出是 R 和 B 通道的增益系数。

// 伪代码:AWB 色温估计模型
input: Bayer raw (H, W, 1)
-> Conv2D(3x3, 16) + ReLU
-> Conv2D(3x3, 32) + ReLU
-> GlobalAvgPooling
-> Dense(2)  // 输出 R_gain, B_gain
output: R_gain, B_gain

但这里有个细节:色温估计对输入的分辨率不敏感。我试过把输入从 1080p 降到 320x240,估计精度几乎没有下降。所以 AWB 模块可以放在 ISP 的前端,用降采样后的图像做估计,节省计算资源。

注意: AWB 模型在训练时,一定要覆盖各种极端光源(比如钠灯、荧光灯、LED 灯)。我见过一个项目,模型在室内场景表现很好,但一到户外阴天就偏蓝。原因是训练数据里阴天样本太少。

3.5 AE 算法:曝光控制的智慧

AE(自动曝光)的目标是让图像的整体亮度处于合适的范围。传统 AE 用直方图统计 + PID 控制,但遇到逆光、夜景等复杂场景,容易过曝或欠曝。

AI AE 的做法是用一个轻量级网络来预测“最佳曝光参数”。输入可以是当前帧的统计信息(亮度直方图、平均亮度、人脸区域亮度等),输出是曝光时间、模拟增益、数字增益的组合。

我在项目中用过一种“强化学习”的思路:把 AE 看作一个连续决策问题,模型根据当前帧的亮度分布,输出下一步的曝光参数调整量。这样模型可以学会“先试探、再收敛”的策略,而不是一步到位。

但强化学习在硬件上部署比较麻烦。更实用的做法是:用 CNN 做场景分类,然后根据场景类型选择不同的曝光策略。比如:

场景类型 曝光策略 目标亮度
逆光 优先保证人脸亮度 人脸区域 120-150
夜景 延长曝光时间,降低增益 全局 60-80
普通 标准 AE 控制 全局 100-120

你想想看,如果模型能识别出“逆光”场景,它就知道不能只看全局亮度,而要重点关注人脸区域。这样 AE 的鲁棒性会好很多。

避坑指南: 我曾经在调试 AE 时发现,模型在场景切换时会出现“亮度闪烁”。原因是模型对每一帧独立做决策,没有考虑帧间的平滑性。后来我加了一个“帧间平滑”模块,对曝光参数做低通滤波,闪烁问题就解决了。

3.6 算法协同:Pipeline 里的“化学反应”

这五个算法不是孤立的。它们之间有很多耦合关系:

  • 去噪 vs 超分: 去噪做得好,超分效果也会提升。因为噪声会干扰超分模型的细节重建。
  • HDR vs AWB: HDR 融合后的图像,颜色分布可能发生变化,需要重新做 AWB 校正。
  • AE vs 去噪: AE 的曝光参数会影响噪声水平。曝光时间越长,噪声越少;增益越高,噪声越多。

所以,在设计 AI ISP Pipeline 时,我建议把算法之间的“接口”定义清楚。比如:去噪模块输出的噪声水平估计,可以传递给超分模块,让超分模型知道哪些区域需要更多细节恢复。

下面这张图展示了这五个算法在 ISP Pipeline 中的典型位置和交互关系:

AI ISP 核心算法 Pipeline 框架 Sensor Raw AE 去噪 AWB HDR 超分 曝光参数反馈 噪声水平估计传递 说明: 1. AE 模块根据 sensor raw 数据控制曝光参数,同时将曝光信息反馈给去噪模块。 2. 去噪模块输出噪声水平估计,传递给超分模块,帮助超分模型区分噪声和细节。 3. HDR 模块需要多帧输入,通常放在 AWB 之后,避免颜色偏差影响融合权重。 核心原则:算法之间通过“元数据”传递信息,而不是简单的前后串联。 元数据包括:噪声水平、曝光参数、运动置信度、场景类型等。

从这张图可以看出,AE 和去噪之间有反馈回路,去噪和超分之间有信息传递。这种“算法协同”的设计,是 AI ISP 区别于传统 ISP 的关键。

总结一下: 去噪、超分、HDR、AWB、AE 这五个算法,每个都有自己的难点和坑。但真正考验功力的,是如何让它们在一个实时 Pipeline 里协同工作。我建议你在设计时,先画清楚算法之间的数据流和控制流,再逐个模块去实现和调试。