【LUT技術專題】ECLUT代碼解讀

目錄

原文概要

1. 訓練

2. 轉表

3. 測試


本文是對ECLUT技術的代碼解讀,原文解讀請看ECLUT。?

原文概要

ECLUT通過EC模塊增大網絡感受野,提升超分效果,實現SRLUT的改進,主要是2個創新點:

  • 提出了一個擴展卷積(expand Conv),跟RCLUT一樣,是一個用于低成本提升RF大小的模塊。
  • 一個簡單有效的scaling方法來減小旋轉累計的量化誤差,該方法的計算成本基本可以忽略不計。

其網絡結構圖如下:

?

Expanded?Conv:

?

首先根據前面的講解,我們可以發現ECLUT是在SRLUT的基礎上進行的優化,ECLUT因為只使用了2個查詢點,因此LUT的size在全尺寸下也不會很大。作者是采用了1的間隔來實現ECLUT,所以精度是能夠得到保證的,流程就可以分為,訓練、轉表以及推理,忽略確保精度的微調步驟。


1. 訓練

代碼實現如下:

### A lightweight deep network ###
class SRNet(torch.nn.Module):def __init__(self, upscale=4):super(SRNet, self).__init__()self.upscale = upscaleself.conv1 = nn.Conv2d(1, 64, [2,1], stride=1, padding=0, dilation=1)self.conv2 = nn.Conv2d(64, 64, 1, stride=1, padding=0, dilation=1)self.conv3 = nn.Conv2d(64, 64, 1, stride=1, padding=0, dilation=1)self.conv4 = nn.Conv2d(64, 64, 1, stride=1, padding=0, dilation=1)self.conv5 = nn.Conv2d(64, 64, 1, stride=1, padding=0, dilation=1)self.conv6 = nn.Conv2d(64, 9*upscale*upscale, 1, stride=1, padding=0, dilation=1)self.pixel_shuffle = nn.PixelShuffle(upscale)self.expand_conv = ExpandConv()# Init weightsfor m in self.modules():classname = m.__class__.__name__if classname.lower().find('conv') != -1:nn.init.kaiming_normal(m.weight)nn.init.constant(m.bias, 0)elif classname.find('bn') != -1:m.weight.data.normal_(1.0, 0.02)m.bias.data.fill_(0)def forward(self, x_in, alpha):B, C, H, W = x_in.size()x_in = x_in.reshape(B*C, 1, H, W)x = self.conv1(x_in)x = self.conv2(F.relu(x))x = self.conv3(F.relu(x))x = self.conv4(F.relu(x))x = self.conv5(F.relu(x))x = self.conv6(F.relu(x))x = self.pixel_shuffle(x)x = self.expand_conv(x)x = x.reshape(B, C, self.upscale*(H-1), self.upscale*W)return x * alpha

根據前面的講解,ECLUT是在SRLUT的基礎上進行的優化,因此整體結構的實現博主采取了與SRLUT的代碼差不多的方式。不同之處在于:

1)ECLUT因為只使用了2個查詢點,因此首層的卷積kernel_size是2x1。

2)pixel_shuffle之前的通道多了9倍,因為需要進行我們講到的EC模塊,即expand_conv。

3)最后的alpha加權,減小量化誤差。

這里關于最重要的模塊expand_conv的實現如下:

class ExpandConv(torch.nn.Module):def __init__(self):super(ExpandConv, self).__init__()passdef forward(self, inputs):# b, 9, h*scale, w*scale# (0,0) -> (2, 2)# pad left right top bottomshift_x1 = F.pad(inputs[:, 0:1, 1:, 1:], (0,1,0,1), mode='reflect')shift_x2 = F.pad(inputs[:, 1:2, 1:, :], (0,0,0,1), mode='reflect')shift_x3 = F.pad(inputs[:, 2:3, 1:, :-1], (1,0,0,1), mode='reflect')shift_x4 = F.pad(inputs[:, 3:4, :, 1:], (0,1,0,0), mode='reflect')shift_x5 = inputs[:, 4:5, :, :]shift_x6 = F.pad(inputs[:, 5:6, :, :-1], (1,0,0,0), mode='reflect')shift_x7 = F.pad(inputs[:, 6:7, :-1, 1:], (0,1,1,0), mode='reflect')shift_x8 = F.pad(inputs[:, 7:8, :-1, :], (0,0,1,0), mode='reflect')shift_x9 = F.pad(inputs[:, 8:9, :-1, :-1], (1,0,1,0), mode='reflect')result = shift_x1 + shift_x2 + shift_x3 +\shift_x4 + shift_x5 + shift_x6 + shift_x7 + shift_x8 + shift_x9result /= 9return result

對inputs進行9個方向的偏移,然后pad對應的長度使得其輸出大小不變,最后將他們相加進行一個融合,完成了這個EC模塊的計算過程。


2. 轉表

首先我們需要初始化一個2D的輸入。

