当前位置: 首页 > backend >正文

【LUT技术专题】采样间隔自适应3DLUT-AdaInt

在这里插入图片描述

采样间隔自适应3DLUT-AdaInt: Learning Adaptive Intervals for 3D Lookup Tables on Real-time Image Enhancement(2022 CVPR)

  • 专题介绍
  • 一、研究背景
  • 二、AdaInt方法
    • 2.1 Adaptive Intervals Learning (AdaInt)
    • 2.2 Differentiable Adaptive Interval Lookup Table Transform (AiLUT-Transform)
    • 2.3 损失函数
  • 三、实验结果
  • 四、总结

本文将围绕《AdaInt: Learning Adaptive Intervals for 3D Lookup Tables on Real-time Image Enhancement》展开完整解析。该研究针对 3DLUT均匀采样的LUT模块提出了一个采样间隔自适应的方法,可以减少非线性段LUT插值的误差,从而达到更好的效果。参考资料如下:
[1]. 论文地址
[2]. 代码地址


专题介绍

Look-Up Table(查找表,LUT)是一种数据结构(也可以理解为字典),通过输入的key来查找到对应的value。其优势在于无需计算过程,不依赖于GPU、NPU等特殊硬件,本质就是一种内存换算力的思想。LUT在图像处理中是比较常见的操作,如Gamma映射,3D CLUT等。

近些年,LUT技术已被用于深度学习领域,由SR-LUT启发性地提出了模型训练+LUT推理的新范式。
本专题旨在跟进和解读LUT技术的发展趋势,为读者分享最全最新的LUT方法,欢迎一起探讨交流,对该专题感兴趣的读者可以订阅本专栏第一时间看到更新。

系列文章如下:
【1】SR-LUT
【2】Mu-LUT
【3】SP-LUT
【4】RC-LUT
【5】EC-LUT
【6】SPF-LUT
【7】Dn-LUT
【8】Tiny-LUT
【9】3D-LUT
【10】4D-LUT


一、研究背景

该方法提出的动机在于3DLUT中对于LUT的采样间隔是均匀的,均匀的采样间隔在拟合非线性曲线时,存在较大的拟合误差,据此本文提出网络输出一个随着图像自适应变化的采样间隔,使得非线性区域可以使用更多的采样点,而线性的区域使用更少的采样点,这样子达到既不增多采样点数目又可以尽可能的减小拟合的误差。以下图为例进行讲解:
在这里插入图片描述
左边的两幅图是1D函数曲线使用均匀间隔和自适应间隔拟合的结果和其对应的RMSE误差,右边的两幅图是输入密度图使用不同间隔方式进行采样的示例。从左图可以看到当我们在非线性的区域使用更多的采样点时,可以很好的减小RMSE误差,道理是显而易见的,因为采样点中间的值我们只能通过线性插值去获取;右边展示的密度图也相当直观,在数据密度大的位置使用更多的采样点,可以大幅减小拟合误差,当我们在No pixel的位置放置采样点只是资源的浪费。

主要的贡献点如下:

  • 文章从采样的角度来优化3DLUT的学习和使用,指出了采样策略对具有较高非线性需求的颜色变换建模的重要性。
  • 提出了一种新的AdaInt模块和相对应的AiLUT-Transform算子,实现了具有非均匀分布采样间隔的3DLUT的端到端学习。
  • 大量的实验表明,在多个广泛使用的图像增强基准测试中,提出的方法能取得sota。

二、AdaInt方法

方法图如下所示,整体流程可以分为4步:

在这里插入图片描述
可以看到整体是基于3D-LUT的框架,通过一个轻量的CNN结构得到输出code,输出code给到Weights Predictor预测weight,同样的输出code给到AdaInt模块得到采样间隔 Q Q Q,weight将基础LUT进行融合得到颜色表 T T T,采样间隔Q进行变换得到实际的非均匀采样点位置 P P P T T T P P P进行非均匀3DLUT的渲染得到采样的3DLUT,最后使用AiLUT-Transform算子对输入图像进行一个变换,得到增强图像。

这里就不讲解基础的模块,只对其对于3DLUT的优化部分,包含AdaInt和AiLUT-Transform算子进行一个讲解,因此看之前需要大家快速浏览前置3D-LUT论文。

2.1 Adaptive Intervals Learning (AdaInt)

