专题介绍
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
目录
轻量超分算法-SPLUT(ECCV 2022)
本期解读文章:SPLUT: Learning Series-Parallel Lookup Tables for Efficient Image Super-Resolution
这篇文章也算是SRLUT的改进版本,不熟悉的读者可以先阅读[SR-LUT]这篇,而[MU-LUT]是跟SPLUT同时期的一个作品,因此在论文的实验部分没有进行两者性能对比,本文会进行一个横向的对比。
相关参考资料如下:
[1]. [SPLUT论文地址]
[2]. [SPLUT代码地址]
一、研究背景
简单一句话:目的与MuLUT一致,SPLUT也为了提升SRLUT的感受野RF,从而提升超分任务的性能,并能扩展到更多的任务上。
二、SPLUT方法
SPLUT整体流程图如下所示:
该方案的创新点有两个,
- 提出了一个无需旋转集成、多LUT串联和并联的方法来提升感受野。
- 提出了一个并行网络做补偿,来改善LUT的量化误差问题。
该并行网络有两个支路,输入分别是图像的MSB和LSB(即数据的高四位和低四位),因此数据范围变成了4bit,这个操作使得LUT表的索引值范围得到解放,量化的损失也会减小,配合简单的量化训练,就实现较小的量化误差,其中用到各种子结构会在2.1进行讲解。
总的来说,与MuLUT相同的点是:
- 多LUT串联和并联提升感受野的思想。
- 感受野的大小接近,相比较SRLUT都是用了较小的资源增加换了一个不错的效果提升。
不同的点是:
- SPLUT不需要旋转,只需要推理一次,MuLUT需要推理4次。
- SPLUT解决LUT量化误差的方法是通过将图像分解成MSB和LSB,减小LUT表查询的维度来减小了量化误差,同时量化误差也可以采用更简单的计算,直接做floor操作。MuLUT利用了LUT-aware finetune,将LUT视作可训练参数微调的方式来解决量化误差。相比较起来,SPLUT处理会更简单, 但是也损失了图像输入高低bit之间交互的能力。(或者说特征区分度受限)
2.1 网络结构
接下来针对上面提到的网络结构,分点进行细节的讲解:
1)Spatial Lookup:作者认为网络初期空间的关联相比较通道关联来说更重要,这个结构就是SRLUT的 2x2 LUT,作者设计反射填充来填充边界。
2)Query Blocks:总体结构如下图所示,
这里输入以8个通道为例讲解,通道的数量由1)中的spatial Lookup的数量而定,8个通道其实就是8个Lookup,首先将它们分为4个组,相邻的2个为一个组,M1和M2、M3和M4这样,然后最前面的2个group被放入Horizontal Aggregation中,即水平的聚合模块中,相对应的M5-M8 4个放入Vertical Aggregation中,这两个聚合模块是用来提升某一个方向的感受野,融合后得到MH和MW两个2通道的特征,然后MH和MW分别经过带空间和通道交互的LUT HC和 LUT WC处理后相加完成融合的8通道结果。
下面讲解Query Block的子结构。
- Vertical/Horizontal Aggregation:
以Horizontal Aggregation为例,它的结构如下所示:
前面讲到它的输入有两个通道,作者将第一个通道进行左padding,第二个通道进行右padding,这样特征图通道之间的空间发生了横向偏移,再相加就提升了感受野,最后进行量化跟实际推理对齐。
- 注意作者这里使用到的量化是floor,而不是使用量化误差更小的round,博主这里猜测是因为实际推理时,转为int,就是floor的操作,相当于是与实际推理对齐。
- 还有一个细节是从图中可以看到,作者这里将两个LUT相加了,却没有进行除2操作,按理说范围会变大不方便后续继续查表,但博主后续在代码中可以看到这个除2操作,因此不存在这个问题。
- LUT WC、HC:
下图是LUT HW、WC、HC的选点示例,其实就是分了两个空间的点到通道上了,因为横向和纵向是分开处理的,因此WC和HC可以减少一部分与维度无关的点给到C上。
3)skip connection:在整体流程图中,可以看到作者用了大量的skip connection,作者解释了原因,主要是有2个考虑,第一个是提高网络的表达能力,第二个是为了将低bit量化牺牲的精度给提高回来,加入一部分输入。
4)并行模块:在整体流程图中,作者将图像分成了MSB和LSB组成了一个并行的模块,每个支路用的网络结构是一模一样的,MSB主要用于捕获上下文的语义信息,LSB主要用于提供高频细节,通过两个分支输出的和来得到最终结构。相比较SRLUT和MuLUT这类方法,作者也说了一些优势:
- LUT不需要大间隔的量化,也就不需要额外插值的乘法和加法。
- 针对SRLUT,只有一个LUT的情况下,得到与SPLUT同样大小的RF,只能强行提高kernel_size去提升RF,过大的kernel_size导致转换后的LUT过大,且插值的时间复杂度会提升,这基本是不可行的。
网络结构构建完,就正常进行训练即可,这里有一个量化的模块作者没有在论文中提到,原理比较简单就是会从输出进行一个clip和floor操作完成量化即可,这个在代码里面会讲到,训练时也是用到MuLUT中讲到的STE技术。
2.2 转换
此步跟SRLUT一致,是将训练好的每个Block计算过程写入到一个固定的4D LUT中,只不过输入不是8bit,而是4bit,因此针对于4D LUT的4个输入只存在16 * 16 * 16 * 16种可能性,输出因为也是4bit,因此它的可能性会少很多,存储量也不大,我们只需要进行1的均匀采样间隔即可。同时,因为2.1中进行了量化训练,所以可以直接转换,误差不会很大。
2.3 测试
利用步骤2.2转换得到的LUT表可以进行测试,由于查表间隔取1,所以不需要用到插值,只进行量化即可,我们前面也讲到了是使用floor来操作,其他的就是正常查表的流程。
三、实验结果
作者先对比了感受野大小,如下图所示。
作者将其进行了可视化,非常好的让我们理解了Query Block如何使得感受野提升,最后可以得到RF=24,比SRLUT RF=9 来说会大不少,当然,对比MuLUT的RF=81来说又要小一些,不过本文也可以stack更多来进一步提升。
接着作者对比了定量的性能指标。
因为没有旋转和大量插值的乘加操作,又有更大的感受野,因此SPLUT对比SRLUT可以做的更快更好,不过可以看到SPLUT的内存会比较大,这也很正常,因为使用到的LUT表会比较多。SPLUT可以进行扩展,通过stack更多可以得到更好的性能。
主观的图像效果对比如下:
与性能对比基本同样的结论,效果会比SRLUT更好,然后越大的SPLUT性能越好。
接下来是**消融实验**:
- 量化精度:前面我们一直讲的精度是4bit,作者对这个进行了一个讨论,结论是16以下损失比较明显,以上提升不大,因此是使用4bit,实验结果如下。
- Query Block的组合形式:实验结果如下,这里1-2指第一层是空间的LUT,第二层是包含1个WC和HC,1-4就是说第一层是空间的LUT,第二层是包含2个WC和HC,依此递推。
对比1-2-2和1-4,可以发现深度对宽度来说是更有用,虽然是同样的5个LUT数,对比1-4-4和1-2-2,cascade更多LUT是可以进一步提升的。
- 聚合模块:实验结果如下,去除效果下降明显,分析肯定是需要的,不使用聚合模块会减小很多感受野。
四、总结
- SPLUT和MuLUT一样,在SRLUT的基础上,利用串联和并联提升了感受野,是LUT方法扩展的关键。
- SPLUT和MuLUT提出了不同的方法来解决多个LUT表串并联误差的问题,SPLUT通过将图像分为MSB和LSB多分支来解决,MuLUT使用LUT微调的方式,同样可以减小查表的误差,都同样有效提升了LUT方法得实用性,减小了训测的误差,博主认为MuLUT得方式会更好,因为SPLUT会损失输入的精度。
- 缺点与MuLUT一样,存在的问题是该版本仍没有考虑输入通道之间的关系,同时感受野太小,对于追求更高质量的图像处理任务而言还不够。
代码部分将会单起一篇进行解读。(未完待续)
感谢阅读,欢迎留言或私信,一起探讨和交流,如果对你有帮助的话,也希望可以给博主点一个关注,谢谢。