拓冰建站拓冰建站
首页 / 资讯中心 / 正文

高通平台AWB Tuning实战:从色温曲线到场景调优

AWB调参这件事看着简单实际上能让很多人卡上两三个月。我最初接触高通平台时也走过不少弯路拿着样机拍了几十张灰卡gains 测出来一套看起来合理的数值结果一到室外绿植场景就偏绿傍晚又偏红怎么调都救不回来。后来回头补了算法原理才知道问题不在“参数”而在“模型”。这篇东西我会把 AWB-Tuning 从底层原理到高通平台实操完整走一遍涵盖 8550kalama这类新平台的代码路径、工具链、调试流程和高频问题尽量讲透“为什么这么做”。我的受众很明确正在做 camera IQ tuning 的工程师、驱动转算法的同事、以及想把影像调试搞明白的学生。不需要你有太深的数学功底但建议你已经用 QCam 或者 ChromaDebug 看过 stats 数据知道 R/G、B/G 和 CCT 这几张图是什么意思。如果没有也没关系下面会从基本概念开始带。1. AWB调试到底在解决什么问题1.1 从“白”的感知说起人眼在不同光源下看一张白纸大脑会自动判断“这是白的”但 sensor 不会。sensor 只是忠实记录光线的强度分布在低色温的钨丝灯下约 2800K白纸的红色分量远高于蓝色分量拍出来如果不处理就是一张“黄得发红”的照片。AWBAuto White Balance要做的就是检测场景的光源色温然后给三个颜色通道乘上不同的增益把白纸拉回白色。这个“检测色温-算增益”的过程在高通平台上由 3AAEC/AWB/AF中的 AWB 模块负责。市面上一堆手机厂商在中高端机型上宣传的“真实色彩”本质就是 AWB 算法与 tuning 数据共同作用的结果。算法决定能力上限tuning 决定表达效果二者缺一不可。1.2 调试目标到底是什么很多人误以为 AWB 调优就是把灰卡拍正。实际上商用场景远比灰卡复杂室内混合光源、大面积单色物体蓝天、绿草坪、逆光人脸、夜景霓虹灯每个场景都会挑战算法的“判断力”。同样是 3000K 的色温一个纯橙色墙面场景和一个暖光灯下的肤白场景算法如果都把色温估计成 3000K 然后拉回白平衡前者可能正确后者会把人的肤色拉得惨白、毫无生气。所以 AWB 的目标不是“在任何场景都把色温拉回 5000K”而是要在“还原本色”和“保留氛围”之间找到平衡。这个平衡点就是 tuning 工程师的核心价值所在。以高通平台为例它提供的 AWB 算法本身带有场景分类和光源权重概率模块tuning 数据决定分类边界、权重分配和增益映射曲线这些参数组合起来才能形成一台机器特有的“审美”。2. AWB算法实现原理拆解2.1 补全基础从灰色世界到色温曲线最早期的 AWB 算法叫 Grey World灰色世界核心假设是一张自然图片中所有颜色的平均应该趋向中性灰即 R、G、B 三个通道的均值相等。基于此增益公式非常朴素R_gain G_avg / R_avgB_gain G_avg / B_avg这个算法在色彩丰富的场景下效果尚可但遇到大面积纯色场景比如一片蓝天、一面红墙就会失效比如整个画面都是蓝色G_avg / B_avg 会远大于 1算法会强行把蓝色拉回白色导致蓝天变成灰白观感非常差。为了解决这个问题后续出现了 Perfect Reflector完美反射算法它假设场景中最亮的像素可以近似看作光源的反射通过提取最亮区域的 RGB 值来计算增益。这个方法对高光细节保护有一定效果但依赖“画面里存在高光白色物体”这个前提在暗光、无高光的场景依然会翻车。真正在高通等移动平台上被广泛采用的是基于色温曲线的算法。它的逻辑是通过大量标定数据在“色温-色比”坐标系里画出两条曲线R/G 与 CCT 的关系、B/G 与 CCT 的关系运行时先用统计出的 R/G、B/G 查曲线估计出场景色温再根据目标色温反推增益。这套方法不依赖场景色彩丰富度只要光照稳定就能给出相对准确的估计。2.2 高通AWB框架色温估计与增益映射高通平台的 AWB 大体分为两部分Statistic统计和 Algorithm决策。统计部分由 ISP 硬件完成。sensor 出 RAW 数据后ISP 会根据用户在 tuning 中配置的 ROIRegion of Interest区域把画面分成一个个小块Grid每个块统计出 R/G/B 的平均值。这些统计值会写入 AWB stats buffer供算法运行时读取。高通 8550kalama平台对统计格式做了升级支持更大范围的 grid 数量和更灵活的 ROI 配置能更精细地应对复杂场景。决策部分则是纯软件。算法拿到 stats 后先做“光源估计”也就是算出一个初步色温再把每个色温对应一个概率结合场景分类结果做加权最后结合 AEC 信息亮度越低可信度越低输出最终增益并做平滑过渡。整个过程中 tuning 工程师可以控制的点非常多ROI 的划分方式、色温曲线的形状、场景分类的阈值、概率权重矩阵、增益的上下限与步长每一项都对最终效果有直接影响。2.3 粒子群等优化方法在AWB中的应用现代 AWB tuning 已经不满足于手动“摆点”。尤其是一些多光源场景色温曲线可能要从 2500K 一直摆到 7500K曲线上的每个点都对应一组 R/G、B/G 数据手动调整极易过拟合单个场景。行业内常见做法是用优化算法自动搜索最佳曲线点。粒子群算法PSO是其中一种热门选择。它的思想是模拟鸟群觅食把一组候选解看成一群鸟每只鸟按照自己的历史最优位置和群体的历史最优位置来更新速度与位置经过多轮迭代收敛到全局最优解。在 AWB tuning 场景里“位置”就是一组曲线控制点的坐标“适应度”就是测试集场景的色偏均方差——算法自动寻找能最小化整体色偏的那组曲线点。我实测过用 PSO 优化一组 9 点色温曲线跑了 500 轮约 20 分钟最终在自定义测试集上的平均色偏比手工调参降低了约 30%。但要注意PSO 结果强烈依赖于测试集覆盖度和目标函数的设计。如果测试集里全部是 D65 灯箱算法很容易把其他色温区域调坏。因此我的建议是先把测试集做好再考虑优化算法不要本末倒置。3. 高通平台上的AWB-Tuning环境全貌3.1 代码结构与关键模块位置高通平台的 camera 软件栈大致分成三块kernel 驱动sensor、eeprom、闪光灯、CamX 框架相机核心逻辑包括 3A、chi-cdk客制化调优层包含一些 overrides 和 tunable。AWB tuning 的最终落点一般有三类camx/src/core/chi/3A 算法与CamX的接口层控制统计开关和回调chi-cdk/oem/qcom/topaz/或对应平台名厂商定制 3A 的覆盖层可以替换高通默认的 AWB 算法vendor/qcom/proprietary/chi-cdk/下的 tuning 数据包括 sensor 对应的.bin或.h格式的 tuning 文件其中包含 AWB 相关的所有参数。8550 平台新增的kalama目录结构把 tuning 参数按照 sensor 型号分目录存放查找和替换都比较直观。调试之前建议先打开一份默认 tuning 文件确认AWBNet、AWBColorTemp、AWBROI这几个节点的存在它们分别对应算法网络、色温曲线和统计区域配置。如果手头代码没有这些节点多半是没有同步最新的 chi-cdk。3.2 调优工具链地图从QCam到ChromaDebug高通平台上最常用的三件套是QCam采集图像和 stats、ChromaDebug离线查看 3A 状态和 tuning 参数、以及 GMLib图像质量分析库。很多人只用了 QCam 拍照功能其实 QCam 在 debug 模式里能直接输出 AWB stats 原始数据这是排查问题最有效的入口。在 8550 平台上QCam 的版本更新频率比较快界面逻辑也有调整。建议先用高通发布的 Release Notes 确认 QCam 版本与 CamX 版本是否匹配版本不匹配时经常出现 stats 数据全 0 或者无法解析的问题。另外ChromaDebug 在连接不上设备时先检查 adb 端口和权限很多情况是 SELinux 权限拦截导致的信息读取失败。除了高通的官方工具我也会用第三方的 IQ 测试工具比如 Imatest 或 Image Engineering 的 iQ-LED 灯箱组合来做主观和客观的验证。虽然 GMLib 能直接输出 AWB error 的数值但不同灯箱的照度和均匀度会影响结果建议在多个环境下交叉验证不要只看单个工具的评分。4. AWB-Tuning实操从RAW图到稳定效果4.1 第一步硬件与环境的准备开始调试之前先把硬件环境理清楚。需要一台支持当前版本 CamX 的 8550 设备、一个可调色温的标准光源箱至少包含 D65、D50、Horizon、U30 等常用光源、以及 X-Rite 色卡至少包含灰阶和彩卡。很多人忽略的一点是 sensor 的黑电平Black Level。黑电平不准会直接污染统计值导致 AWB 结果整体偏移。建议调 AWB 前先用 QCam 采集全黑帧确认 R、G、B 三通道黑电平是否和 tuning 文件中配置的一致。我遇到过一块 sensor 的黑电平在低温环境下漂了 5 个 LSB结果 AWB 在户外冷色调场景下始终偏红排查了整整两天才定位到是黑电平的问题。灯箱环境也要固定。同一个光源灯的预热时间不同照度和光谱都会变化。实操时我会先让灯箱预热 10 分钟再开始采集数据确保每一轮验证的基准一致。4.2 第二步利用ROI配置控制统计区域ROI 配置决定了 AWB 统计“看哪些区域”。默认参数下高通平台的 ROI 一般覆盖画面中心 60% 的区域并带权重衰减。这种配置在传统构图中问题不大但如果场景主体不在中心比如被摄物体在画面左侧AWB 容易受背景大面积色块影响。调整 ROI 时先想清楚产品定位如果是拍照手机建议中心权重强、边缘权重弱如果是视频通话摄像头人脸通常出现在画面中心偏上可以把 ROI 收紧到中心偏上区域如果是行车记录仪关注区域应该是路面和前方车辆可以做成靠下偏中的矩形。修改站位在 tuning 文件里主要是三个参数ROILeft、ROITop、ROIWidth、ROIHeight以及权重矩阵ROIWeight。注意不要直接删掉 ROI 之外的统计区——高通硬件会把整幅画面统计出来ROI 只是算法计算时的加权方式。把 ROI 设太大会带来很大的计算量浪费设太小又会丢掉环境信息需要根据实际场景反复权衡。4.3 第三步色温曲线的标定与验证色温曲线是整个 AWB tuning 参数中最核心的部分。在高通 tuning 文件中它通常以一组“CCT - R/G - B/G”的映射表存在。调试流程是在灯箱中把色温调到目标档位比如 2800K、4000K、5000K、6500K用灰卡充满画面采集多帧 RAW用 QCam 的工具导出每帧的 R/G、B/G 均值并计算增益将计算出的增益与算法实际收敛的增益对比二者偏差要在一定范围内把所有色温点的数据填入曲线表如果曲线不平滑需要人工插值或使用优化算法修正。我曾经踩过一个坑只用了灯箱标准光源标定忽略了实际场景中荧光灯的频谱突变。荧光灯下虽然 CCT 显示是 4000K但 R/G、B/G 的比值会出现频闪和统计抖动导致 AWB 在荧光灯场景不稳定。解决思路是在 tuning 里额外增加一个“荧光灯模式”的增益补偿曲线并利用 AEC 的闪烁检测结果切换曲线。这个经验在调试办公场景、商场场景时特别有用。4.4 第四步增益平滑与迟滞设计AWB 增益如果不做平滑画面亮度和色度会跟着光源变化“突跳”提升观感的方法是在两个维度上做迟滞时间域迟滞相邻两帧的增益变化不能太大通常用一个低通滤波系数AWBConvergenceSpeed控制色温域迟滞当色温估计在某个临界点附近抖动时不能反复切换“室内AWB”和“室外AWB”需要设置一个 hysteresis 带。高通平台在AWBAlgorithm相关配置里提供了AWBTransitionSpeed、AWBColorTempHysteresis等字段。我的调法一般是把时间域收敛速度调成中等偏慢避免快速跳变但也不能慢到 1 秒都稳定不下来把色温域迟滞设成上下 100K~200K 的死区。死区太小会频繁切换死区太大又会让场景切换时反应迟钝。需要特别注意的是低照度下 AWB 的置信度会下降。我通常会在 tuning 里设定一个 lux index 阈值当环境亮度低于某个值强制降低 AWB 增益的上限和步长防止噪声被放大。这个阈值需要结合 sensor 的噪声特性和 AEC 曲线一起定不能单独看 lux index。5. 高频问题排查与避坑实录5.1 场景内大面积纯色偏色最经典的场景用户在户外对着蓝天拍照整张照片偏暖——因为算法把蓝色当成灰色世界假设中的“世界基准”了。遇到这种情况先不要急着调曲线而是检查场景分类模块是否启动了“风景模式”或“高饱和区域检测”。在高通平台上这个逻辑通常由AWBSaturationControl或AWBSceneClassifier控制可以降低纯色区域在统计中的权重。调试时我会刻意拍几组纯色场景纯蓝天、纯绿草坪、纯红墙、纯黄落叶。每组拍完看两个指标色温估计值是否和主观预期一致画面色偏是否在可接受范围内。如果某个纯色场景翻车了在 tuning 中把该色相区间的权重降低同时增加相邻灰阶的权重这样既能保住场景感又不会拉得太过。5.2 暗光下闪烁与偏红低照度场景偏红大概率不是 AWB 增益算错了而是 sensor 的 R 通道噪声变大统计出的 R/G 偏高。此时如果强行拉高 B_gain画面会出现明显噪点。我一般建议双管齐下一是调整 AWB 在低照度区间的增益限制AWBMaxGainLimit和AWBLowLightGainLimit二是联合 AEC 做多帧降噪让进入 AWB 统计的图更干净。另外别忘了检查 sensor 的 dark current低照度下长时间曝光容易导致 R 通道暗电流累积影响 AWB 判断。5.3 混合光源下的色温跳变室内窗户边是最常见的混合光源场景窗外是 5000K 自然光窗内是 2800K 灯泡。AWB 算法会在两个色温之间来回“抢”导致画面一会儿偏暖一会儿偏冷。解决思路是让算法在混合光源下更保守把色温变化的判定阈值调大同时降低 AWB 的收敛速度。在高通平台上AWBColorTempConfidence是一个很有用的参数。实测把它的值从默认的 0.8 调到 0.6混合光源下的跳变次数明显减少但代价是纯光源下的收敛速度变慢了。所以这个值最终调到多少取决于产品对“稳定”和“准确”的侧重。就我个人经验视频优先的产品建议偏保守拍照优先的产品可以适度激进。5.4 高通平台特有统计数据全零或异常8550 平台在开启某些 sensor 的 binning 模式后AWB stats 偶尔会出现全零或不更新。这个问题的根源多半是统计模块与 binning 模式的同步没有做好。排查步骤是先用 QCam 在 raw 模式下确认 sensor 输出正常再看 CamX 日志里 AWB stats 的 enable 信号是否随 binning 切换正常拉高。如果 enable 信号正常但数据仍为零把 sensor 的裁剪尺寸crop和统计窗口配置核对一遍很多异常都是裁剪窗口越界导致的。这类问题不要直接去改 tuning 数据而要先确认硬件统计通路。我曾经花了三天时间在 tuning 上“找原因”最后发现是 sensor driver 里的 line_length_pck 配置错误导致 stats 窗口计算偏移。平台问题优先从驱动层查Tuning 数据是实现层不要弄反了排查顺序。6. AWB调优的进阶方向与个人体会6.1 从单点调试到批量自动化手工调 AWB 曲线本质上是在“过拟合”特定测试集。当一个项目要支持多颗 sensor、多个模组时单点调试的效率会很低。后期的优化方向是把整个 tuning 流程自动化写脚本自动跑灯箱场景、自动提取统计数据、自动评估色偏最后用优化算法批量更新曲线。我目前的做法是用 Python 写了一套简单的流程QCam 通过 adb 自动拍照 - 导出 RAW 和 stats - 脚本计算 R/G、B/G - 和 tuning 中的曲线对比 - 自动生成修改建议。虽然不是全自动闭环但已经把单次调试时间压缩了一半以上。如果要用 PSO 这类算法建议先跑一些基础场景把大方向调对再用算法微调全自动一步到位在调参这件事上并不可靠。6.2 与AEC、AFC的联合调优AWB 不是孤立工作的。AEC 决定曝光时间、增益和 ISO直接影响统计数据的信噪比AFC 决定镜头位置影响成像清晰度模糊的画面统计出的色彩值也会偏离。真正做精 AWB必须和 AEC 工程师一起看 lux index 映射和 AE 的“目标亮度”对齐。我见过很多项目 AWB 单独验证都很好联调时一塌糊涂最后定位基本都是 AE 和 AWB 的 lux index 阈值没有对齐导致的。联合调优的实操是固定一个典型场景比如室内 D50、室外 D65把 AEC 调好后再去动 AWB。反过来也一样AWB 的某些增益限制会影响画面亮度感知AEC 又会因此重新调整曝光两个模块互相拉扯。遇到这种情况不要单方面猛调某一方应该坐下来先统一“场景优先级列表”比如人脸优先还是背景优先再去各自动自己的参数这样配合起来效率反而高。我个人在实际调试中最深的体会是AWB 调优没有一劳永逸的参数只有不断积累的“场景覆盖率”。每拿到一款新设备先花时间把基础环境灯箱、灰卡、黑电平、AEC 状态校准妥当再谈曲线和权重。遇到偏色问题别急着改参数先问自己三个问题AEC 状态对不对统计区域设置是否合理当前场景色温置信度高不高这三个问题排查完80% 的“玄学偏色”都能找到明确原因剩下的再靠数据和算法慢慢逼近。调 AWB 很考验耐心但当你看到同一颗 sensor 在室内外、白天黑夜、晴天阴天都能输出稳定自然的色彩时那种成就感是参数本身给不了的。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门