【LUT技术专题】极小尺寸LUT算法:TinyLUT

在这里插入图片描述

TinyLUT: Tiny Look-Up Table for Efficient Image Restoration at the Edge(2024 NeurIPS)

  • 专题介绍
  • 一、研究背景
  • 二、TinyLUT方法
    • 2.1 Separable Mapping Strategy
    • 2.2 Dynamic Discretization Mechanism
  • 三、实验结果
  • 四、总结

本文将从头开始对TinyLUT: Tiny Look-Up Table for Efficient Image Restoration at the Edge,这篇极致轻量化的LUT算法进行讲解,这篇主要的亮点在于作者利用LUT去替代计算从而大幅减小了LUT的尺寸,在更小的尺寸下达到了更好的效果。参考资料如下:
[1]. TinyLUT论文地址
[2]. TinyLUT代码地址


专题介绍

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


一、研究背景

TinyLUT从名字就可以看到,作者是做了一个极小尺寸的LUT算法,可以看下图,作者画出了TinyLUT与其他算法的尺寸效果对比图。
在这里插入图片描述
图中可以发现很多熟悉的面孔,包含专栏前面讲到过的SRLUT、RCLUT、MuLUT、SPLUT以及SPFLUT,TinyLUT-S尺寸的优势非常明显,且效果是优于SRLUT以及SPLUT-S的,足以证明其策略对于尺寸压缩的优势,TinyLUT-F更是占据了最好的效果的同时,尺寸也是最小的。那么作者是如何做到这个效果的,主要是以下2个策略:

  1. 提出了Separable Mapping Strategy(分离映射策略)来解决因为LUT维度过大导致的尺寸爆炸问题。
  2. 设计了一种Dynamic Discretization Mechanism(动态离散化机制)来分解激活并压缩相应的量化尺度,在不造成较大精度损失的情况下进一步缩小存储需求。

作者通过很多实验证明了这两个策略训练后的TinyLUT可以在最小存储量的同时,比其他LUT方法的效果还要更好,展示了LUT-Based方法的潜力。

二、TinyLUT方法

TinyLUT网络结构如下图所示:
在这里插入图片描述
有以下2个重点:

  1. 输入分为MSBs和LSBs,分别经过一样的分支进行处理,这里可以发现整体结构跟专栏前面讲到过的SPLUT是很相像的,当然作者会在这基础上做了进一步的优化,后续会提到。
  2. 每一个支路由以下基础模块,3x3 ConvPwBlock以及3x3 DwConv组合而成,最后将MSB和LSB进行一个相加并经过pixelshuffle层进行一个超分输出。

前面提到的两个策略会在这几个模块中体现出来,接下来会进行具体阐述。

2.1 Separable Mapping Strategy

一个老生常谈的问题,以前的LUT方法例如SRLUT,感受野越大,尺寸会爆炸性增长,这个策略就是为了解决这个问题,如下表所示。
在这里插入图片描述
可以看到,一个2x2 pixels的RF,需要4D的LUT,如果采用Full size来存储计算就是64GB=256 * 256 * 256 * 256 * 16 / 1024 / 1024 / 1024,而使用SRLUT的均匀采样后也需要1.27MB=17 * 17 *17 * 17 * 16 / 1024 / 1024。若采用本文的SMS策略,则可以减到16KB。再加上DDM后会更小。

SMS策略包含两个部分,分别是空间和通道的。

  1. 空间的SMS策略,如下图所示:
    在这里插入图片描述

可以看到以前查询一个窗口时通过直接查询 I0 - I3 这4个点得到一个结果,这使得LUT维度太大,尺寸爆炸性增长(256^4),那作者就想换一个方式,先利用4个1D LUT查询每个点对应的结果,然后再将这些结果进行相加,这样我们发现就可以将LUT尺寸减小为(256*4)。博主认为,大家可以将SMS这个操作认为是将以前卷积计算的过程修改为一个LUT查找的过程,即用一次查找替换了一次乘法,以前LUT方法当然也是在用LUT替换计算,但其因为替换了更多的乘法和加法,因此需要更多的维度,也导致了尺寸爆炸增长。作者将这个过程用公式表示:

F ^ out  = 1 n 2 ∑ i = 0 n − 1 ∑ j = 0 n − 1 L U T ( i , j ) [ x ( i , j ) ] \hat{F}_{\text {out }}=\frac{1}{n^{2}} \sum_{i=0}^{n-1} \sum_{j=0}^{n-1} L U T_{(i, j)}\left[x_{(i, j)}\right] F^out =n21i=0n1j=0n1LUT(i,j)[x(i,j)]