def get_ec_lut(interval):# 1D inputbase = torch.arange(0, 257, interval)  # 0-256base[-1] -= 1L = base.size(0)# 2D input# 256*256   0 0 0...    |1 1 1...     |...|255 255 255...first = base.cuda().unsqueeze(1).repeat(1, L).reshape(-1)# 256*256   0 1 2 .. 255|0 1 2 ... 255|...|0 1 2 ... 255second = base.cuda().repeat(L)onebytwo = torch.stack([first, second], 1)  # [256*256, 2]# Rearange input: [N, 4] -> [N, C=1, H=2, W=2]input_tensor = onebytwo.unsqueeze(1).unsqueeze(1).reshape(-1, 1, 2, 1).float() / 255.0return input_tensor

然后送入推理即可,因為ECLUT是通過對多輸出進行偏移得到更大的RF,因此這里就已經得到了最終所需要的LUT。


3. 測試

測試的部分,針對第一個卷積及其后面的1x1卷積部分,可以轉換為一個完全精度的2D LUT,這個查詢是不需要插值的,因此十分簡單,第二個是expand_conv,只需要我們將1.訓練中實現的torch版本改寫為numpy的版本即可,對于最后的alpha加權,使用加2再右移2位來實現。這個代碼的實現在ECLUT的講解中有提到。


以上針對于ECLUT代碼實現的部分講解完畢,如果有不清楚的問題歡迎大家提出。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904755.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態規劃之背包問題:組合優化中的經典NP挑戰

背包問題概念: 背包問題是一種經典的組合優化的NP問題,在計算機科學、運籌學等領域有著廣泛的應用。 問題可以簡單的描述為: 假設有一個容量為C的背包和n個物品,每個物品i都有重量w[i]和價值v[i]。目標是選擇一些物品放入背包&…

vue3: pdf.js5.2.133 using typescript

npm install pdfjs-dist5.2.133 項目結構&#xff1a; <!--* creater: geovindu* since: 2025-05-09 21:56:20* LastAuthor: geovindu* lastTime: 2025-05-09 22:12:17* 文件相對于項目的路徑: \jsstudy\vuepdfpreview\comonents\pdfjs.vue* message: geovindu* IDE: vscod…

H2Database SQL 插入流程

H2Database SQL 插入流程 插入數據時會先進行 SQL 解析,然后找到插入表對應的 Primary Index 對應的 BTree,然后根據二分法定位到插入的葉子節點,將 key(主鍵) 和 value(Row) 插入到指定的葉子節點. 解析 SQL session 加鎖 創建 savepoint獲取or創建事務 設置 savepoint 執行…

虛擬機ubantu20.04系統橋接模式下無法ping通外網,但可以ping通本機的解決方案

1.出現的問題&#xff1a; 虛擬機ubantu20.04系統橋接模式下無法ping通外網,但可以ping通本機。 2.解決方案&#xff1a; 如果 DHCP 未分配 IP 地址&#xff0c;可以手動配置靜態 IP&#xff1a; 1.編輯網絡配置文件&#xff1a; sudo nano /etc/netplan/01-netcfg.yaml 修…

面對渠道競爭,品牌該如何應對?

無論是傳統零售渠道還是電商平臺的&#xff0c;渠道競爭仍舊是品牌維持和擴大影響力繞不開的一環。品牌想要保證自身的市場地位和盈利能力&#xff0c;就需要充分發揮各方面的優勢&#xff0c;來應對多變的市場環境。 一、改變產品定位 在存量市場上&#xff0c;消費者本身擁有…

SpringAI特性

一、SpringAI 顧問&#xff08;Advisors&#xff09; Spring AI 使用 Advisors機制來增強 AI 的能力&#xff0c;可以理解為一系列可插拔的攔截器&#xff0c;在調用 AI 前和調用 AI 后可以執行一些額外的操作&#xff0c;比如&#xff1a; 前置增強&#xff1a;調用 AI 前改…

101alpha_第6個

第6個alpha (-1 * correlation(open, volume, 10)) 這個就是看這兩個相似性。10天之內的 如果結果為正且數值較大&#xff0c;投資者可能會認為在開盤價上漲時成交量萎縮&#xff0c;市場上漲動力不足&#xff0c;可能是賣出信號&#xff1b;反之&#xff0c;開盤價下跌時成交…

【滲透測試】Web服務程序解析漏洞原理、利用方式、防范措施

文章目錄 Web服務程序解析漏洞原理、利用方式、防范措施一、原理**1. 定義與觸發條件****2. 攻擊鏈流程圖** 二、利用方式**1. 常見漏洞類型與利用手法**(1) IIS 5.x-6.x解析漏洞(2) Apache解析漏洞(3) Nginx解析漏洞(4) IIS 7.x解析漏洞(5) PHP CGI解析漏洞&#xff08;CVE-20…

SSL證書格式詳解:PEM、CER、DER、JKS、PKCS12等

