三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

002、光子到比特的信息保真度分析——端到端成像链路中每一环的熵增与信息损失量化

002、光子到比特的信息保真度分析——端到端成像链路中每一环的熵增与信息损失量化

002、光子到比特的信息保真度分析——端到端成像链路中每一环的熵增与信息损失量化

去年秋天,我在调试一款车载前视摄像头时遇到一个诡异现象:实验室里用标准色卡测试,色彩还原和信噪比都漂亮得能上发布会PPT,但车一开到林荫道上,树叶阴影里的行人轮廓就糊成一片,AEB(自动紧急制动)系统连续误触发三次。当时团队里有人怀疑是ISP的局部对比度增强参数太激进,有人说是tone mapping曲线在低照度段压得太狠,还有人干脆建议换一颗更大靶面的sensor。我把整条链路从镜头前片到DDR里的YUV数据逐级抓出来对比,最后发现罪魁祸首根本不是ISP——是镜头暗角补偿在低照度场景下把阴影区的噪声放大了将近6dB,而后续的降噪模块又把这些噪声当成了纹理细节去保留。这个案例让我意识到,我们平时讨论的"画质"其实是个模糊的集合概念,真正决定系统上限的,是光子在变成比特的每一步里,到底丢了多少信息、混入了多少熵。

先从最源头说起。镜头模组是信息损失的第一道闸门,而且这道闸门是物理性的,算法救不回来。光学设计里有个概念叫MTF(调制传递函数),它描述的是镜头对空间频率的对比度保留能力。但MTF曲线只是理想状态下的标称值,实际量产镜头因为镜片偏心、倾斜、镀膜不均匀,每一颗的MTF都有差异。更关键的是,MTF只衡量了对比度衰减,没有衡量相位失真——也就是所谓的"像散"和"彗差"。相位失真意味着光子在空间上的位置被错误地记录,这在信息论里等价于引入了额外的熵。我之前做过一个实验,同一颗sensor,换用两颗标称MTF完全一致的镜头,拍同一张高密度纹理图卡,最终编码后的JPEG文件大小差了将近15%。文件大小差异就是信息量差异的直接体现,而这两颗镜头在产线上的测试报告里都是"合格"。

镜头之后是sensor的光电转换。这里有个经常被忽略的细节:sensor的量子效率(QE)曲线不是平坦的,它在蓝光和红光波段明显低于绿光。这意味着同样数量的光子,在蓝色通道里产生的电子数更少,信噪比天然就低。更麻烦的是,sensor的读出噪声和暗电流是温度的函数,温度每升高10度,暗电流噪声大约翻一倍。手机摄像头在连续录制4K视频时,sensor温度能到60度以上,这时候暗电流噪声已经比散粒噪声还要显著了。我见过不少团队在实验室25度环境下调好的降噪参数,一到夏天户外就翻车,就是这个原因。所以做端到端信息保真度分析时,sensor的噪声模型必须包含温度变量,不能只用一个固定的RMS值。

ISP(图像信号处理器)是熵增最集中的环节,也是我们工程师最能发挥价值的地方。但很多人对ISP的理解停留在"调调亮度、拉拉曲线"的层面,没有意识到ISP里的每一个模块都在做信息取舍。以最常见的去马赛克(demosaic)为例,Bayer阵列上每个像素只记录了红绿蓝中的一个通道,另外两个通道是靠插值猜出来的。这个"猜"的过程就是信息重建,但重建必然伴随误差。在边缘处,插值方向判断错了,就会出现拉链效应和伪彩。更隐蔽的是,去马赛克算法为了抑制伪彩,往往会做低通滤波,这相当于主动丢弃了高频信息。我见过一个量产项目,为了把伪彩指标从2.0压到1.5,去马赛克模块的MTF损失了将近20%,结果人眼看着"干净"了,但车牌识别距离直接缩短了8米。这就是典型的为了降低熵而牺牲信号,最终信噪比反而更差。

3A(自动曝光、自动对焦、自动白平衡)是另一个信息保真度的隐形杀手。自动曝光算法如果只盯着全局亮度均值,遇到逆光场景就会把高光区域完全过曝,那一区域的纹理信息直接归零。好的3A策略应该做区域权重感知,但这里有个矛盾:权重分配本身也是基于场景理解的,而场景理解又依赖于图像质量,这就成了鸡生蛋的问题。我个人的经验是,在3A收敛速度上做妥协,允许曝光在短时间内做几次试探性调整,用多帧信息来弥补单帧的损失。代价是功耗和延迟,但在车载和安防场景里,这个代价是值得的。