作者设计了一种简易实用的采样点位置生成方法,总共可以分为4步,这个地方可以配合总流程图中关于采样点位置生成相关的部分进行理解:
在这里插入图片描述

  1. Unnormalized Intervals Prediction(未归一化的间隔的预测):原输入图像经过CNN处理后输出一个特征向量。该向量通过AdaInt网络结构后,会生成一个采样间隔向量,其维度为 3 ∗ ( N s − 1 ) 3*(N_s-1) 3(Ns1)。其中, N s N_s Ns代表采样点数量(例如33)。由于RGB三个通道可以分别采用不同的采样间隔,因此最终采样间隔的维度数是单通道时的3倍。这个过程可以用公式表达为: Q ^ ∈ R 3 × ( N s − 1 ) = g ( f ( X ) ) \hat{Q} \in \mathbb{R}^{3 \times\left(N_{s}-1\right)}=g(f(X)) Q^R3×(Ns1)=g(f(X))其中 f f f g g g分别是CNN以及Adaint, X X X是输入图像。

  2. Intervals Normalization(间隔归一化):这个地方是为了将我们前面得到的间隔 Q ^ \hat{Q} Q^进行归一化,归一化的过程比较简单,就是对通道维度做一个softmax,自然在某个通道上所有间隔相加就是1了,用公式表示如下: Q ∈ [ 0 , 1 ] 3 × ( N s − 1 ) = softmax ⁡ ( Q ^ , axis  = 1 ) Q \in[0,1]^{3 \times\left(N_{s}-1\right)}=\operatorname{softmax}(\hat{Q}, \text { axis }=1) Q[0,1]3×(Ns1)=softmax(Q^, axis =1)这里axis=1是指在每个通道上操作,0维度放置的是我们的3个通道,这样可以轻易达到归一化的目的。

  3. Intervals to Coordinates Conversion(间隔到坐标的转换):间隔没法直接使用,所以需要将间隔转换为采样点,这个过程可以用下式表示: P ^ ∈ [ 0 , 1 ] 3 × ( N s ) = [ 0 3 T ; cumsum ⁡ ( Q , axis  = 1 ) ] \hat{P} \in[0,1]^{3 \times\left(N_{s}\right)}=[0_3^{T};\operatorname{cumsum}(Q, \text { axis }=1)] P^[0,1]3×(Ns)=[03T;cumsum(Q, axis =1)]这里 0 3 T 0_3^{T} 03T是一个3维的0向量,因为我们是从0开始采样的,后续的间隔就是不断累加的过程,所以会用到 cumsum ⁡ \operatorname{cumsum} cumsum算子, cumsum ⁡ \operatorname{cumsum} cumsum算子前面的 ; ; ;是concat算子,跟0向量concat在一起后得到采样的 3 ∗ N s 3*N_s 3Ns个点,值得一提的是,采样点满足2个显而易见的特征,即有界性和递增。

  4. Non-uniform 3D Lattice Construction(非均匀 3D 晶格构造):这里是通过前面得到的采样点 P ^ \hat{P} P^来获取最终的采样序列,类似于torch中的grid_sample算子,对3个维度上的 N s N_s Ns 采样点进行笛卡尔积,获取到最终的采样序列 P P P,公式表示: P ∈ [ 0 , 1 ] 3 × N s × N s × N s = P ^ r ⊗ P ^ b ⊗ P ^ g P \in[0,1]^{3 \times\N_s \times\N_s\times\N_s} =\hat{P}_r \otimes\hat{P}_b \otimes\hat{P}_g P[0,1]3×Ns×Ns×Ns=P^rP^bP^g每个维度上的N个点分别组合就得到了以上的这么多种可能性,然后每一种可能性代表着一个颜色的3维向量,因此维度也是跟分析对应上的。

通过以上步骤就得到了可用于后续计算使用的一个晶格。

2.2 Differentiable Adaptive Interval Lookup Table Transform (AiLUT-Transform)

这个过程是为了将AdaInt计算得到的 P P P、LUT的输出 T T T以及输入图像 X X X进行组合得到最终的输出 Y ^ \hat{Y} Y^,用公式表示: Y ^ = AiLUT-Transform ⁡ ( X , T , P ) \hat{Y}=\operatorname{AiLUT-Transform}(X,T,P) Y^=AiLUT-Transform(X,T,P)为了实现端到端的学习,这个公式需要对以上出现的所有量可微,否则无法进行端到端训练。作者据此设计了一个方法来满足这个目标,由以下两步组成:

  1. 查找:这个操作的目的是找到查询像素在每个维度上的左右邻居,由于前面提到采样点满足递增的特点,因此在这个过程中可以使用二分查找来找到自己的下界(lower_bound),作者用了一个图来描述。

