AWB调试中(Tuning)的几个问题

AWB调试中(Tuning)的几个问题

奇点点博士

奇点点博士

算法工程师

17 人赞同了该文章

概要:提出了调试中的几个常见问题以及自己的尝试解决方案,夹杂着自己对一些概念的思考,可能会有理解错误的地方,恳请专家予以指正!


最近学习了AWB Tuning(调试)的知识。有几点感想和收获总结下:

 

第一,颜色的准确不仅取决于AWB模块,这是系统性的工程。比如,一个车载项目,囿于其使用环境,日夜切换不能满足,只得用双通滤光片,但是该滤光片红色波段截止不彻底,导致在650-700波段仍有透过,结果就是在低色温下黑色物体偏蓝,其他颜色(除了蓝色)均出现不同程度的偏色,整个色卡看起来发“蒙”。这个问题其实包含三个问题,其一,为何黑色偏蓝;其二,为何只有黑色偏;其三,为何是F光源偏。经过分析,得出以下初步结论:其一,黑色偏蓝是因为RAW上R偏多,导致偏青,表现出来就是蓝;其二,黑色是因为吸收能力强,所以,偏色状况最右下角黑最严中,左边灰块次之。也不仅仅是黑色偏,整体RAW都会偏红(少量绿),因为感红sensor在长波段很多,所以像在长波段分布比较多的红色块,黄色块,绿色快等等都偏的很厉害。其三,F光源出现问题是因为低色温光源在长波段能量占比更多所以受到的影响最大,如图1所示:

图1

以上只是一个例子。

另外,我原来以为亮度对颜色(色度)是没有影响的,在理论上来说,很多算法都是二维色度的估计,这是可行的(当然,也有一些理论表明亮度对最后的光源估计有影响,比如[1]把二维贝叶斯拓展到了三维,提高了一点估计准确度)。但是在实际当中并非如此,代码中,亮度和曝光增益是联动的,而增益值又和黑电平有关,所以,亮度对最后估计得到的gain值是有影响的,虽说影响不大,但是也不容忽视。像海思平台,根据曝光增益来估计室内室外从而选择AWB模式,这间接上影响了最后的颜色值。除了曝光,引起颜色问题的还有sensor,滤光片,镜头,甚至是罩子…系统参数配置等等。

 

结论:

  • 想把颜色做准,需要了解整个系统。

第二,CCM的调试问题。之前的AWB理论学习让我根本没有意识到颜色还原还有这个步骤,因为理论假设认为,只要场景中的白(灰)作准,那么其他颜色就会作准,但这个假设的前提是人眼的sensor,所以CCM的出现,本质是颜色空间的转换。由机器的sensor转为人眼的sensor。实现手段是sensor RGB转为XYZ再转为sRGB空间和标准比对拟合得到。使用的工具,步骤是,直接导入RAW,先进行AWB,再导入gamma,再比较,通过其内部算法得到最后的一个3*3全矩阵。这里面隐含了很多信息,软件首先自动帮你做了CFA(我不明白有些平台把AWB放在RAW域而不是RGB域做的目的,去马赛克可以去掉一些高光点,可以做一些去噪……没有害处只有好处),自动把RGB转为XYZ,之后转到sRGB,之后再gamma,这时就可以和“标准图片”进行对比,得出一个3*3的校正CCM全矩阵。这里有个点让我困扰——根本没有所谓“标准光源”,我们理论假设D65,但实际的sensor在该光源下成像依旧偏的厉害,所以此处对比的“标准图片”,也是D65下AWB过后的图片。具体步骤大致如下:

图2

所谓“图像风格”调试,除了饱和度调整,就是对CCM中参数增(减)达到控制特定颜色的目的,但是scale要把控好,不然很容易在另外一些场景下偏色。

 

结论:

  • CCM的操作本质是颜色空间转换

第三,伴随着CCM校正出现的一个问题是Gamma校正问题。Gamma在ISP中的作用,传统说法是:内存紧张。因为动态范围有限,而人眼又对暗部细节比较敏感,在动态范围有限的情况下,牺牲一些高亮信息也是可以的。出于此策略,在ISP中gamma encoding,在display上gamma decoding,逻辑上好像没有错误。但是display一般解释是CRT显示器,如下:

图3

我同意 

韩世麟

 的看法,CRT这种特性是存在的,但具体为何是2.2,却是为了符合人眼特性而微调出来的而不是什么巧合。因果关系不可错乱。但是这种显示器很少见了。又有人说,即使是LCD,也是在生产时特意的人为加上一个decoding恳请做显示器的专家出来证实一下),这样好像可以比较恰当的解释,目前我给自己的解释也是这样的。与此对应的是我在调WDR下的CCM时导入的Gamma变成了线性,也就是说,不需要进行Gamma校正。这也算是间接佐证了上述Gamma内存紧张的说法。