这里的n代表窗口的尺寸,例如SRLUT就是n=2,可以发现SMS空间的策略是一个Depthwise Conv,只在空间维度上操作。

  1. 通道的SMS策略,作者设计了一个模块叫PwBlock,如下图所示。

在这里插入图片描述

通道的交互,原理跟空间上的是一样的,在通道上我们仍然可以将查询维度变成1D,然后再加起来模拟正常的点卷积。图中可以看到有多个PwConv和ReLU串联,那因为最后这个PwBlock要变成一堆1D LUT,那么我们就需要确保每次只处理一个输入通道,相当于普通卷积设置groups参数为cin,如果此时cout=cin的话,就变成了我们熟悉的通道可分离卷积,最后的LUT查找过程跟空间上是大同小异的,公式如下所示:

F ^ out  = 1 C in  2 ∑ c = 0 C in  L U T c [ x c ] \hat{F}_{\text {out }}=\frac{1}{C_{\text {in }}^{2}} \sum_{c=0}^{C_{\text {in }}} L U T_{c}\left[x_{c}\right] F^out =Cin 21c=0Cin LUTc[xc]

可以看到一个输出通道是由Cin个LUT相加得来,尺寸也从(256 ^ Cin * Cout * 8bit)变成了(256 * Cin * Cout * 8bit)。

2.2 Dynamic Discretization Mechanism

前面提到TinyLUT会做MSB和LSB的分离,这个策略就是针对这个地方进行更深度的优化。因为数据是8bit,范围是[-128,127],当我们分成MSB和LSB时,MSB的范围是[-m,m-1],LSB的范围是[0,k](LSB是无符号的原因是MSB拿到了符号位),那我们可以根据MSB和LSB来推理出此时LUT的尺寸。

S i z e ( M S B ) = ( 2 ∗ m ) ∗ n 2 ∗ r 2 Size(MSB)=(2*m)*n^{2}*r^{2} Size(MSB)=(2m)n2r2 S i z e ( L S B ) = ( k + 1 ) ∗ n 2 ∗ r 2 Size(LSB)=(k+1)*n^{2}*r^{2} Size(LSB)=(k+1)n2r2

自然,尺寸这么计算的原因是因为MSB和LSB范围分别是2*m和k+1,然后我们再乘以kernel_size(n)和放大倍数(r)。这么一分析我们也能明白,分离能够将LUT尺寸减小的原因在于输入索引的范围减小了,为进一步优化,作者引入可学习裁剪参数 α \alpha α 以缩小范围为了进一步对其进行优化,公式如下所示:
F q = r o u n d ( F ∗ α y ) F_q=round(F*\alpha_{y}) Fq=round(Fαy),其中 α y \alpha_{y} αy是一个放缩的系数,当我们减小F(MSB或LSB)时,自然可以进一步减小尺寸,尺寸可以减小至下列公式所示大小: S i z e = ( m a x ( F q ) − m i n ( F q ) ) ∗ n 2 ∗ r 2 Size=(max(F_q)-min(F_q))*n^2*r^2 Size=(max(Fq)min(Fq))n2r2计算逻辑跟上面一致,作者还用了一个图来描述这个过程。

在这里插入图片描述

可以看到MSB开始是6bit,使用 α m \alpha_m αm之后可以被压缩,因为压缩了,自然LUT的尺寸就减小了,多个index对应的其实是一个value,且这个过程是单调的,可以作为一个LUT的index保存。作者提到这个优化手段会使用 α \alpha α为0.8的初值,且在后期的优化过程中,使用L2正则去控制它的大小,自然越小会有更强的压缩比。
博主这里的想法:使用这种压缩方法会不会使得查询过程引入更多的计算,因为 α \alpha α的存在虽然储存量增加微乎其微,但需要去对原始index做一个放缩从而找到放缩后的index,这个地方可能会引入多余的计算,在代码讲解的地方可以验证。

三、实验结果

定量的实验结果显示:TinyLUT在LUT方法中效果是最具有性价比的,无论是效果上还是耗时和内存占用上。

在这里插入图片描述
在这里插入图片描述

定性的实验结果显示,结论是一致的,强于FSRCNN,在LUT中是最具有性价比的。

在这里插入图片描述
在这里插入图片描述

接下来作者进行了消融实验
1)SMS的消融实验:
在这里插入图片描述
SMS策略的有效性证明,作者对比了SMS与不压缩和均匀压缩的效果,显然优势很明显,效果逼近不压缩的结果,但是LUT Size是最小的。