降噪模块是信息保真度博弈最激烈的地方。空域降噪本质上是低通滤波,它在抑制噪声的同时必然模糊细节。时域降噪利用帧间相关性,但运动区域会产生鬼影。现在主流的多帧降噪技术,本质上是把多帧的低信噪比图像通过配准和融合,合成一帧高信噪比图像。这里的关键是配准精度——如果配准误差超过半个像素,融合后的图像反而比单帧更差。我在调试一个夜间监控项目时发现,当场景里有轻微晃动的树叶时,多帧降噪的配准模块会把树叶的运动误判为全局运动,导致整个画面被错误地"对齐",最终输出的图像比单帧还模糊。后来我们改用了基于光流的局部运动估计,但光流计算本身又引入了新的延迟和算力开销。这就是工程上的取舍,没有免费的午餐。

编码压缩是最后一道信息损失环节。H.264/H.265的帧内预测和变换量化,本质上是有损压缩,它丢弃的是人眼不敏感的高频信息。但问题在于,"人眼不敏感"这个假设在机器视觉场景下不成立。AEB系统需要的是清晰的边缘和纹理,而编码器为了码率控制,恰恰会优先丢弃高频系数。我做过一个测试,同一段原始视频,用QP=28编码后,人眼主观评价几乎看不出差异,但用深度学习模型做目标检测,mAP下降了将近12%。所以现在做车载系统的架构师,都在推动把感知算法前置到编码器之前,直接从RAW域或者YUV域提取特征。这也是为什么现在很多芯片开始集成硬件级别的CNN加速器,就是为了绕开编码这条信息损失通道。

方法论上,我建议做端到端信息保真度分析时,不要只盯着PSNR、SSIM这些全局指标。这些指标对空间均匀的失真还算敏感,但对局部细节损失、纹理方向性失真、时域闪烁这类问题几乎无能为力。更实用的做法是分区域、分频段、分时域地做信息量统计。比如把图像分成高频纹理区、平坦区、边缘区,分别计算每个区域在链路各环节前后的梯度能量比和熵值变化。我习惯用信息熵和互信息这两个工具——信息熵衡量的是图像携带的信息总量,互信息衡量的是输出和输入之间的信息保留程度。这两个指标虽然计算量稍大,但能直观地告诉你每一环到底丢了多少比特。

还有一个容易被忽视的点:整个链路的瓶颈不一定在某个单一模块,而在于模块之间的接口格式。比如sensor输出的是10bit RAW,ISP内部处理用12bit,但到了编码器输入却截断成8bit。这4bit的截断就是纯粹的熵损失,而且发生在所有算法处理之后,意味着前面所有努力提升的信噪比都在最后一刻被打了折扣。我见过不少项目为了省DDR带宽,在ISP输出端直接做8bit量化,结果就是夜景模式下的banding(色带)问题怎么调都调不掉。这种问题从算法参数上根本无解,必须改架构。

最后说点个人经验。做影像系统调优,最忌讳的就是"头痛医头、脚痛医脚"。当你发现某个场景画质不行时,不要急着去调降噪强度或者改gamma曲线,先花半天时间把整条链路的每一级输出抓出来,用信息熵和信噪比两个指标做一次体检。很多时候你会发现,问题出在你根本没想到的地方——可能是镜头镀膜在特定波长下的反射率异常,可能是sensor的PGA增益档位切换时的非线性,也可能是ISP里某个看起来无关紧要的裁剪模块把有效比特位给裁掉了。这种体检习惯,比任何调参技巧都重要。

另外,如果你在做多传感器融合的系统(比如车载的摄像头+毫米波雷达+激光雷达),一定要意识到不同传感器之间的信息保真度是不同维度的。摄像头丢失的是深度信息,雷达丢失的是角度分辨率,激光雷达丢失的是色彩和纹理。融合算法要做的是互补,而不是平均。但互补的前提是每个传感器自身的信息保真度是可控的、可量化的。如果你连摄像头链路里每一环的熵增都说不清楚,融合出来的结果大概率也是稀里糊涂的。

写到这里,我想起刚入行时师傅跟我说的一句话:"影像工程师调的不是参数,是信息。"当时觉得这话太玄,现在回头看,确实是这个道理。每一版固件发布之前,我都会问自己一个问题:从镜头前的那一束光子,到DDR里的那一串比特,我到底替用户保住了多少信息?这个问题想清楚了,很多调参的纠结就自然消失了。

← 返回列表