需要注意的是,以上提到的Gamma校正是指的sRGB中的全局性的Gamma,在一些所谓tone curve中使用局部Gamma只是为了提升局部的亮度(甚至它也会使用全局Gamma),目的是为了使图像“更好看”而不是弥补显示器的Gamma。两者不可混淆。

 

结论:

基本上可以把Gamma校正认为是人眼对暗部更加敏感而硬件内存又不足下的妥协。但是还有几处Gamma值,详细起来非常复杂。没见过有 说的很清楚的,可以参考下 

韩世麟

(gamma) 的说法。


11.4日添加:关于gamma问题,这是评论里 

Wang J

 大神给的精彩回答,感觉非常专业,全面!能看到这样用心的回答,是知乎带给我的最大惊喜!

 

 


第四,训练光源区域确定问题。海思,安霸,高通,Ti,这些平台,使用的算法基本一致,都是找白块。比如,海思算法,是三个色温确定普朗克轨迹,再加两个平行曲线确定相关色温范围,最后,再添加一些特殊区域(极端色温)或者抠出一些区域(室外绿区);又比如,在安霸平台,就是把海思的曲线换成了框。诡异的在于,这些“相关色温”的范围确定问题,根本没有科学依据,全凭个人经验,很“邪乎”。理论上来说,为了找到尽量多的色温,光源需要足够多,拿到一款sensor后要录视频好几天,再截取不同时间的RAW数据从而获取该时刻的光源……理论上来说,这是最保险的做法。但是一般调试人员为了简便,只是抓取几个场景,便根据“经验”画出训练域,这些经验里,通常是倾向于将框做大,殊不知大了也有误差。

画框时,一般是找在白块为中心,左右两边扩展0.2,为了更好的确立落入其中的点,使用了一个六边形框,这样便于求距离,确定点位置。如图2所示:

图4

鉴于调试人员总是认为包含越多比不包含要好,所以倾向于把框画的尽可能大一些,这里会出现问题,因为框画的偏大,导致更有可能出现估计值A_esti点,实际上是A_real点,显然,都在框内,但是还是有误差。所以有时候会有些问题排查不出来,灰点都在,但是依旧偏色。此时往往被认为是“固有问题”而搁置。但是好在这种问题并不多见,本质原因还是安防场景的AWB要求比较低而场景又大部分比较理想(灰点多),所以没出现大问题,不被重视。为了打破这种不精确的画框经验,我使用理论研究中经常使用的光源,真实的sensor曲线拟合出光源点,这样可以看出一款senor的大致走向,而不至于乱抓乱画,如下所示(横坐标为G/R.纵坐标为G/B):

图5

