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.

AWB调试中(Tuning)的几个问题相关推荐

  1. android studio 自动try,Catch Try让我在Android Studio调试中感到困惑

    我试图在Android Studio中调试这段代码.这一切看起来都非常简单,但尝试中的'return sb1'不允许我打破它(带有x的红点)并且说它不可执行.Catch Try让我在Android S ...

  2. 【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )

    文章目录 一.等待进程状态改变 二.detach 脱离进程调试 PTRACE_DETACH 三.调试中继续运行程序 PTRACE_CONT 一.等待进程状态改变 上一篇博客 [Android 逆向]代 ...

  3. 【Flutter】Flutter 调试 ( 调试回退功能 | Debug 调试中查看变量的方式 | 控制台信息 )

    文章目录 一.调试回退功能 二.Debug 调试中查看变量的方式 三.Debug 控制台信息 四.相关资源 一.调试回退功能 在调试过程中 , 经常错过关键位置的调试 , 如没有进入关键方法进行调试 ...

  4. Linux驱动调试中的Debugfs的使用简介

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  5. Python3之deepcopy在print调试中的使用技巧

    在python调试中,使用print打印出中间结果容易发现问题.由于python3中的map需要list转换后才能print出具体的内容.但是list转换后,后面再用到map类型的地方会出现错误.所以 ...

  6. Linux驱动调试中的Debugfs的使用简介 CONFIG_DEBUG_FS 的功能与配置

    Linux驱动调试中的Debugfs的使用简介 (2012-03-31 14:14) 在调试linux驱动的时候,可以用debugfs来调试,debugfs类似字符设备驱动一样,甚至更简单,不需要主设 ...

  7. Xcode真机调试中“There was an internal API error“错误解决方法

    Xcode真机调试中"There was an internal API error"错误解决方法 参考文章: (1)Xcode真机调试中"There was an in ...

  8. 调试中除了在URL上加时间戳外,如何避免js、css被返回304状态?

    在本地开发环境(nginx)中,经常遇到这样的情况:调试js时浏览器总是不载入已修改的js内容,而直接吐出了上次缓存的代码. 我曾经做过以下尝试: ctrl+F5 ctrl+F5+F5+F5+F5+F ...

  9. keil调试中黄色三角形代表什么意思

    在keil mdk调试中会出现一个蓝色和黄色的三角形,分别代表什么意思 黄色三角形:代表将要执行的程序,也就是下一步就要执行这行代码了 蓝色三角形:代表光标所在的行

  10. Xcode调试中如何将指定地址转换为其指向的对象

    问题现象 一个很简单的问题:在Xcode调试中已知地址addr指向一个对象,如何获取addr指向的对象本身呢? 如上图所示,我们知道地址0x10056e6e0实际指向的是一个对象,但我们如何知道对象类 ...

最新文章

  1. java判断输入的格式化_Java的字符串及格式化输入输出
  2. Magento教程 18:Magento功能导览(2) 展示商品
  3. ubuntu mysql 5.7_Ubuntu 16.04 上安装 MySQL 5.7 教程
  4. winform窗体界面闪烁解决办法
  5. 怎样将OFD转成PDF并保留电子签章
  6. 谈一谈机器学习的基本原理
  7. 奇迹mu开服教程:开服服务端的架设及服务器推荐需要那些东西
  8. css cursor用法
  9. wordpress主题 Cosy主题3.X下载
  10. 【C语言编程4】输入年份输出全年日历
  11. 如何控制H5 video 只能后退(向后拖动)不能快进(向前拖动)
  12. Linux浏览器无法访问网络解决方案
  13. DRV8301驱动芯片BUCK电路设计
  14. 一款超好的省市区三级联动插件citypicher的使用(数据分从数据库获取或从js文件获取)
  15. java如何解析mime编码_javamail中MimeUtility解码繁体字的问题
  16. 手机扫描证件识别的优势
  17. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
  18. 用接口实现计算每个立方体的体积并输出结果的程序(接口及多态性及匿名方法的结合使用)
  19. IOS 通过麦克风检测声音分贝
  20. 面试技巧(4)面试技巧和注意事项

热门文章

  1. Python 爬虫---初窥门径
  2. 小程序从云服务器获取视频,小程序从云服务器获取视频代码
  3. 清除服务器传输文件记录,Sqlserver2012清除服务器连接记录(服务器名称历史记录清除)...
  4. [Hi3751V350][Android9.0] 调试笔记 --- 添加并设置默认系统字库
  5. workman用户组
  6. Linux查看内存状态ariveble,分析996个词根在各大考纲词汇中的作用(三)
  7. 手把手教你如何自制目标检测框架(从理论到实现)
  8. 解决This is probably not a problem with npm. There is likely additional logging output above.的问题
  9. 怎样看服务器是虚拟还是物理,如何判断服务器为虚拟机还是物理真机?
  10. Linux HaProxy安装/启动/简单配置教程