引言 在網絡安全領域&#xff0c;SSL/TLS證書是保障互聯網通信安全的核心工具。它們通過加密連接&#xff0c;確保服務器與客戶端之間的數據隱私和完整性。然而&#xff0c;對于初學者來說&#xff0c;SSL證書的多種格式——PEM、CER、JKS、PKCS12、PFX等——常常令人困惑。每…

生信服務器如何安裝cellranger|生信服務器安裝軟件|單細胞測序軟件安裝

一.Why cellranger Cell Ranger 是由 10x Genomics 公司開發的一款用于處理其單細胞測序&#xff08;single-cell RNA-seq, scRNA-seq&#xff09;數據的軟件套件。它主要用于將原始測序數據&#xff08;fastq 文件&#xff09;轉換為可以用于下游分析的格式&#xff0c;比如基…

Redis 常見數據類型

Redis 常見數據類型 一、基本全局命令詳解與實操 1. KEYS 命令 功能&#xff1a;按模式匹配返回所有符合條件的鍵&#xff08;生產環境慎用&#xff0c;可能導致阻塞&#xff09;。 語法&#xff1a; KEYS pattern 模式規則&#xff1a; h?llo&#xff1a;匹配 hello, ha…

33號遠征隊 - 游玩鑒賞

風景很好畫質很好 , 圖片太大只能截圖一小部分 地編和特效 值得參考

使用JMETER中的JSON提取器實現接口關聯

一、JSON提取器介紹 JSON提取器是JMETER工具中用于從JSON響應中提取數據的重要組件&#xff0c;常常用于接口關聯場景中&#xff08;參數傳遞&#xff09;。 二、添加JSON提取器 舉例&#xff08;積分支付接口請求數據依賴于創建訂單接口響應的payOrderId&#xff09; 1.在…

QT6(35)4.8定時器QTimer 與QElapsedTimer:理論,例題的界面搭建,與功能的代碼實現。

&#xff08;112&#xff09; &#xff08;113&#xff09;模仿隨書老師給的源代碼搭建的&#xff0c; LCD 顯示的部分不一樣 &#xff1a; &#xff08;114&#xff09;以下開始代碼完善&#xff1a; 關聯定時器的信號與槽函數 &#xff1a; &#xff08;115&#xff09;…

nvidia-smi 和 nvcc -V 作用分別是什么?

命令1&#xff1a;nvidia-smi 可以查看當前顯卡的驅動版本&#xff0c;以及該驅動支持的CUDA版本。 命令2&#xff1a;nvcc -V 可以看到實際安裝的CUDA工具包版本為 12.8 更詳細的介紹&#xff0c;可以參考如下鏈接

Excel 數據 可視化 + 自動化!Excel 對比軟件

各位Excel小能手們&#xff01;你們有沒有過要對比兩個Excel表格數據差異&#xff0c;卻看得眼睛都花了的經歷&#xff1f;其實啊&#xff0c;現在有專門的Excel文件比較軟件能幫咱解決這大難題。這軟件就是用來快速找出兩個或多個Excel表格數據不同之處&#xff0c;還能把修改…

《軟件項目經濟性論證報告模板:全面解析與策略建議》

《軟件項目經濟性論證報告模板:全面解析與策略建議》 一、引言 1.1 項目背景闡述 在數字化浪潮席卷全球的當下,各行業對軟件的依賴程度日益加深。[行業名稱] 行業也不例外,隨著業務規模的不斷擴張、業務復雜度的持續提升以及市場競爭的愈發激烈,對高效、智能、定制化軟件…

高頻工業RFID讀寫器-三格電子

高頻工業RFID讀寫器 型號&#xff1a;SG-HF40-485、SG-HF40-TCP 產品功能 高頻工業讀寫器&#xff08;RFID&#xff09;產品用在自動化生產線,自動化分揀系統,零部件組裝產線等情境下&#xff0c;在自動化節點的工位上部署RFID讀寫設備&#xff0c;通過與制品的交互&#xf…

2025年5月計劃(linux+Gpu精粹催眠+UE獨立游戲)

終于步入正軌了&#xff0c;4月份為了各種面試&#xff0c;一會學這&#xff0c;一會學那。 現在&#xff0c;有大量的業余時間了&#xff0c;也該干點正事了。 按照規劃&#xff0c; 1&#xff0c;ue獨立游戲&#xff08;十分鐘的視頻即可&#xff09; 2&#xff0c;linux-&…

計算機學習路線與編程語言選擇(信息差)

——授人以魚不如授人以漁 計算機學習公式&#xff1a;1/3科班思維 1/3路線選擇 1/3工程能力 好工作隨便找&#xff08;來自B站小毛毛熊&#xff09; 本文主要是路線選擇&#xff01;&#xff01;&#xff01;下面開始吧。 面向崗位學習&#xff01;到招聘網站看看有哪些…