2)DDM的消融实验:
在这里插入图片描述
作者对比了使用前后的指标,基本没变化,但是LUT size进一步减小了,所以是非常有效的。进一步的,作者使用了一个图来说明DDM的优势。
在这里插入图片描述
图中,红线显示的MSB 6bit的范围,自然是64,TinyLUT-S- α \alpha α是学习的范围,TinyLUT-S-E是实际数据所在的范围,可以基本学习到的可以包围数据的范围,说明学习到的 α \alpha α对激活数据的精度进行了自适应的调整,减小了输入数据的范围,自然就减小了LUT的大小,做到了物尽其用,空间没有浪费,因此可以做到无损的减小LUT尺寸。

四、总结

TinyLUT的方法相当于做了LUT实现的卷积网络,配合上原有的一些量化知识和技巧对其继续做了容量的削减,整体做了深度的优化,从指标上也能看到优势是非常明显的,可以期待下作者后续是否可以继续扩大尺寸或者扩展到其他新型结构上(transformer或mamba),这点在文章的limitations一节也有提到。

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:VMware 虚拟机 Ubuntu 系统共享文件夹无法访问问题

以下是解决 VMware 虚拟机 Ubuntu 系统共享文件夹无法访问 问题的完整过程总结,按关键步骤和逻辑顺序梳理: 系统版本:Ubuntu 22.04.5 1. 确认 VMware Tools 已安装 验证方法:通过 ps -ef | grep vmtoolsd 检查是否存在 vmtools…

YOLOv8 的双 Backbone 架构:解锁目标检测新性能

一、开篇:为何踏上双 Backbone 探索之路 在目标检测的领域中,YOLOv8 凭借其高效与精准脱颖而出,成为众多开发者和研究者的得力工具。然而,传统的单 Backbone 架构,尽管已经在诸多场景中表现出色,但仍存在一…

k8s网络架构

Kubernetes 网络架构的设计目标是为 Pod 提供一个高效、灵活且可扩展的网络环境,同时确保 Pod 之间的通信简单直接,类似于在同一个物理网络中。以下是 Kubernetes 网络架构的原理和核心组件的详细解析: 一、Kubernetes 网络模型的基本原则 Ku…

C++高频面试考点 -- 智能指针

C高频面试考点 – 智能指针 C11中引入智能指针的概念&#xff0c;方便堆内存管理。这是因为使用普通指针&#xff0c;容易造成堆内存泄漏&#xff0c;二次释放&#xff0c;程序发生异常时内存泄漏等问题。 智能指针在C11版本之后提供&#xff0c;包含在头文件<memory>中…

JavaScript关键字完全解析:从入门到精通

前言 JavaScript作为目前最流行的编程语言之一&#xff0c;拥有丰富的关键字体系。这些关键字是语言的基础组成部分&#xff0c;理解它们的含义和用法对于掌握JavaScript至关重要。本文将详细介绍JavaScript中的所有关键字&#xff0c;包括ES6的新增关键字&#xff0c;帮助开发…

#6 百日计划第六天 java全栈学习

今天学的啥 上午 算法byd图论 图遍历dfs bfs 没学懂呵呵 找到两个良心up 图码 labuladong 看算法还好 尚硅谷讲的太浅了 那你问我 下午呢 下午 java 看了会廖雪峰的教程 回顾基础 小林coding Java基础八股文 还有集合的八股文 有的不是很懂 今天把Java基础算是完…

(4)ModalAI VOXL

文章目录 前言 4.1 购买什么 4.2 硬件设置 4.3 VOXL 摄像机配置 4.4 自动驾驶仪配置 4.4.1 使用 OpticalFlow 进行 EKF3 光源转换 4.5 视频 前言 本文介绍了如何将 ModalAI VOXL-CAM 与 ArduPilot 配合使用&#xff0c;以替代 GPS&#xff0c;从而实现 Loiter、PosHold…

大模型高效微调方法综述:P-Tuning软提示与lora低秩微调附案例代码详解

Prompt Tuning 和 P-Tuning 都属于“软提示”&#xff08;soft prompt&#xff09;范式&#xff0c;但 P-Tuning 首次提出用小型 LSTM/MLP 对提示嵌入进行编码生成&#xff0c;而 Prompt Tuning&#xff08;又称 Soft Prompt Tuning&#xff09;则直接对一段可训练的嵌入序列做…

图解深度学习 - 深度学习的工作原理

