3、Pipeline拆解:AI ISP的典型pipeline

做AI ISP优化,第一件事就是要把pipeline吃透。我见过太多人一上来就盯着某个模块调参,结果发现瓶颈根本不在那儿。说白了,你得先知道整个流程长什么样,每个模块在干什么,算力都花在哪儿了。

今天我们就来拆一拆典型的端侧AI ISP pipeline。我会按数据域来分——RAW域、RGB域、YUV域,把每个阶段的模块和计算量分布讲清楚。

3.1 整体pipeline概览

先看一张我画的整体流程图。这张图我每次带新人都会先给他们看,让他们对整个链路有个全局印象。

端侧AI ISP 典型Pipeline RAW域 Sensor RAW 输入 黑电平校正 (BLC) 去噪 (AI-Denoise) 去马赛克 (Demosaic) RGB域 白平衡 (AWB) 颜色校正矩阵 (CCM) Gamma 校正 色调映射 (AI-TMO) YUV域 色彩空间转换 锐化 (AI-Sharpen) 降噪 (NR) 编码前处理 YUV 输出 计算量分布:RAW域 ~45% | RGB域 ~30% | YUV域 ~25%

从Sensor出来的RAW数据,经过三个域的流水线处理,最终输出YUV给编码器或显示。每个域都有它的核心任务,也有它的算力黑洞。

3.2 RAW域:最吃算力的地方

RAW域是整个pipeline里计算量最大的阶段,没有之一。我做过一个统计,在4K@30fps的端侧芯片上,RAW域能吃掉整个ISP算力的45%左右。为什么会这样?因为RAW数据是Bayer格式,每个像素只有一种颜色分量,处理起来天然就需要更多计算。

3.2.1 黑电平校正 (BLC)

这个模块相对轻量。就是把Sensor的暗电流偏移减掉。说白了就是减一个常数,几乎不占算力。

3.2.2 AI去噪 (AI-Denoise)

这里才是大头。我记得有一次调一个端侧芯片,发现AI去噪模块占了RAW域60%的算力。为什么?因为去噪网络通常需要大感受野,卷积核大、通道数多,推理延迟一下就上去了。

关键指标:AI去噪模块的MACs(乘累加次数)通常占整个ISP的25%~35%。如果芯片的NPU算力不够,这里就是第一个瓶颈。

3.2.3 去马赛克 (Demosaic)

把Bayer格式插值成完整的RGB。传统方法用双线性插值,算力很低。但现在的AI ISP会用轻量级CNN来做,质量好但算力翻倍。我建议在端侧芯片上,如果NPU紧张,可以考虑用传统方法+后处理修复,能省不少算力。

3.3 RGB域:色彩还原的主战场

RGB域的计算量大概占30%。这里主要做色彩相关的校正,计算密度不如RAW域高,但数据量已经变成三通道了,带宽压力不小。

模块 计算量占比 带宽消耗 典型瓶颈
白平衡 (AWB) ~2% 低 统计直方图计算
颜色校正矩阵 (CCM) ~3% 中 3x3矩阵乘法
Gamma校正 ~1% 低 LUT查找
AI色调映射 (AI-TMO) ~24% 高 局部映射网络推理

看到没?AI-TMO(色调映射)是RGB域的算力大户。它要做局部自适应映射,通常用一个轻量级UNet或者类似结构。我在项目中遇到过一个问题:AI-TMO的推理延迟在NPU上跑到了8ms,而整个ISP的帧预算只有33ms(30fps)。后来我把网络从UNet换成了MobileNetV2风格的编解码器,延迟降到了3ms,画质损失在可接受范围内。

我的经验:RGB域的优化重点在AI-TMO。如果芯片有独立的NPU,可以考虑把RAW域的AI去噪和RGB域的AI-TMO分时复用同一个NPU核心,避免资源争抢。

3.4 YUV域:画质收尾与编码适配

YUV域的计算量大概占25%。这个阶段的数据已经是YUV420或YUV422格式了,数据量比RGB少了1/3到1/2。但别小看它,锐化和降噪模块如果做得不好,前面的努力全白费。

3.4.1 色彩空间转换

RGB转YUV,一个3x3矩阵乘法加偏移。算力很低,但要注意精度。我见过有芯片用定点实现,结果Y分量溢出导致画面发灰。

3.4.2 AI锐化 (AI-Sharpen)

锐化模块现在也倾向于用AI来做。传统锐化(比如USM)容易产生振铃和过冲。AI锐化可以用一个轻量级CNN来学习边缘增强,效果更好。但要注意,锐化模块通常只处理Y分量,U/V分量可以跳过,能省2/3的算力。

3.4.3 降噪 (NR)

YUV域的降噪主要是做时域降噪和空域降噪的融合。这里有个坑:时域降噪需要帧缓存,带宽消耗很大。我曾经在调试一个4K@60fps的项目时,发现DDR带宽被时域降噪吃掉了40%。后来改成运动自适应降噪,只在运动区域做空域降噪,静止区域做时域滤波,带宽降到了15%。

避坑指南:YUV域的降噪和锐化是矛盾的。降噪会抹掉细节,锐化会放大噪声。我曾经调一个芯片,降噪和锐化模块互相打架,画面要么糊要么噪。后来我加了一个边缘检测门控,只在平坦区域做降噪,在边缘区域做锐化,才把平衡找回来。

3.5 计算量分布总结

我把三个域的计算量分布整理成一张表,方便你快速定位瓶颈。

数据域 计算量占比 主要算力消耗模块 优化建议
RAW域 ~45% AI去噪 (25-35%)、Demosaic (8-12%) 优先优化去噪网络结构,考虑传统+AI混合方案
RGB域 ~30% AI色调映射 (20-25%)、CCM (3%) AI-TMO用轻量级网络,分时复用NPU
YUV域 ~25% AI锐化 (10-15%)、时域降噪 (8-12%) Y分量单独处理,运动自适应降噪

嗯,这里要注意一点:上面的比例是基于典型的端侧AI ISP架构。如果你用的Sensor是Quad Bayer或者非Bayer格式,RAW域的计算量分布会变。比如Quad Bayer的Demosaic更复杂,占比可能翻倍。

我个人习惯在做性能瓶颈定位时,先拿这个分布表去对芯片的profiling数据。如果某个模块的占比明显偏离,那大概率就是瓶颈所在。比如RAW域AI去噪占比到了40%,那不用想,先优化它。