在这里插入图片描述上图描述了一次查找的过程,这里需要提到的是因为查找间隔不固定,所以不能用之前除以间隔再取整这种简单的方法去找到其对应的下界,而需要用到本文提到的二分查找来找到自己的lower_bound。

  1. 插值:如下图所示。
    在这里插入图片描述
    现在我们获取到了8个角点就可以计算当前点的结果,这与三次插值是一样的。

最后作者对梯度做了一个推导来证实自己操作的合理性,能够完成端到端的训练,感兴趣的读者可以参考原文和附录。

2.3 损失函数

跟3DLUT中损失函数完全一致,包含3部分损失,分别是重建损失、平滑损失以及单调性损失,此在3D-LUT论文中也有详细讲解。

三、实验结果

首先讲一下消融实验

  1. 每个维度上使用采样点 N s N_s Ns的大小:结果如下所示。
    在这里插入图片描述
    无论是3DLUT还是3DLUT+AdaInt采样点个数越多效果越好,加了AdaInt在同等大小的采样点个数上效果是有提升的,这两个点都符合预期。
  2. 采样的策略:对比了3个维度都使用不同的间隔和同样间隔策略的差距,即我们使用到的 P P P的第一维是复制3份得来的还是不同的。在这里插入图片描述
    结果当然是不同的更好,复杂度提高了,不过效果提升的不是太明显。

接着是定量实验。作者对3个不同的数据集做了实验,结论更具有说服力。
在这里插入图片描述
在这里插入图片描述
以上两个数据集都是sota效果的,对比3DLUT来说是一个改进,不过改进的幅度不是太大,但是增加的计算和参数的成本确实也比较小。

然后是人像数据集,这个在3DLUT里面也有做相关实验。
在这里插入图片描述
表中的E指用于图像增强的专家,abc代表不同的专家,给出的结论都一样,效果是sota的。

接下来是定性实验,对比效果图如下:
在这里插入图片描述
表现最好。

作者后续进行了讨论环节,提出了一些现有的问题,因为AdaInt并没有对3DLUT的局限进行优化,所以前面提到的局部增强不充分以及噪声放大的问题,这里也有体现,作者给了一张示例图。
在这里插入图片描述
作者这里的分析跟3DLUT是一样的,因为3DLUT假设每个像素只根据颜色进行变换,那自然没法考虑局部细节不一样去改变这个增强的结果,因此说这个方法更适合于全局的增强。

四、总结

本文提出了一个采样间隔自适应3DLUT,将3DLUT中一个组件进行了优化,算是向更高效率的增强迈进了一步,不过效果的提升确实比较有限,实际使用中,这种自适应的间隔部署在一些更低端的设备上可能会遇到更多的麻烦,至于局限性的问题相信其他的文章会对它们进行针对性的优化。

代码部分将会单起一篇进行解读。(未完待续)


感谢阅读,欢迎留言或私信,一起探讨和交流,如果对你有帮助的话,也希望可以给博主点一个关注,谢谢。

http://www.xdnf.cn/news/14591.html

相关文章:

  • 《思维力:高效的系统思维》
  • 《Kubernetes》Pod详解+Pod控制器
  • 计量经济学(复习/自用/未完)
  • OpenAI 公布《走向理解与预防失准泛化:由“角色特征”驱动的突现性失准》研究总结
  • Postman 的 Jenkins 管理 - 自动构建
  • Redis 持久化机制详解:RDB、AOF 原理与面试最佳实践(AOF篇)
  • 1 Studying《Performance Analysis and Tuning on Modern CPUs》1-6
  • 语音情感识别:CNN-LSTM 和注意力增强 CNN-LSTM 模型的比较分析
  • godot2D的经典小游戏demo
  • Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
  • 微信小程序canvas实现抽奖动画
  • 【深度学习】条件随机场(CRF)深度解析:原理、应用与前沿
  • JS红宝书笔记 8.3 继承
  • 额度互动促进金融健康,蚂蚁消金创新智能实时交互式风控系统
  • 门锁开关;与我们生活中紧密联系!
  • IntersectionObserver API应用场景示例代码详解
  • b站视频如何下载到电脑上
  • Linux驱动学习day5
  • Linux系统移植⑨:uboot启动流程详解-bootz启动Linux过程
  • 如何在 MX Linux 上安装 Mint 的 Cinnamon 桌面 UI
  • C语言——枚举
  • STM32 GPIO 寄存器开发
  • Vue 二维码组件
  • 力扣-416.分割等和子集
  • shelve模块的使用
  • 数据结构--栈和队列
  • Cobbler批量安装流程及具体配置步骤
  • 鸿蒙开发:基于最新API,如何实现组件化运行
  • 如何用K8s+Istio进行云原生开发?
  • mysql8 sql脚本转mysql5.7