【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??=n21?i=0n?1?j=0n?1?LUT(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?2?1?c=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)=(2?m)?n2?r2 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)?n2?r2

自然,尺寸這么計算的原因是因為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?))?n2?r2計算邏輯跟上面一致,作者還用了一個圖來描述這個過程。

在這里插入圖片描述

可以看到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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84219.shtml
英文地址,請注明出處:http://en.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;光說…