图像超分算法SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table图像超分辨率重建

在这里插入图片描述

这篇文章是首次将查表法引入SR领域。将SR网络训练好的缩放像素值存在表中,在测试阶段只需要在表中查找对应值,就能完成图像重建任务。由于该方法不需要大量的浮点运算,因此可以非常快速地执行。

原文链接:SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table 【CVPR2021】
参考目录:
超分之SR-LUT
超分之SR-LUT源码解析
源码(Pytorch)

SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table

Overview

SR_LUT的整体结构为:训练网络 - 存表 - 测试(读表) (重点部分在于存表和读表)
一张图像放大r倍,可以看成是每个像素放大r倍。文章就是基于这种思想设计的,但每个像素放大后是怎样的,由周围的像素(感受野)来决定。
训练网络: 获得一个LR到HR的全图映射。
存表:

  1. 给定感受野大小,使用前面训练好的映射来获取该感受野对应的放大后的对应区域像素值,存到查找表中。比如说给定2×2的感受野。那对应这个区域大小一共有 25 5 4 255^4 2554种像素的排列可能。也就是说,这个像素周围环境一定是这 25 5 4 255^4 2554中的一种。每一种像素的排列都要存到查找表中,这样以后不论碰到怎么样排列的像素我们都可以根据查找表恢复重建后的像素区域。所以表中一共需要存有$255^n$行 n n n是指定的感受野大小。
  2. 放大后对应图像区域仅与放大倍数r有关。给定放大倍数 r r r,每个像素放大后的对应区域大小应该是 r × r r×r r×r。感受野大小是赋予每个像素的,是用来形容这个像素周围环境的,真正的主体还是该像素,所以放大后得到 r × r r×r r×r大小。
  3. 所以整个查找表的存储量为: 25 5 n × r 2 × 8 b i t \bm{255^n \times r^2 \times 8bit} 255n×r2×8bit. (每个像素占8bit内存)

查表: 对图中每个像素位置扩展为感受野的大小,然后在查找表中找到对应的区域值,取出来作为重建块。

以上是常规的网络,但是考虑到 25 5 n 255^n 255n 行,内存消耗太多了。所以作者想出一个办法,提出了sampled-LUT变体:将255种像素值下采样,减少查找表所占的内存。采样间隔为 2 4 2^4 24 ,将输入空间划分为{ 0 , 16 , 32 , 48 , 64 , 80 , 96 , 112 , 128 , 144 , 160 , 176 , 192 , 208 , 224 , 240 , 255 }一共17个采样点。于是 25 5 n 255^n 255n种可能就下降到了 1 7 n 17^n 17n,极大减小了存储量。但这也带来了一个问题,在查表时输入图片的像素如果是非采样点,直接取其最近的采样点值代替的话,图像会损失大量细节,重建效果会非常差。于是在该部分,作者提出了各种对应感受野的插值算法

Train deep model

训练阶段其实比较常规。文中的图不能完全的表述,这里借用另一个博主的图。
在这里插入图片描述
在这一步只是纯粹的网络训练,为了得到输入图像LR到重建图像SR的映射 f f f。(其实就是训练好卷积层的参数用于下一阶段的存表)由于存表时输入的感知野很小,所以网络不需要太多的层数去堆叠,作者采用了6层CNN网络以及一层亚像素卷积层。

  1. 输入patch为48×48,输入端加padding,是为了配合第一层的2×2卷积,为了保证图像大小不变。二到六层的卷积核大小的都为1×1。除了最后一层,其余的CNN层后都接ReLU来增加模型非线性度。
  2. 最后一层卷积输出深度为 r × r r×r r×r,对应于每个像素扩展 r r r倍。
  3. 网络最后使用亚像素卷积层PixelShuffle,将深度为 r × r r×r r×r的feature map ,重组为 r × H r×H r×H,宽为 r × W r×W r×W的高分辨率图像输出,完成图像重建

作者将自集成(self ensemble)的技巧用于CNN的训练中,采用了4种增强方式,分别是旋转90°、180°、270°,之后对网络的输出做反增强操作,再取平均作为最后的输出。


Transfer to LUT

在这里插入图片描述
就和标题一样,做了一件事情,存表。
我们先捋一遍这部分过程:已经规定感受野大小为 n n n 1 × 2 、 1 × 3 、 2 × 2 , 5 1×2、1×3、2×2,5 1×21×32×25,具体5是怎么样的形状未知。作者只罗列了这四种感受野大小,再大的话,占用内存就太大了),放大倍数为 r r r。记住每个像素放大r倍,所以我们存下来的表中应该有 r 2 r^2 r2列。

感受野大小为n时,一共有 25 5 n 255^n 255n种排列可能,每种情况,对应 r 2 r^2 r2个像素值。所以一共 25 5 n 255^n 255n行, r 2 r^2 r2。看上图中 L U T [ I 0 ] [ I 1 ] [ I 2 ] [ I 3 ] [ 0 ] [ 0 ] LUT[I_0][I_1][I_2][I_3][0][0] LUT[I0][I1][I2][I3][0][0]前四位就代表了感受野大小为4,后两位对应放大倍数r=2,共四列,需要两位二进制数表示。