(使用的光源是实验室实际测得的很广泛的光源,比较权威,相关数据集可以看一下我的第一篇文章

从以上可以看出,这个范围是低色温框“宽”些,高色温“窄”,不是安霸的中筒形,对应的,也不是海思的间隔一致的平行曲线。或许是为了程序实现的方便,训练光源范围都成了规范图形,这点或许不太好改,但是可以参考我第三篇文章中提到的算法,对这种平台算法找灰点得到的值进行约束,也一定可以得到更好的效果。

 

结论:

  • 所以,以后不管是什么平台,画训练光源域时,都可以用厂家提供的sensor,使用网站上提供的光源,先拟合一下,做到心中大致有数,不至于偏大或者偏小。
  • 上述拟合只能让你稍微画精确一点,不至于走向不可控。但是曲线形状为了便于硬件实现基本固定了,可以调的空间不大,这时可以想到拟合的方法,第三篇文章中所述,它不能让算法有质的改变,但是可以让算法更精准。厂商在PK的时候,如果是使用第三方平台算法,谁也不能领先友商一大截,或许在这种地方的改进能够有所帮助。

第五,混合光源问题。理论研究中我学习的不多,大部分算法都集中在单光源。但实际中这个问题很突出,比我预想的还突出。对着室内场景,室内室外光源不一致,可以明显的看到窗口处偏色,很严重。目前并没有很好的解决方案,很大一个原因是硬件的掣肘,每次只是输出一个全局的R_gain,B_gain,这样的结果是,室外的白多室外就作准,室内偏色,相反,室外偏色。那么,我们能不能采取一种迭代的算法,第一次,至少做准了一边,此时对校正过后的图像再一次处理,将R_gain ,B_gain相差不大的点(使用一个经验阈值T)mask掉(已经校正过了),再做处理,此时会估计到室外白点从而继续作准室外,如此,只需要循环不超过n次,就差不多能提高一些效果。为了进一步简化,这是在我们默认已知为混合光源场景下的策略,具体在产品中,就是在web上加一个“混合光源”的选项。这只是一个非常简单的想法,里面存在的问题,比如,在做完一次校正之后如何保证剩余的白点和其他彩色点的相对数量,mask时阈值选取的问题,但是这种思路,我认为可行,下一步在公司的自研算法中我会稍稍尝试下。

结论:

  • 在已知为混合色温的场景下,可以尝试使用一种简单的迭代策略对偏色进行校正。阈值的选取,需要一些数据训练得到。

第六,大面积单色问题。我必须承认这和理论研究有大的差异。实践中所谓大面积单色,其实也就是超过1/3的某种颜色,但实际上灰仍然很多,而我先前认为的大面积单色,真的是几乎没有灰点,理论中的很多寻找true gray point的算法在这里都显得很苍白,这也是我真正体会到理论和实际差距所在的地方。究其原因,还是硬件问题,做不到像素级处理,只得分块,使用每个块的平均通道值当做一个像素点的通道值。这就使得在求全局gain时成了一个统计,那么,占据点数较多,和日光轨迹又比较一致的单色(一般是绿色),就很容易做上去,导致偏色。而我们理论上都是进行的像素级处理,有些算法精准到甚至只有0.1%的灰,依旧能够找出来……然并卵。这就是安防里面的AWB算法脆弱的地方,稍微一点大面积,立马偏色。即使你分为了室外模式将绿色区暴力抠出,在遇到其他场景色时依旧失效。理论中对大面积单色效果比较好的算法是基于梯度的,虽然存在硬件困扰(比如紫边光晕等),但是预处理做的好的话可以试着做一下。gamut mapping除了计算量稍大,也算是一类比较好的解决方案。我下一篇文章会重点梳理基于gamut mapping的庞大的一类算法的发展脉络。

结论:

  • 平台算法太脆弱。基于edge的改进算法,基于gamut mapping的简单算法或许能够用上。

总结

把颜色作准不是简单的事情,它需要有系统的,全局的思维。有着多年调试经验的工程师是每个公司的福祉,他们应该被珍惜。

最后,展望一下。未来解决AWB的方法大概有两种大方向[2],一种是深度学习,现在公司深度学习框架已经搭建起来,但是用在其他所谓核心模块,用在AWB上也是迟早的事情,这个理论的落地比我预想来的快;第二,使用融合算法,没有适用所有场景的准则,根据场景分割,使用不同的算法,最后融合在一起。高通是比较好的代表,它将场景进行了极其细致的划分,包括光源等等。但是解决颜色问题,还是需要切实的经验,一步步的走过这些坑。

最最后,安防环境,对AWB来说应该是最宽松的环境,颜色做得“说的过去”即可,场景也大部分时间比较理想,但这是危险的,有种苟安的感觉。我在文中提到的改进方法,可以看到,仅仅是改进,是在现有平台的基础上改进,但是别家平台的简单算法未来一定不能满足更加复杂的环境,比如车载视觉。这需要我们在自己的平台上做的更好。

Reference

[1] Barnard K, Martin L, Funt B V, et al. Colour by Correlation in a Three-Dimensional Colour Space[J]. european conference on computer vision, 2000: 375-389.

[2] Hordley S D. Scene illuminant estimation: Past, present, and future[J]. Color Research and Application, 2006, 31(4): 303-314.

  • 12
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Camera2 API提供了自动白平衡(AWB)功能,可以根据场景的光线条件自动调整图像的颜色平衡。在Camera2 APIAWB由CaptureRequest.CONTROL_AWB_MODE参数控制。常见的AWB模式有以下几种: - CONTROL_AWB_MODE_OFF:关闭AWB功能。 - CONTROL_AWB_MODE_AUTO:启用AWB功能,相机设备会自动调整图像的颜色平衡。 - CONTROL_AWB_MODE_INCANDESCENT:启用AWB功能,相机设备会自动调整图像的颜色平衡以适应白炽灯光源。 - CONTROL_AWB_MODE_FLUORESCENT:启用AWB功能,相机设备会自动调整图像的颜色平衡以适应荧光灯光源。 - CONTROL_AWB_MODE_DAYLIGHT:启用AWB功能,相机设备会自动调整图像的颜色平衡以适应日光灯光源。 - CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:启用AWB功能,相机设备会自动调整图像的颜色平衡以适应多云天气下的光线条件。 以下是一个使用AWB自动白平衡的例子: ```java // 设置AWB模式为自动 mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO); // 发送请求 mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); ``` 手动白平衡(Manual White Balance)是指用户可以手动调整图像的颜色平衡,以适应特定的光线条件。在Camera2 API,手动白平衡由CaptureRequest.CONTROL_AWB_MODE参数和CaptureRequest.COLOR_CORRECTION_GAINS参数控制。手动白平衡需要先关闭AWB功能,然后设置COLOR_CORRECTION_GAINS参数为手动调整的值。以下是一个使用手动白平衡的例子: ```java // 关闭AWB功能 mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF); // 设置手动调整的颜色平衡值 Rational red = new Rational(3, 2); Rational blue = new Rational(5, 4); mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, new RggbChannelVector(red, blue, red, blue)); // 发送请求 mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback, mBackgroundHandler); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值