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

【LUT技术专题】基于扩展卷积的极快速LUT算法

在这里插入图片描述

ECLUT:Efficient Look-Up Table from Expanded Convolutional Network for Accelerating Image Super-resolution(2024 AAAI)

  • 专题介绍
  • 一、研究背景
  • 二、ECLUT方法
    • 2.1 EC模块
    • 2.2 ECConv感受野的分析
    • 2.3 放缩系数α
  • 三、实验结果
  • 四、总结

本文将从头开始对ECLUT: Efficient Look-Up Table from Expanded Convolutional Network for Accelerating Image Super-resolution,这篇基于扩展卷积的极快速LUT算法进行讲解。参考资料如下,本篇文章未开放源码:
[1]. ECLUT论文地址


专题介绍

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


一、研究背景

ECLUT提出的原因是因为作者认为LUT推理的耗时主要来源于内存的访问,当前基于串并联的方法在削弱了访问LUT相比较计算的优势(cache有限),另一个问题是旋转累加的过程引入了更多的量化误差。因此提出了:
1)扩展卷积(expand Conv),跟RCLUT一样,是一个用于低成本提升RF大小的模块。
2)一个简单有效的scaling方法来减小旋转累计的量化误差,该方法的计算成本基本可以忽略不计。

作者给了一个图来表明自己方法的优势。

在这里插入图片描述

图中的方法都是老面孔了,可以看到ECLUT在LUT方法中是最快的,并且效果高于基线SRLUT,因此可知ECLUT是一个专门针对于速度优化的LUT方法。

二、ECLUT方法

ECLUT总体流程如下图所示,也是三步骤,训练、转换、测试。

在这里插入图片描述

从图(a)可以看到ECLUT的网络示意图跟SRLUT还是比较相像的,整体就一个LUT,也需要旋转推理,跟SRLUT不同的点在于:

  1. 第一层的kernel_size,这里是只有1x2,相比较SRLUT来说是减少了2个点。
  2. Expand Conv,扩展卷积,扩展卷积前面的Sub-pixel卷积其实就是pixel_shuffle模块,这部分是跟SRLUT一致的。
  3. α加权系数,所有的输出需要经过一个alpha系数。

处理后的绿色框是ECLUT的感受野,整体比SRLUT的3x3来说大了不少。

2.1 EC模块

下图是EC模块的示意图。
在这里插入图片描述
首先输入经过Hidden layers将通道数变大,然后经过Sub-pixel Conv layer,即pixelshuffle,将通道数变成分辨率,完成超分,图中显示的是2倍的超分,然后经过Expanded Conv layer,即扩展卷积,扩展卷积实际上就是将k个不同的channels(这里可以理解为9个),往不同的方向去做偏移,比如说这里的红色是向左和向上偏移了2格,黄色是向上2格,其他同理,有9个方向,这样再相加这9个结果就可以将RF增大,当然偏移了的原位置需要进行padding,这样才可以使得feature map大小是不变的,作者也提到这个操作跟我们前面讲到的SPLUT中的聚合模块是有点相似的,只不过本文的方法方向是更多样的,SPLUT是只有横向和纵向。

2.2 ECConv感受野的分析

如下图所示。
在这里插入图片描述

一个1x2的感受野feature,在某一个旋转分支经过EC模块处理之后,感受野可以变成3*4=12个,再将他们相加就可以得到21了。为什么能够从RF=2转变到RF=12,大家可以将某一种旋转的情况进行9个方向的偏移,就可以得到12个感受野大小了。

2.3 放缩系数α

简单来说就是每一个旋转的结果缩小个4倍,即α=0.25,用以下公式表示。

I S R ( i , j ) = clamp ⁡ ( round ⁡ ( α ⋅ ∑ x ∈ χ x ( i , j ) ) ) \mathbf{I}^{S R}(i, j)=\operatorname{clamp}\left(\operatorname{round}\left(\alpha \cdot \sum_{x \in \chi} x(i, j)\right)\right) ISR(i,j)=clamp(round(αxχx(i,j)))

其中α是放缩系数,round是四舍五入,clamp是clip的同义词,进行范围的限制到[0,255]。这里需要指出的是,这个跟以往LUT文章的方式存在本质区别,以往文章采用自集成策略进行训练和测试,因此也会使用到除以4(即乘以放缩系数α=0.25),区别在于以往的文章不会将这个过程中的量化误差考虑进去(以往的方法对8bit数据除以4,当然会损失精度),本文是考虑到了这个点,也给出了这个操作在8bit上的替代,这样可以进行量化训练,从而减小误差,即:

I S R ( i , j ) = clamp ⁡ ( ∑ x ∈ χ x ( i , j ) + 2 ) > > 2 ) \mathbf{I}^{S R}(i, j)=\operatorname{clamp}\left(\sum_{x \in \chi} x(i, j)+2)>>2\right) ISR(i,j)=clamp(xχx(i,j)+2)>>2)

相当于将整型数加2,再右移2位可以基本复刻上面的乘以放缩系数再round的操作,这里大家可以编写一个简单的程序进行验证,两者是一样的,但是需要注意对半向上取整,即0.5需要为1。

import math
for x in range(0, 256):x1 = math.ceil(x * 0.25 - 0.49999999) #-0.5无法实现对半时向上取整,因此保留一个极小的小数x2 = (x + 2) >> 2if x1 != x2:print(x*0.25, x1, x2)  #实际无结果输出,证明全部一致

三、实验结果

在这里插入图片描述

定量的实验结果显示:ECLUT有最快的推理速度和较基线SRLUT更好的指标,不过因为它的输出维度较多且精度较高,因此它的size也会比较大,9MB=256 * 256 * 16 * 9 / 1024 / 1024,作者对于2个点的LUT查询是全精度查询,因此没有插值的过程,这也能解释了为何ECLUT推理速度会很快。

在这里插入图片描述

定性的实验结果显示,该方法还是比传统插值和SRLUT要更好,比MU和SP会差点,但差异也不太大。

接下来作者进行了消融实验
1)放缩的系数:

在这里插入图片描述

no quant是浮点的效果,0bit是没有放缩系数,2bit是本文提到的0.25的实现方式,可以看到2bit是基本无损的,其他的都有损失。

2)EC模块尺寸的变化:
在这里插入图片描述

跟SRLUT对标,V、F、S分别是第一层1x2、1x3以及2x2,当然越大意味着感受野越大,效果会更好,但是速度和存储量会更大,因此S肯定是不合理,V是本文的方法已经达到了9MB,再加尺寸的性价比就不太高了。(当然,如果内存较为富裕时,可以考虑堆内存,上更大RF的模型)

四、总结

  1. ECLUT提出了一个EC模块来提升网络的感受野,实现了更快的推理速度,性能上又比SRLUT更好。
  2. ECLUT提出了一个alpha放缩来减小量化误差,这个思路还是简单易用的。
  3. 效果上肯定就比较一般,只能对比基线的SRLUT,追求更好的效果不建议使用它。

代码部分因为没有开源实现,博主会根据自己的理解和结合SRLUT代码单起一篇来进行解读。(未完待续)


感谢阅读,欢迎留言或私信,一起探讨和交流。

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

相关文章:

  • 【论文阅读】Harnessing the Power of LLM to Support Binary Taint Analysis
  • 浅聊find_package命令的搜索模式(Search Modes)
  • 一种扫描雷达超分辨成像检测一体化方法——论文阅读
  • [20250507] AI边缘计算开发板行业调研报告 ​​(2024年最新版)​
  • JNDI 注入原理解析
  • 力扣HOT100之链表:146. LRU 缓存
  • 信息论12:从信息增益到信息增益比——决策树中的惩罚机制与应用
  • 三角网格减面算法及其代表的算法库都有哪些?
  • “430”“531”光伏政策变革下,安科瑞如何 “保驾护航”?
  • Oracle OCP认证考试考点详解083系列11
  • windows10系统:如何使用电脑控制手机上多个应用程序(app)?
  • Oracle Goldengate并行复制
  • JS进阶DAY2 构造函数数据常用函数
  • 基于深度学习的交通标志识别系统
  • 如何根据HardFault中断抛出的寄存器值排查数组越界
  • 【EasyPan】loadDataList方法及checkRootFilePid方法解析
  • 阿里云服务器-宝塔面板安装【保姆级教程】
  • 如何将B站(哔哩哔哩)的视频下载到电脑
  • 二叉查找树,平衡二叉树(AVL),b树,b+树,红黑树
  • 实验一:Linux静态路由
  • 如何利用 Elastic Load Balancing 提升应用性能与可用性?
  • VScode一直处于循环“正在重新激活终端“问题的解决方法
  • 软件设计师2025
  • 隐私计算技术及其在数据安全中的应用:守护数据隐私的新范式
  • Word如何制作三线表格
  • ABB机器人基础课件及培训视频教程
  • RabbitMQ中Exchange交换器的类型
  • 国产Word处理控件Spire.Doc教程:在Java中为Word文本和段落设置边框
  • 【Pandas】pandas DataFrame rolling
  • ✨WordToCard使用分享✨