【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.mzph.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;到招聘网站看看有哪些…