上一篇&#xff0c;我们已经知道机器学习是将输入&#xff08;比如图像&#xff09;映射到目标&#xff08;比如数字“4”&#xff09;的过程。这一过程是通过观察许多输入和目标的示例来完成的。 我们还知道&#xff0c;深度神经网络通过一系列简单的数据变换&#xff08;层&…

实现图片自动压缩算法,canvas压缩图片方法

背景&#xff1a; 在使用某些支持webgl的图形库&#xff08;eg&#xff1a;PIXI.js&#xff0c;fabric.js&#xff09;场景中&#xff0c;如果加载的纹理超过webgl可处理的最大纹理限制&#xff0c;会导致渲染的纹理缺失&#xff0c;甚至无法显示。 方案 实现图片自动压缩算…

周界安全防护新突破:AI智能分析网关V4周界入侵检测算法的技术应用

一、方案概述 在安防周界防护领域&#xff0c;传统红外对射、电子围栏等防护系统弊端显著&#xff0c;其误报率高&#xff0c;易受飞鸟、树枝等干扰&#xff0c;且在恶劣天气、复杂光照下难以精准识别入侵。随着安全需求升级&#xff0c;基于AI智能分析网关V4的周界翻越入侵检…

解决服务器重装之后vscode Remote-SSH无法连接的问题

在你的windows命令窗口输入&#xff1a; ssh-keygen -R 服务器IPssh-keygen 不是内部或外部命令 .找到Git(安装目录)/usr/bin目录下的ssh-keygen.exe(如果找不到&#xff0c;可以在计算机全局搜索) 2.属性–>高级系统设置–>环境变量–>系统变量,找到Path变量&#…

leetcode 33. Search in Rotated Sorted Array

题目描述 可以发现的是&#xff0c;将数组从中间分开成左右两部分的时候&#xff0c;一定至少有一部分的数组是有序的。左部分[left,mid-1]&#xff0c;右部分[mid1,right]。 第一种情况&#xff1a;左右两部分都是有序的&#xff0c;说明nums[mid]就是整个数组的最大值。此时…

推荐一款滴滴团队开源流程图编辑框架logic-flow

LogicFlow 是一款基于 JavaScript 的流程图编辑框架&#xff0c;提供直观的可视化界面&#xff0c;帮助用户轻松创建、编辑和管理复杂的工作流、业务逻辑或流程模型。其核心优势在于低代码化、高度可定制和强交互性&#xff0c;适用于业务系统开发、BPMN 流程设计、决策树建模等…

java 进阶 1.0.3

Thread API说明 自己滚去看文档 CPU线程调度 每一个线程的优先使用权都是系统随机分配的&#xff0c;人人平等 谁先分配到就谁先用 也可以耍赖&#xff0c;就是赋予某一个线程拥有之高使用权&#xff1a;优先级 这样的操作就叫做线程调度 最基本的是系统轮流获得 java的做法是抢…

汇川EasyPLC MODBUS-RTU通信配置和编程实现

累积流量计算(MODBUS RTU通信数据处理)数据处理相关内容。 累积流量计算(MODBUS RTU通信数据处理)_流量积算仪modbus rtu通讯-CSDN博客文章浏览阅读219次。1、常用通信数据处理MODBUS通信系列之数据处理_modbus模拟的数据变化后会在原来的基础上累加是为什么-CSDN博客MODBUS通…

【机械视觉】Halcon—【二、Halcon算子全面介绍(超详细版)】

介绍 Halcon 的算子&#xff08;operators&#xff09;按照功能被系统性地划分为多个类别&#xff0c;官方文档中目前&#xff08;Halcon 22.11 版本&#xff09;共有 19 个主分类&#xff0c;每个主分类下还有若干子分类。 本人在此对这19个分类的常用核心算子进行了一系列的…

Https流式输出一次输出一大段,一卡一卡的-解决方案

【背景】 最近遇到一个奇怪的现象&#xff0c;前端vue&#xff0c;后端python&#xff0c;服务部署在服务器上面后&#xff0c;本来一切正常&#xff0c;但公司说要使用https访问&#xff0c;想着也没什么问题&#xff0c;切过去发现在没有更改任何代码的情况下&#xff0c;ht…

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…

【mysql】mysql的高级函数、高级用法

mysql是最常用的数据库之一&#xff0c;常见的函数用法大家应该都很熟悉&#xff0c;本文主要例举一些相对出现频率比较少的高级用法 (注&#xff1a;需注意mysql版本&#xff0c;大部分高级特性都是mysql8才有的) 多值索引与虚拟列 主要是解决字符串索引问题&#xff0c;光说…