1. 一次PQ调试项目的完整脉络:从“能出图”到“出好图”
做海思ISP调试这件事,圈内常开玩笑说:硬件工程师把板子点亮、sensor出图那一刻,工作才完成一半,剩下的一半在PQ(Picture Quality)调试手里。海思的ISP pipeline本身是固定的,从sensor进来经过DPC、LSC、AE、AWB、CCM、Gamma、去噪、锐化等一系列模块,但这些模块不是摆在那里就能自动出好图的,必须针对具体sensor型号、具体镜头、具体使用场景去调参数。这就是PQTool存在的意义。
我最初接触这个项目时,手里的板子能出图,但画面一言难尽:暗部噪点像下雪、色彩偏绿、边缘发虚。那会儿最大的困惑是:PQTool里的参数几百个,每个模块都有几十项调节,到底先动哪个、后动哪个?不同模块之间有耦合,动了AWB的增益,CCM输出的色彩又会变,调起来像拆炸弹。后来跟着项目走完一轮从PQTool调试到算法参数固化的流程,才慢慢理清这套东西的底层逻辑。
这篇文章把我实际走通的一整套流程做个沉淀,适合刚接手海思平台、需要独立完成ISP图像效果调试的工程师参考。内容涵盖PQTool的基本用法、分模块调试的思路、参数固化的几种落地方式,以及调试过程中高频遇到的问题。不涉及具体芯片型号的内部寄存器细节,但整个方法论在Hi3516、Hi3519、Hi3559等主流海思平台上是通用的。
先说结论:PQ调试的本质,是找到一组参数,让ISP各模块对特定sensor的输出图像做最合理的修正。PQTool解决的是“怎么找到这组参数”的问题,参数固化解决的是“如何让这组参数在量产设备上稳定生效”的问题。两头连起来,才是完整的项目闭环。
2. 调试前的准备工作:环境搭建与工具链路
2.1 硬件连接与基础环境
正式打开PQTool之前,先把环境搭干净。我遇到过不少同事,出图没问题,但PQTool死活连不上板子,折腾半天最后发现是网络配置问题。
调试环境的硬件链路一般是:PC(运行PQTool)通过网络连接目标板(跑海思SDK的嵌入式系统),目标板上通过I2C控制sensor。PQTool本身是运行在PC上的Windows工具,但它的工作方式很有意思——它不是直接操作sensor或ISP寄存器,而是通过和目标板上一个叫ISP Server的进程通信,由ISP Server代为执行对ISP寄存器的读写。所以板子上必须把ISP Server跑起来,否则PQTool就是一座孤岛。
实际调试时我习惯先用串口确认板子启动正常、sensor已正确初始化、出图链路没问题,再去连PQTool。原因很简单:PQTool抓图失败时,你得分清是网络问题、ISP Server没跑起来,还是sensor本身就出不了图。串口能帮你快速排除后两者。
网络配置上,PQTool连板子用的是TCP/IP,PC和目标板要在同一网段。有的平台板子默认IP是192.168.1.10,PC配192.168.1.x即可。如果板子改过IP,记得在PQTool的连接设置里同步修改。还有一点容易被忽略:Windows防火墙有时会拦截PQTool的通信,要么在防火墙里放行,要么调试时临时关掉。
2.2 sensor配置与PQTool初始化
PQTool不是开箱就能连上任意sensor的。它需要先知道当前板子上挂的是什么sensor,这依赖SDK里sensor的驱动配置。海思SDK中,sensor的初始化参数、寄存器配置都放在sensor驱动文件里(常见路径是mpp/sensor/下的某个sensor_cmos.c),PQTool通过ISP Server获取sensor的信息。
在PQTool启动后,需要选择对应的sensor类型和ISP时钟频率等参数,如果选错sensor,工具能连上但抓出来的图往往是花的或者全黑的。所以拿到一个新板子,第一件事不是调参数,而是确认sensor配置和实际硬件一致。
初始化完成后,PQTool界面会显示当前的图像预览。这时候别急着动参数,先做三件事:
- 用灰阶卡或均匀光源确认当前画面的曝光和增益状态;
- 检查sensor输出分辨率与ISP配置是否匹配,分辨率不对会导致图像拉伸变形;
- 确认色彩格式(RAW Bayer、YUV等)配置正确,否则后续调色完全没意义。
这三件事做完,才算真正进入调试状态。
2.3 抓图与离线调参的工作流
PQTool有个核心功能是抓图,它可以把当前sensor输出的RAW图抓下来保存到PC端,然后对这个RAW图做离线分析。我建议新手养成一个习惯:每次调参前先抓一张原始图,记录当时的环境照度、光源色温、曝光时间和增益,做成一张表格。这样回看参数调整过程时,能清楚知道每个参数是在什么条件下调出来的。
离线调参的价值在于:不依赖实时预览,可以慢慢在软件里试参数,图像不会闪,也不会因为调节太快导致人眼判断失真。等到离线调出一个基础效果,再回到在线模式验证动态效果。整个调试节奏应该是“离线定基础,在线验动态”,两者结合效率最高。
3. PQTool核心调试思路:从全局到模块
3.1 调试顺序的设计逻辑
很多人第一次接触PQTool,看到左边一排模块节点,本能地从头到尾挨个调。这是一个大坑。ISP各个模块之间存在强耦合,如果按模块顺序调,前面调好的参数可能被后面的模块改变。我这边的实际经验是:按“曝光与色彩优先,细节与噪声靠后;全局优先,局部靠后”的顺序推进。
具体来说,先调AE(自动曝光)和AWB(自动白平衡),因为这两个模块决定画面的整体亮度和色彩基调;然后调CCM(色彩校正矩阵)和Gamma,修正色彩还原和亮度映射;再然后调LSC(镜头阴影矫正)和DPC(坏点矫正),解决画面均匀性和坏点问题;最后才去碰去噪和锐化。去噪和锐化为什么不先调?因为前面的模块调整曝光和色彩时,会影响噪声的可见程度,先调NR和Sharpening,等AE和AWB一变,又得重来。
在PQTool的界面里,模块之间的切换非常方便,但人不能跟着界面乱跑。做一份简单的调试优先级表格贴在工位上,比工具本身更能提升效率。
3.2 AE调试:在曝光与噪声之间找平衡
AE的核心是控制sensor的曝光时间和增益,让图像亮度落在目标范围内。PQTool里AE调试主要涉及目标亮度、曝光时间上限、增益上限这几个参数。
目标亮度设置多少合适?没有绝对标准,但有一个参考:对于8 bit图像,目标亮度均值在110到130左右(0-255范围)一般比较合适,具体要结合使用场景。如果设备是室内监控,周围环境本身亮,目标亮度可以稍微低一点,减少噪声放大;如果是户外球机,要考虑到强光下的过曝抑制,目标亮度不能太高。
我踩过一个比较典型的坑:某次调试球机,客户反馈夜间图像噪点大,我一开始拼命降增益,画面暗了噪点却没少多少。后来排查发现sensor在低照度下,曝光时间已经顶到上限,而增益上限设得太低,导致画面整体欠曝,暗部细节完全丢了。把增益上限放宽、同时开启二维去噪后,画面才正常。这里的关键是:增益和曝光时间不是单独存在的,要放在一起看信噪比。
AE还有一个容易忽略的参数是AE收敛速度。在线调试时如果发现图像亮度来回跳、有呼吸感,通常就是AE收敛步长太大。PQTool里可以调整AE的收敛速度参数,把步长调小,让亮度变化更平滑。
3.3 AWB调试:告别偏色问题
AWB的作用是让白色在不同色温下看起来都是白的。PQTool里AWB调试的入口通常是色温曲线和R/G、B/G增益限制。
调AWB时,我习惯用标准24色卡或者白平衡卡放在画面中,先确认在不同色温光源下的R/G、B/G目标值。QA环境里通常有D65(6500K)、A光源(2856K)等标准光源,有条件的话尽量都测一遍,把色温曲线拉平。
实际项目里AWB出问题最多的不是标准光源下偏色,而是混合光源场景。比如室内既有窗外的自然光,又有暖黄色的照明灯,色温传感器容易在两种色温之间来回跳,画面一会儿偏蓝一会儿偏黄。遇到这种情况,PQTool里的AWB可以限制色温搜索范围,把不合理的色温区间排除掉,或者在低色温区域压低B/G增益的调节幅度。具体调多少要看场景需求,但思路是把AWB的变化范围限制在合理的物理范围内。
AWB调试的另一个细节是关于增益上限的设置。增益上限设太小,极端色温下白平衡拉不回来;设太大,噪点会被放大。这又是一个需要在PQTool里反复权衡的参数。我的经验是:针对目标场景设定合理的色温工作范围,再按照这个范围去定增益上限。
3.4 CCM与Gamma的色彩精修
AE和AWB搞定后,画面的亮度和白平衡基本可用了,但色彩饱和度、肤色还原往往还不理想。这时候就要动CCM和Gamma。
CCM是一个3x3的颜色矩阵,它把sensor原始的色彩空间映射到标准色彩空间。PQTool里一般提供饱和度调节和详细的矩阵系数调节。对于消费类产品,饱和度通常可以调得稍微高一点,让画面更讨喜;对于安防监控类产品,色彩保真比鲜艳更重要,饱和度不宜过高。
调CCM需要一张标准的色卡,分析每个色块的R、G、B输出与标准值的偏差。PQTool通常有客观数据展示,可以量化地看到每个颜色的偏向。我在实际调试中会把CCM的调整分成两步:先调饱和度,再针对明显的色偏方向做微调,避免一步到位造成其他颜色的连带偏差。Gamma曲线则控制图像从暗到亮的映射关系,调试Gamma时用灰阶图比较直观,主要观察从暗部到亮部的过渡是否平滑。
3.5 去噪与锐化的矛盾处理
去噪和锐化是PQ调试里最体现经验的部分,也是噪音和细节这对矛盾的直接战场。去噪太强,画面干净但细节没了,边缘发肉;锐化太强,边缘是清晰了但噪声也被放大了,画面有一种“脏”的感觉。
在PQTool里处理这对矛盾,我的方法是在一定噪声水平下做“阶梯调试”:先关掉NR模块,把Sharpening调到一个可接受的水平,记录此时的噪声水平;然后逐步增加NR强度,观察细节损失程度,找到“噪声已经降低但细节还能接受”的中间档。这个中间档没有固定值,完全取决于产品定位。
低照度场景下,通常需要打开空域去噪和时域去噪的组合。时域去噪对静态画面效果很好,但运动物体会产生拖影。PQTool里有时域去噪的强度选项和运动检测阈值,调这个阈值要特别注意:阈值设太低,轻微运动就触发保护,去噪效果大幅减弱;阈值太高,运动区域会糊。我一般在运动场景下反复观察,以人物走动这一最常见场景为基准来定阈值。
锐化方面,海思ISP通常提供边缘锐化和细节增强两种类型的参数。前者负责明显边缘,后者负责纹理细节。调这两种参数时,观察重点分别是物体轮廓有没有白边(过冲),以及纹理表面是否出现了不自然的“颗粒感”。一旦出现白边,优先降“过冲”相关参数,比整体降低锐化强度更精准。
4. 一次典型调试实战:从问题图到效果达标
4.1 问题现象描述
某项目用的是OV某型号sensor,搭配海思平台,应用场景是室内监控摄像头。整机装好后,样机图像存在四个明显问题:
- 暗部噪点明显,特别是夜间室内灯光场景,画面像蒙了一层细沙;
- 画面色彩整体偏绿,尤其白色物体边缘明显;
- 边缘对比度不足,文字和线条发虚;
- 固定坏点和闪烁点,在纯色背景下容易被看到。
这四个问题在PQ调试中很有代表性:噪点、偏色、细节差、坏点残留。下文按我当时的调试顺序逐步展开。
4.2 坏点矫正与镜头阴影矫正先行
为什么先处理坏点和镜头阴影?因为这两个问题直接影响后续AE和AWB的判断。坏点表现为单个像素的异常亮或暗,如果不处理,AE统计时可能被坏点干扰;AWB的统计区域如果覆盖到坏点,色彩也可能出现偏差。镜头阴影则表现为画面四角变暗,不先矫正的话,边缘区域的AE和AWB参考值就会失真。
坏点矫正(DPC)在海思ISP pipeline里通常靠前,PQTool里可以调整动态坏点检测的阈值。我当时的做法是:在纯净暗场和纯净亮场下各抓几张图,把固定坏点的位置记录下来,然后用DPC的静态坏点表方式直接修正;动态坏点阈值设为中等,用来处理后续sensor由于温度和增益变化产生的新热点。固定坏点用静态表、动态坏点靠阈值检测,这种方式最稳。
镜头阴影矫正(LSC)需要在均匀光源下拍一张纯色图(或者用专用的LSC调试图卡),让工具计算出每个像素位置的光照补偿系数。这里有一个注意点:LSC补偿系数和镜头是绑定的,换了镜头就必须重新标定。我遇到过项目中途更换镜头供应商,画面四角突然变暗的情况,就是因为LSC参数没有同步更新。
4.3 偏色问题的定位与解决
当时偏绿的问题很典型,但根因不在一个地方。我沿着ISP pipeline排查,发现至少有三个因素叠加:AWB色温曲线在低色温段偏了,CCM对绿色通道的权重过高,以及Gamma曲线拉高了中灰区的绿色响应。
处理顺序是先AWB、后CCM。我在D65光源下对着白平衡卡把R/G、B/G调正,再把A光源下的R/G、B/G调正,中间色温用曲线插值。CCM方面,我在PQTool里用色卡分析数据,发现绿色的饱和度确实偏高,单独把CCM中G通道相关的系数降了一些。这一步完成后,白色物体偏绿的问题基本解决,但暗部微微泛绿还存在,后来通过调整Gamma的暗部曲线实现修正。
这个案例想说明的是:偏色往往不是单一模块的问题,按AWB到CCM到Gamma的顺序做线性排查,比在某个模块里盲目调整更高效。
4.4 去噪锐化平衡的实战参数确定
噪点和清晰度的问题是在上面几步做完后才动的。当时的策略是:先把去噪全部关掉,加大锐化,观察原始噪声形态,判断噪点主要是亮度噪点还是彩色噪点。实测结果是暗部主要是亮度噪点,彩色噪点也有但相对少。
于是我先开启空域去噪,把亮度去噪强度从0逐步加到30%左右,在细节测试卡下观察线条边缘是否发肉。测试卡的纹理通道能看到非常细的线条,如果NR太强,这些细线条会消失。当时的初步测试中,NR强度加到35%时细线条仍然可用,画质主观评价也还可以。
接下来是时域去噪。静态场景下开到时域NR的最大档,画面干净度明显提升。但让测试人员在房间里走动时,运动边缘出现了拖影。于是把时域NR档位回退,同时调高运动检测阈值,反复测试才找到拖影和噪声的平衡点。最终确定的参数是:时域NR中等强度,运动阈值设为中等偏高,空域NR保持35%左右。之后再把锐化加回来,以出现轻微白边为上限往回退了一档。
这套调试花了大约两天时间,其中反复调整参数、抓图、再对比的过程占了大部分。PQ调试的特点就是这样,一次调到位是少数,多轮逼近是常态,耐心比技术更关键。
5. 算法参数固化:从调试环境到量产环境的跨越
5.1 PQ参数在系统里的存在形式
调试完成后,PQTool里所有模块的调节结果最终要导出一份参数文件。海思平台中,这份参数一般以XML或INI格式保存,里面记录了每个模块的寄存器配置值。把它固化到量产设备的步骤,本质上就是让设备在每次开机启动时,把这组参数加载进ISP的寄存器。
参数在系统中存在三种形式,我简单对比一下:
| 形式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 编译进应用固件 | 固件一体化的量产设备 | 不易被篡改,版本管理简单 | 每次改参数要重新编译固件 |
| 独立配置文件放文件系统 | 需要现场升级调试设备的场景 | 可单独替换,不碰主程序 | 文件可能被误删或被篡改 |
| uboot环境变量(少量关键参数) | 启动早期就需要生效的场景 | 开机最早生效 | 只适合少量参数,不适合全量PQ参数 |
我经历过的项目里,最常见的做法是第一种或第二种。第一种适合产品定型后的量产阶段;第二种适合调试阶段和售后升级阶段。
5.2 量产参数加载流程设计
量产参数要生效,关键是要在设计阶段就给“参数加载”留好接口。在SDK的典型流程中,应用程序启动后,通过MPP的ISP API把PQ参数写入ISP。流程大致是:启动ISP、初始化sensor、打开ISP通道、加载PQ参数、启动预览。
有一个容易踩的坑:如果启动时预览已经开始了,再加载PQ参数,用户会看到一帧“默认参数画质”的画面闪过去,这在某些对画质要求苛刻的产品上是不被接受的。解决办法是调整初始化顺序,在打开预览之前先把PQ参数加载完,或者加载参数时用黑帧遮蔽,等参数生效后再显示第一帧。
此外,固件里最好加一个校验机制,比如CRC32校验PQ参数文件,防止FLASH数据损坏导致ISP加载到异常参数。我在实际项目中遇到过一台设备图像异常发绿闪屏,查了半天发现是PQ参数文件在升级过程中写坏了,加载了中间截断的数据。加了一个文件校验之后,这类问题再没有出现过。
5.3 参数与Sensor的绑定关系
PQ参数和sensor型号有关系,但很多情况下容易被忽略:同一套硬件,如果sensor驱动代码版本变化了,sensor内部的默认寄存器设置可能不同,原有的PQ参数要重新验证。举例来说,sensor驱动从某个版本升级后,自动曝光的目标亮度的计算方式可能有细微差别,导致原本调好的亮度曲线偏暗或偏亮。
我的建议是,每次升级sensor驱动或ISP SDK版本后,把PQTool抓图对比作为回归测试项,把原来的PQ参数加载后,对着标准光源和测试卡拍几组画面,和之前的参考图做对比。如果差异不明显,继续用;如果差异明显,花时间重新标定。
另一个容易被忽视的点是同一颗sensor在不同批次的差异。理论上同一型号的sensor一致性是有保证的,但实际项目中遇到过AWB增益差异偏大的情况。这与sensor本身的工艺偏差、IR滤镜镀膜的一致性都有关系。所以在量产阶段,建议抽几台不同批次的整机做PQ一致性抽检,如果发现差异超出可接受范围,就要联系sensor厂商确认。
5.4 参数文件的管理与版本控制
PQ调试过程中,参数是不断变化的。我习惯用“日期+场景+版本号”的方式命名参数文件,同时把每次修改对应的调试记录也保存下来。比如“PQ_SensorA_Outdoor_D65_v2.3.xml”,从这个文件名就能看出适用的场景和版本。
这么做的好处是,当产品在某个场景下效果出问题时,可以快速定位到是哪个版本的参数导致的回归。另外,PQ参数建议放在版本管理工具里统一管理,不要放在个人电脑里。遇到过同事离职后,某台设备出现图像问题,群里问了一圈,谁都不知道当时给他调的最终参数存在哪里。这种“参数版本断档”的问题在团队协作中很常见,提前做好版本管理能省掉很多麻烦。
6. 常见问题与排查技巧实录
6.1 PQTool连接不上目标板
这个问题的概率最高。排查路径按效率排序:
- 先ping目标板IP,确认网络通不通;
- 再确认目标板上的ISP Server进程是否在运行,很多SDK需要手动执行启动命令;
- 确认防火墙是否拦了PQTool的通信端口;
- 确认sensor是否正常出图,如果sensor初始化失败,ISP Server可能无法正常工作。
6.2 抓图全黑或全亮
全黑优先检查sensor是否已经正确初始化,曝光时间是否有效。PQTool抓图模式下,有的平台需要场景里光线足够,否则会自动设置很短的曝光时间导致画面偏暗。全亮则优先检查AE是否正常工作,如果AE没有收敛,曝光时间可能被设置为最大值。
6.3 参数加载了但效果没变化
我先确认加载的参数是否真的写入了ISP寄存器。有的平台有PQ参数“使能开关”,比如某个模块的参数虽然加载进去了,但模块对应功能没有被enable,表现出来就是参数没起作用。这种情况在调试初期很容易碰到,排查时逐个模块确认enable状态。
6.4 同一套参数在不同设备上效果不一致
优先检查sensor差异和镜头差异。不同批次的sensor在暗电流、量子效率上会有微小偏差,不同批次的镜头在透过率、FOV上也会有差异。量产前建议做多台样机的PQ一致性评估。如果差异实在大,可以考虑对不同批次做两份PQ参数,或者调整AWB、AE的容差范围来兼容。
6.5 现场调试时图像闪烁
图像闪烁多与光源的频闪有关。室内50Hz交流电光源下,如果曝光时间不是10ms的整数倍,就可能出现滚动条纹或亮度闪烁。PQTool里通常有抗频闪设置,把曝光时间限制在工频周期的整数倍上。这个功能在室内监控场景务必打开。
6.6 排查思路的通用方法
PQ调试遇到的问题千奇百怪,但排查思路基本一致:先在PQTool里关掉所有后处理模块,看RAW图是否有问题;逐级打开模块,观察是哪一级引入了异常。这种“二分法”排查方式虽然原始但非常有效,我在复杂问题面前几乎都是用这个方法来定位的。
7. 最后分享一点个人体会
做PQ调试这一年多,最大的体会是耐心和细心比聪明值钱。ISP的模块很多,参数更多,但这些参数背后都有明确的物理意义,理解了每个模块在整条pipeline里承担的角色,调试起来就不会迷茫。我至今保留着一个习惯:每调一个新sensor,都会把sensor的RAW输出、AE统计、AWB统计在PQTool里仔细看一遍,就像医生看片子一样,先了解“正常的基线”,再谈“异常的修正”。
对于参数固化这个环节,再强调两点:一是给参数做好版本管理,二是给设备做好校验机制。这两点看似不起眼,但量产阶段的大多数画质问题都跟它们有关,值得多花时间。
这套流程跑通后,后续再遇到新sensor、新平台,基本就是重复劳动加局部微调了。希望这篇文章能帮刚开始接触海思ISP调试的同行少走一些弯路。