一点想法:验证工程师眼中的AI-ISP
在低光场景下画面成像一般都很困难因为光子数少、信噪比SNR很低相机传感器采集到的图像数据中有效数据量图像噪声。为了解决光子数少的问题可以增加感光度使用长时间曝光但是这样不能解决图像噪声问题且长曝光会引入画面运动模糊的问题还会存在偏色有色差。在传统的ISP处理侧使用一些后处理例如拉伸直方图也可以使得画面变量亮这样不会引入运动模糊但是画面噪声仍然存在在物理层面开大光圈使用闪光灯等都具有场景上的缺陷。单帧去噪难以解决色彩偏差问题多帧去噪极端低光场景下对齐算法会失效且算法依赖burst内部lucky imaging挑选其中质量最好的帧以上的逻辑思路可以通过一个图表来表示优化手段增强亮度去噪抗运动鬼影色彩还原其他ISO√√×√×物理手段实时处理成本一般但增强亮度和抗运动鬼影存在互斥光圈√√√√-物理手段实时处理成本一般景深变浅影响画面内容闪光灯√√√√√√×色温突变物理手段实时处理成本较高使用场景受限直方图拉伸√√√×放大噪声√×逐通道偏色图像后期处理成本较低单帧去噪-√√√×难解偏色图像后处理成本较低多帧去噪-√√√√低光有鬼影√图像后处理成本一般AI-ISP√√√√√√√√√后处理依赖NPU算力成本高所以自然而然就引出了使用AI来解决传统ISP的问题。二、传统 ISP 管线每一级在解决什么物理问题为了理解 AI-ISP“改了什么”得先知道传统 ISP 在做什么。ISP 的处理流程是为大致串行的处理结构如上图所示每一个步骤都是在对图像的原始数据进行一个小方向上的微处理例如白平衡去噪等等处理后的图像数据又传递给下一级。关于ISP pipeline的资料网上很多这里就只就自己知道的能讲清楚的讲一下。我们先看输入。相机传感器表面覆盖着一层彩色滤光阵列CFA最常见的是 Bayer 阵列每个像素点其实只透过了 R、G、B 三种颜色中的一种。也就是说传感器原始输出RAW 域里每个位置只有一个颜色分量另外两个是缺的。所以管线最前端要先做一堆 RAW 域的修补黑电平校正、坏点校正、阴影校正之类的。。。这些就是做一些简单的修复不算ISP的核心。Demosaic从RAW域变换到RGB域 把每个像素缺失的两个颜色分量插值补全从单通道 Bayer 还原成完整的三通道 RGB。本质上就去预测——用一个像素周围的邻域去推测它缺的颜色。从算法角度看其实是是一次次的邻域加权运算和CNN的卷积核在图上滑动是同一回事。Demosaic 的难点也在这里当邻域里有高频细节密集纹理、斜边、栅栏时固定规则的插值会猜错产生摩尔纹和拉链效应。这是传统 demosaic 永远在和画质拉锯的地方。白平衡 解决的是「光源色温」问题同一张白纸在日光下和白炽灯下传感器读到的 RGB 比例完全不同。传感器在白炽灯下容易对白色信息失真。白平衡通过给 R/G/B 通道乘不同增益把应该是白的东西重新拉回白色。它通常在 RAW 域、demosaic 前后完成本质是估计光源、再做通道缩放——估得准不准全靠场景假设这种假设本身就具有限制不能自适应去白平衡。去噪在暗光下光子少、信噪比低传感器读出的就是一片噪点就像开头的图片。降噪在 RAW 域做对信噪比的贡献最高因为噪声还没被后续非线性运算放大所以传统ISP倾向于尽早降噪。它同样是邻域运算用周围像素估计当前像素的真值。传统方法双边滤波、NLM、3DNR 时域降噪的两难是——降噪强了细节糊掉降噪弱了噪点还在这个度是人工调参调出来的换个场景就得重调。HDR 合成 / Tone mapping 处理动态范围问题真实世界从暗处阴影到强光窗口的亮度跨度远超传感器单次曝光能记录的范围。HDR 通过多帧不同曝光合成、再用 tone mapping 把高动态范围压回显示器能显示的 8bit。难点是合成时的运动物体会产生鬼影因为在物体或镜头极快移动抓取的两帧图变化过大tone mapping 压缩时又容易丢掉局部对比度。色彩校正用一个 3×3 矩阵把传感器的设备相关色彩映射到标准色彩空间让红的更准、绿的更绿。Gamma 做非线性映射匹配人眼对亮度的感知人眼对暗部更敏感。最后的锐化和色度降噪在 YUV 域收尾提升主观清晰度。总结下来这里面的ISP流程多数都有一个特点就是人工设计、人工调参很多时候是需要取舍的根据不同的场景去配一个适合的“经验值”。在光照充足、动态范围正常的场景下配一个值在进入极暗、强逆光、高速运动这些极限场景再配一个值而且恶劣场景下配的这些参数还可能失效——demosaic 出摩尔纹、降噪失败、HDR 鬼影、暗光下色彩偏色。这些失效点就是 AI-ISP 要解决的问题。三、学术界用 AI 替换「特定」模块传统 ISP 失效的地方就可以用神经网络把它换掉。目前论文里被 AI 化得最多的就是上一节里那几个问题去噪、HDR / tone mapping、低光增强、demosaic、超分。用AI去替代这些模块也是有收益的只是说哪些模块的收益更高哪些的收益容易达到边际。而且这些任务都能拿到成对的训练数据——一张带噪/低光的输入配一张干净/正常曝光的目标网络要做的就是学会这个映射。实际上神经网络替换 ISP 模块做的事情和传统模块在数学形态上是一样的——还是邻域运算、还是在像素上滑窗卷积。区别只在于传统模块的滤波核是工程师手工设计的固定规则而 CNN 的核是从成千上万对图像里学出来的。这也是为什么这些网络通常是轻量级的 CNN 或 U-Net 结构它们要替换的本来就是局部的、空间相关的像素操作不需要特别花哨的架构。具体落到怎么换已知的有两条路线第一条是端到端一张网放弃ISP pipeline训一个网络直接把 RAW Bayer 映射成最终 RGB。代表作是 Ignatov 等人的PyNET《Replacing Mobile Camera ISP with a Single Deep Learning Model》。通过一个金字塔结构的 CNN隐式地学会了 demosaic、降噪、白平衡、色彩校正、去摩尔纹等所有 ISP 步骤输入手机传感器 RAW、输出对标单反的成片。同一思路的还有 Chen 等人的《Learning to See in the Dark》SID它直接在 RAW 数据上用全卷积网络替换掉大部分传统管线来处理极低照度成像。这条路线追求的是画质天花板——网络全局优化不受人工管线分阶段误差累积的拖累。不过这个用于端侧可行性不大对算力的要求过高。端侧一般不允许有这么多层网络。SID的工作与之类似但是参数量少一点单张图片的推理是零点几秒而且是全分辨率RAW上做密集卷积计算。对于端侧来说实时帧率处理能力和功耗都估计还是过重了。通过训练网络替换整个ISP的可能性对于端侧的可行性不太大。第二条是选择性 AI 化保留传统管线的骨架只把对画质影响最大的几个模块换成网络其余沿用成熟的传统算法。这样的手段相对来讲牺牲一部分画质上限但是算力、成本更可控。而且相对没那么黑盒验证的时候出了问题可以分解出更多的中间节点来进行定位。。对于实现产业化落地更现实一些。四、现有的量产AI-ISP芯片现有量产芯片主要是三种路线1语义协同模式。也就是AI去对画面做语义分割实时离线再让传统 ISP 对每个层分别施加不同的降噪、锐化、色彩处理等等。AI实际上还是扮演的“视觉神经”的角色。好处是适用于一些对算力要求不高的端侧场景。不过个人认为这种属于AIISP狭义上不算AI-ISP。高通、苹果的部分ISP相关芯片算就是这个思路2强ISP强AI模式。这种就是现有ISP处理图像然后外挂一个NPU通过AI去根据ISP处理好的图像优化视频/图像质量。这种AI实现的是图像/视频成像完毕后的“后处理”模块扮演一些图像识别视频监测的功能从功能层面上将ISP和AI相对独立的耦合性没那么强。这种外挂NPU的方式也是目前国内ISPNPU的主流处理模式。3模块替换式。这种个人认为是最符合AI-ISP定义的就是AI直接去替换掉一个或多个甚至全部的传统ISP的处理流程比如HDRDemosaic等构建一个新的AI-ISP处理架构相当于把AI和ISP嵌合到一起输出的yuv图直接就是AI的结果。上述三种AI-ISP模式是完全不同的技术路线不能说谁更好相对来讲AI与ISP的嵌合程度越高画质提升的潜力越高但是也往往面临黑盒程度上升算力开销大研发成本高这取决于市场算力预算和不同应用场景。对于验证来说难点和重点也不一样语义协同模式主要要调控制链路也就是AI分割的结果这个数据激励或者是配置给到ISP模块的合理性给的对不对强AI强ISP模式主要看ISP和NPU之间的数据流带宽这些是否匹配满足性能要求类似传统SOC的验证思路模块替换模式就要看网络模块的顶点容差怎么确保一定误差内的验证的完备性。五、验证视角AI-ISP 真正难的不是「跑得对」而是「怎么定义对」ISP 和多数IP在工程形态上类似都是流式像素管线。一帧图像按行流入经过一级级处理流出中间靠 line buffer 缓存邻域、靠 DMA 搬运、靠 AXI 总线对接靠 backpressure 做流控靠帧级握手做同步靠 register model 配置参数。但是在 scoreboard 这一环它标准是不确定的。传统 ISP 的比对数据是c_model生成的在绝大多数下这个数据是准确无误的可以被认为是金标准。而 AI-ISP 的 golden 是一个浮点训练出来的神经网络。此外部署形态变了网络训练时是 FP32 浮点落到芯片上跑的是定点/量化的 NPU的精度会低一点浮点模型量化成定点也会带来误差。所以这时候的比对应该是一种“容差”比对在错误率可接受的范围内就算比对通过。按照对误差的容忍度进行区分有以下几种区分标准1像素级容差定点结果和浮点参考的逐像素差异要落在量化误差预算内比如绝对误差 ≤ 某阈值或满足量化规格推导出的误差界。这要求把量化引入的误差建模并量化而不是凭感觉拍一个阈值。2图像质量指标用 PSNR、SSIM 这类感知指标设阈值——比如 DUT 输出相对参考图 PSNR ≥ 40dB 才算过。这本质上是把对不对从一个布尔判断变成了一个带容差的质量判断。3数值一致性分级实践中往往分层——NPU 算子层面追求 bit-true定点实现和量化参考模型逐 bit 对齐这部分仍可 bit-accurate而整条 AI-ISP 管线的端到端输出则退到指标容差比对。把哪一层能 bit-true、哪一层只能容差切清楚是验证方案设计的关键。围绕这个核心转变验证环境也要跟着升级Model-in-the-loop / 协同仿真。golden 不再是一段 C 参考模型而是要把训练框架PyTorch/ONNX里的模型拉进验证流程做软硬协同——用浮点模型和量化后模型分别生成参考喂给 scoreboard 做分层比对。这对验证工程师提了个新要求得能读懂量化流程知道 per-tensor / per-channel 量化、scale/zero-point 是怎么算的否则连参考模型都对不齐。NPU 数据流与量化的验证。AI-ISP 的算力靠 NPU那 NPU 的数据流weight/output/row stationary 之类的复用策略、量化算子、pre/post-process 单元本身就是验证对象。这里可以展开的内容就太多了数据流的验证包括数据流调度、硬件的tiling是否正确缓存的双缓冲权重和激活的DMA编排让正确的数据在对应时刻到达正确的PE…定点运算的验证比如数据向上取整还是向下取整saturation截的对不对加法器位宽够不够…pre/post-proces单元比如layout转换padding激活函数查表池化等等对不对…功能覆盖率的重心转移。一般IP验证里收的 coverage 大多是spec要求的内容——各种类型、配置组合、特性组合等等。AI-ISP 的功能中也有类似的比如不同算子、张量形状、通道数、量化配置的组合…除此之外覆盖率收集还要考虑图像内容场景低光、高动态、强逆光、高速运动这些 corner case 不再是spec要求的的排列组合而是输入数据分布这些场景更抽象也更贴近真实场景。怎么构造覆盖这些场景的激励、怎么定义覆盖到了暗光场景是一套新的覆盖率思维。传统IP验证AI-ISP验证覆盖空间中以spec状态为主配置组合x输入数据分布可枚举性可枚举图像空间连续需要按照场景分类边界用例异常语法、码流边界低光/HDR/逆光/高速运动总结来说其实就是传统ISP难以解决极暗、高速运动场景。AI-ISP可以为这个提供一条解决路径。但是AI-ISP的架构究竟是什么以及AI在ISP中扮演什么样的角色这个角色轻重如何这个还是一个很tricky的问题。站在验证角度需要考虑的就是验证思路要转变工作量大了很多而且要逐渐抛弃bit-exact的思维。参考CVPR2018《Learning to See in the Dark》CVPR2020《Replacing Mobile Camera ISP with a Single Deep Learning Model》Proceedings of the IEEE《Efficient Processing of Deep Neural Networks: A Tutorial and Survey》知乎刘斯宁Understanding ISP Pipeline海思NPU:Hi3519DV500知乎AI ISP未来有哪些发展趋势高通“认知ISP”Snapdragon 8 Gen 2