我们再加一个条件,采样间隔设为 W = 2 4 W = 2^4 W=24,只剩下17个采样点,LUT的行数变为 1 7 n 17^n 17n,列为 r 2 r^2 r2
看下具体是怎么做的,图片还是借用Ton博主
在这里插入图片描述
网络输入patch变为2×2(根据感受野大小),输出:深度为 r 2 r^2 r2大小为1×1。最后使用亚像素卷积将这 r 2 r^2 r2张图转换为一张 r × r r×r r×r大小的图像,将这张图像存在查找表对应行的 r 2 r^2 r2列中。
对于Sampled-LUT来说,输入格式为: ( 1 7 4 , 1 , 2 , 2 ) (17^4, 1, 2, 2) (174,1,2,2),得到一个 ( 1 7 4 , 1 , r , r ) (17^4, 1, r, r) (174,1,r,r)格式的张量,reshape一下成 ( 1 7 4 , r 2 ) (17^4, r^2) (174,r2)并保存为Numpy数组存起来供测试的时候使用。


Test using LUT

在测试阶段,就可以完全脱离CNN,只用查表得方式来恢复出图像欠缺的细节,产生高分辨率的图像。
测试的时候,输入是整张图像,对每个像素点 ( x , y ) (x,y) (x,y)遍历,找到 ( x , y ) (x,y) (x,y)周边感受野大小的像素,当前像素作为左上角,观察其右边1格、下边1格、右下1格的像素信息,相等于获取了 2 × 2 2 × 2 2×2感受野,接着去LUT里查找出以这4个像素值为索引的 r × r r × r r×r的内容结果来作为当前像素点 ( x , y ) (x,y) (x,y)重建出的 r × r r × r r×r 高分辨率像素块,因此读表是读取 2 × 2 2 × 2 2×2感受野中左上像素对应的一个 r × r r × r r×r块的过程。
这一部分中主要要学习的是插值算法如何将一个非采样值的点从表中读取重建块
在这里插入图片描述
文章对不同的感受野大小使用不用的插值方式,2D感受野使用三角插值(三个顶点),3D感受野使用四面体插值(四个顶点),4D感受野使用4-单形插值(需要5个顶点)。

首先介绍一下怎么用4D感受野的像素值在查找标中找到对应行的索引值。L是 2 8 2^8 28除于采样间隔W.
P = I 0 × L × L × L + I 1 × L × L + I 2 × L + I 3 P = I_0 \times L \times L \times L + I_1 \times L \times L + I_2 \times L + I_3 P=I0×L×L×L+I1×L×L+I2×L+I3

4D感受野下插值的步骤:

  1. 感受野中四个8bits像素值,分别提取MSB(高4位)和LSB(低4位),共获得四个MSB和四个LSB。
  2. 根据四个MSB组合排列共有16种可能分别记为 P 0000 , … , P 1111 P_{0000}, \dots , P_{1111} P0000,,P1111,获得了16个插值的顶点,但我们只需要5个。(顶点其实就是查表中对应行的索引)
  3. 根据四个LSB之间的大小关系,选用五个顶点和权重值,就能得到所求表中对应的 r × r r×r r×r大小的重建块的值。

具体操作可以看代码和这篇解析:超分之SR-LUT源码解析
在这里插入图片描述


Conclusion

这篇文章是比较新颖的,将LUT引入到SR任务中,该结构可以训练后脱离CNN使用,应用于移动端非常的方便,速度也是非常之快。
整个结构分为三个部分:

  1. 训练: 使用六层卷积和亚像素卷积层重建图像,输入patch为48×48,获得输入LR到重建SR图像的映射
  2. 存表: 使用训练好的网络遍历所有可能输入情况 1 7 n 17^n 17n(Sampled-LUT),输入为小尺寸感受野n,输出 r × r r×r r×r的重建像素,将结果保存在表中,整个表共有 1 7 n 17^n 17n行, r 2 r^2 r2列。
  3. 测试(读表): 脱离CNN网络,输入整张图像,遍历所有像素,(使用插值算法)根据感受野读取表中 r 2 r^2 r2重建像素。
  4. 注意:每个阶段输入分辨率都是不一样的。

最后祝各位科研顺利,身体健康,万事胜意~

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Golang分辨率是指使用Golang编程语言实现的一种分辨率技术。分辨率是一种图像处理技术,旨在通过对低分辨率图像进行处理,提高其分辨率和细节的清晰度。Golang作为一种高效且易于使用的编程语言,为实现分辨率算法提供了强大的支持。 在Golang中,可以利用其并发编程的特性,对图像进行并行处理,提高算法的运行效率。同时,Golang的标准库中也提供了丰富的图像处理技术和功能,如图像加载、图像缩放、像素操作等,为分辨率算法的实现提供了便利。 具体而言,实现Golang分辨率的步骤可以包括以下几个方面: 1. 图像加载和预处理:使用Golang的图像处理库,加载并预处理待处理的低分辨率图像,如灰度化、降噪等。 2. 特征提取与匹配:通过在低分辨率图像中提取特征,如纹理、边缘等,与高分辨率图像进行匹配,建立转换模型。 3. 超分辨率重建:利用得到的转换模型,对低分辨率图像进行超分辨率重建,提高图像的清晰度和细节。 4. 结果评估和优化:通过对重建后的图像进行评估,如PSNR、SSIM等指标,优化分辨率算法的效果。 在使用Golang进行分辨率的实现过程中,需要熟悉Golang的并发编程和图像处理特性,并调用相关库和函数完成各个步骤。另外,也可以结合机器学习和深度学习等技术,提高分辨率算法的效果和准确度。 总之,通过使用Golang编程语言,可以实现高效且准确的分辨率算法,为图像处理和分析领域带来更好的应用和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值