【LUT技术专题】SRLUT:Practical Single-Image Super-Resolution Using Look-Up Table

图像超分算法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-. 阅读详情
AI摘要

本文介绍了利用查找表(LUT)实现超分任务的SRLUT方法。LUT是一种内存换算力思想的数据结构,SRLUT通过训练、转换、测试三步完成超分。该方法虽在效果上与DNN有差距,但在普遍性和轻量级上优势明显,不过查表对cache有需求,扩展可能遇耗时问题。


本文将从头开始对SRLUT: Practical Single-Image Super-Resolution Using Look-Up Table,这篇极轻量超分算法进行讲解。参考资料如下:
[1]. SRLUT论文地址
[2]. SRLUT代码地址
[3]. SRLUT代码讲解


专题介绍

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


一、研究背景

超分网络的需求日益增长,但大多数方法都需要GPU来进行推理。本文的研究目标就是在不利用GPU的情况下,使用Look-UP table查找表来实现超分任务。
查找表:本质是一个字典,可以通过输入的key来查找到对应的value,例如1D LUT就是一个gamma曲线,可以用来调整图像亮度;3D LUT在我们常见的PS等图像软件中可以用来调整颜色,他的原理就是通过3D LUT将一个RGB元素映射到另一个RGB上。

二、SRLUT方法

方法的整体流程图如下:

分为三步:

  1. 训练:与常规CNN网络一致,通过构建多个卷积层搭配最后的Depth to space(pixelshuffle)来完成网络的超分,值得注意的是它只有第一层的卷积是一个2x2的卷积核,其他的均为1,因此可以知道网络的感受野为2x2,为了进一步扩大感受野,SRLUT作者设计将图像进行3次旋转,每次旋转90度,此操作在不引入更多非1x1卷积的情况下,提升了感受野,使得网络的感受野变成了3x3。
  2. 转换:此步是将我们训练好的网络计算过程写入到一个固定的4D LUT中,前面我们知道步骤(1)中训练的网络感受野为2x2,因此针对于一个8bit的数据,4D LUT的4个输入存在256 * 256 * 256 * 256种可能性,将所有的可能性进行组合,可以得到它们相同大小的结果,同样以8bit去存储,在超分2倍的情况下,我们有2 * 2 * 256 * 256 * 256 * 256个数值,这些数值占用的存储大小可以计算得到256 * 256 * 256 * 256 * 4B=16GB,为了减小这部分大小,会对SRLUT的输入进行采样,假设我们均匀采样17个点,即只选择0、16、32…255,可以将整个LUT表的大小减小至17 * 17 * 17 * 17 * 4B=326.2KB,论文实际使用了17个点去进行存储。
  3. 测试:利用步骤(2)转换得到的LUT表可以进行测试,当我们对一个输入范围内的4个点I0-I3进行测试时,可以通过查找SR-LUT来计算得到结果。这里存在一个问题即,如何查找一个存在间隔的表,因为实际输入是8bit,而我们的表是经过进一步量化的,因此需要对其进行插值才能查找。这里的插值方法存在两种,首先以2D LUT的插值过程为例进行讲解:
    (a)最常见的双线性插值:一个例子可见下图。请添加图片描述

可见当输入的两个查询点是I0=24以及I1=60时,通过4bit的量化,可以计算得到他们夹在第1维1-2和第2维3-4之间,可以计算他们的坐标为1.5和3.75,此时,我们可以利用面积来得到I0、I1对应的结果。
P I 0 I 1 = ( 1 − d x ) ∗ ( 1 − d y ) ∗ P 00 + ( 1 − d x ) ∗ d y ∗ P 01 + d x ∗ ( 1 − d y ) ∗ P 10 + d x ∗ d y ∗ P 11 P_{I_{0} I_{1}}=\left(1-d_{x}\right) *\left(1-d_{y}\right) * P_{00}+\left(1-d_{x}\right) * d_{y} * P_{01}+d_{x} *\left(1-d_{y}\right) * P_{10}+d_{x} * d_{y} * P_{11} PI0​I1​​=(1−dx​)∗(1−dy​)∗P00​+(1−dx​)∗dy​∗P01​+dx​∗(1−dy​)∗P10​+dx​∗dy​∗P11​

由于所有系数的和正好是正方形的面积,因此天生是归一化的。
(b)双线性插值的浮点计算量会更大,作者选择了一种更少计算量的插值方法,2D LUT中它的名字叫三角形插值,同样利用一个例子来进行讲解。
请添加图片描述

同样的位置,作者针对这种情况会先进行选点,选择合适的点再进行插值。选点的逻辑如下,首先对角线上的点P00和P11一定会被选择,P01和P10则根据待插值点的位置来进行选择,利用dx和dy,因为dx<dy,在对角线的左上侧,则我们会选择P01作为最后一个使用到的采样点。
接下来就是得到他们的权重了,这里的权重是通过三角形的面积求得,P00就需要w0对应得三角形面积来进行加权,P11需要w2,P01需要w1,可以计算得到。
P I 0 I 1 = ( 1 − d y ) ∗ P 00 + ( d y − d x ) ∗ P 01 + d x ∗ P 11 P_{I_{0} I_{1}}=\left(1-d_{y}\right) * P_{00}+\left(d_{y}-d_{x}\right) * P_{01}+d_{x} * P_{11} PI0​I1​​=(1−dy​)∗P00​+(dy​−dx​)∗P01​+dx​∗P11​

因为面积正好也是1/2,所以权重也是正好为1,天生是归一化得。这里作者用了LSB得思路来进行讲解,本质上是一样得逻辑,如下图:
在这里插入图片描述
LSB即每个数得低4有效位,对于I0和I1来说就分别是8和12,因为I0得有效位比I1小,因此选择P01,权重得计算是一致得,只不过作者使用LSB来进行计算,因此每个w都需要除以16。
这里提两点博主对于(b)为何作者会这样去使用这个插值方法的思考:
(i):选点得方式:不固定选择对角线上得点,选择更近得3个点,这个点在实际使用时是不合理得,因为SRLUT不能够处理通道之间得关系,当我们不固定一个插值得方向时,容易出现颜色不合理得问题。
(ii):权重得计算:不使用三角形得面积,而是使用跟双线性插值一样得矩形面积来加权,这样使用得面积在三角形之外,容易发生分层问题,即插值不平滑问题,同样不合理。

上面讲完了2D LUT得情况,3D LUT得情况更加复杂一些,即我们现在是在立方体中完成插值,对于插值方式(a)来说,变成了三次线性插值,对于插值方式(b)来说,变成了四面体插值。三次线性插值此时加权系数变为了一个块得体积,插值方式(b)需要判断点位于可插值得6个四面体得不同情况,再进行同样情况得加权系数计算。

三、实验结果

在这里插入图片描述
定量的实验结果显示:SRLUT,Ours-V、Ours-F、Ours-S,分别代表感受野为2D、3D以及4D时候的SR-LUT,在效果上会比传统的插值方法要更好,但是对比DNN的方法效果还是比较差的,当然它主打的是轻量级的超分方法。
在这里插入图片描述
定性的实验结果显示,该方法还是比传统插值要更好。

四、代码

同样的,实现代码分为三个部分,分别是训练、转表、推理。

  1. 训练:网络结构如下所示,比较简单的一个网络结构,最后会使用一个pixelshuffle层来进行超分。
class SRNet(torch.nn.Module):
    def __init__(self, upscale=4):
        super(SRNet, self).__init__()

        self.upscale = upscale

        self.conv1 = nn.Conv2d(1, 64, [2,2], 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, 1*upscale*upscale, 1, stride=1, padding=0, dilation=1)
        self.pixel_shuffle = nn.PixelShuffle(upscale)

        # Init weights
        for 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):
        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 = x.reshape(B, C, self.upscale*(H-1), self.upscale*(W-1))

        return x

需要注意以下两点:
(a)输入之前需要做一次pad,因为卷积会损失分辨率。
(b)除了第一层是用2 × 2的卷积核提取的,其余几层都是使用了大小为1×1的滤波,不能在这个过程中继续提升感受野,否则转表时不能等效。
这个过程中tensor的shape大小变化是:(b, 3, h, w) ->(b * 3, 1, h, w)->(b * 3, 64, h-1, w-1)->(b * 3, 16, h-1, w-1)->(b, 3, (h-1) * 4,(w-1) * 4)
这里pad放在预处理中了,因此h和w会比原来大1,因为SRLUT只能对空间进行查找,因此第一步需要将通道放在batch上处理,第二步使用2x2卷积将通道进行扩充并进行一系列1x1卷积变换,第三步变化成超分前所需要得通道数16,最后使用pixelshuffle进行超分。

  1. 转表:思想就是将所有输入的可能性进行计算,我们之前已经分析了不可能将所有的可能性进行转表,因此这里使用了以下几种可能性:{0,16,32,64,80,96,112,128,144,160,176,192,208,224,240,255},每一维都取这17个值,即当遍历完所有可能性之后并将它们的结果记录在LUT中。后续推理过程不再需要模型,只需要查找这个LUT即可。
    作者先构建了这个4D的所有可能性数组。
 # 1D input
 base = torch.arange(0, 257, 2**SAMPLING_INTERVAL)   # 0-256
 base[-1] -= 1
 L = base.size(0)

 # 2D input
 first = base.cuda().unsqueeze(1).repeat(1, L).reshape(-1)  # 256*256   0 0 0...    |1 1 1...     |...|255 255 255...
 second = base.cuda().repeat(L)                             # 256*256   0 1 2 .. 255|0 1 2 ... 255|...|0 1 2 ... 255
 onebytwo = torch.stack([first, second], 1)  # [256*256, 2]

 # 3D input
 third = base.cuda().unsqueeze(1).repeat(1, L*L).reshape(-1) # 256*256*256   0 x65536|1 x65536|...|255 x65536
 onebytwo = onebytwo.repeat(L, 1)
 onebythree = torch.cat([third.unsqueeze(1), onebytwo], 1)    # [256*256*256, 3]

 # 4D input
 fourth = base.cuda().unsqueeze(1).repeat(1, L*L*L).reshape(-1) # 256*256*256*256   0 x16777216|1 x16777216|...|255 x16777216
 onebythree = onebythree.repeat(L, 1)
 onebyfourth = torch.cat([fourth.unsqueeze(1), onebythree], 1)    # [256*256*256*256, 4]

 # Rearange input: [N, 4] -> [N, C=1, H=2, W=2]
 input_tensor = onebyfourth.unsqueeze(1).unsqueeze(1).reshape(-1,1,2,2).float() / 255.0

当然我们将他们放在B上即可,这样我们就得到了一个输入tensor,它得维度是(17 * 17 * 17 * 17,2,2),这个送入模型可以计算出结果,把这个结果进行保存就得到了我们得超分结果LUT表了,因为论文这里使用得是4倍超分,因此这个LUT表得大小可以计算得到17 * 17 * 17 * 17 * 4 * 4B=1.274MB。PS:如果看不明白的,可以自己对着每一步进行debug,每一步的输出可以看出来就是再不断的扩充维度。

  1. 测试:刚才我们已经研究了两种插值方式,在这里就需要用到,这里因为作者分析了使用更少得点去进行插值会更快,因此就直接讲这种方式,同时因为双线性、三次、四次这类比较常见,就不进行代码得讲解。作者代码是一个4D LUT,使用得插值是4-simplex插值,与我们前面得讲的原理是一致得。
    (a)首先利用旋转,得到4张图像,原图,旋转90和180以及270得图像,这样可以将2x2得感受野扩充至3x3。
    (b)然后进行pad,扩充后图像得宽度和高度+1,这与训练一致。
    (c)使用插值得到HR结果,并进行反向得旋转,旋转回原图。
    (d)将4个结果进行平均得到最终输出。
    由于LUT每次只可以查找2x2得一个小块,所以我们在查找时与进行卷积操作一样,是需要滑窗得,通过这个滑窗得过程来不断拿到2x2得小块,小块拿到后进行查找即可,比较困难得点在于如何进行查找。如下图所示:
 if fa > fb:
     if fb > fc:
         if fc > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fb) * p1000[c,y,x] + (fb-fc) * p1100[c,y,x] + (fc-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fb > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fb) * p1000[c,y,x] + (fb-fd) * p1100[c,y,x] + (fd-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
         elif fa > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fd) * p1000[c,y,x] + (fd-fb) * p1001[c,y,x] + (fb-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fa) * p0001[c,y,x] + (fa-fb) * p1001[c,y,x] + (fb-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
     elif fa > fc:
         if fb > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fc) * p1000[c,y,x] + (fc-fb) * p1010[c,y,x] + (fb-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fc > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fc) * p1000[c,y,x] + (fc-fd) * p1010[c,y,x] + (fd-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]
         elif fa > fd:
             out[c,y,x] = (q-fa) * p0000[c,y,x] + (fa-fd) * p1000[c,y,x] + (fd-fc) * p1001[c,y,x] + (fc-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fa) * p0001[c,y,x] + (fa-fc) * p1001[c,y,x] + (fc-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]
     else:
         if fb > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fa) * p0010[c,y,x] + (fa-fb) * p1010[c,y,x] + (fb-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fc > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fa) * p0010[c,y,x] + (fa-fd) * p1010[c,y,x] + (fd-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]
         elif fa > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fd) * p0010[c,y,x] + (fd-fa) * p0011[c,y,x] + (fa-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fc) * p0001[c,y,x] + (fc-fa) * p0011[c,y,x] + (fa-fb) * p1011[c,y,x] + (fb) * p1111[c,y,x]

 else:
     if fa > fc:
         if fc > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fa) * p0100[c,y,x] + (fa-fc) * p1100[c,y,x] + (fc-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fa > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fa) * p0100[c,y,x] + (fa-fd) * p1100[c,y,x] + (fd-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
         elif fb > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fd) * p0100[c,y,x] + (fd-fa) * p0101[c,y,x] + (fa-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fb) * p0001[c,y,x] + (fb-fa) * p0101[c,y,x] + (fa-fc) * p1101[c,y,x] + (fc) * p1111[c,y,x]
     elif fb > fc:
         if fa > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fc) * p0100[c,y,x] + (fc-fa) * p0110[c,y,x] + (fa-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fc > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fc) * p0100[c,y,x] + (fc-fd) * p0110[c,y,x] + (fd-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]
         elif fb > fd:
             out[c,y,x] = (q-fb) * p0000[c,y,x] + (fb-fd) * p0100[c,y,x] + (fd-fc) * p0101[c,y,x] + (fc-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fb) * p0001[c,y,x] + (fb-fc) * p0101[c,y,x] + (fc-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]
     else:
         if fa > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fb) * p0010[c,y,x] + (fb-fa) * p0110[c,y,x] + (fa-fd) * p1110[c,y,x] + (fd) * p1111[c,y,x]
         elif fb > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fb) * p0010[c,y,x] + (fb-fd) * p0110[c,y,x] + (fd-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]
         elif fc > fd:
             out[c,y,x] = (q-fc) * p0000[c,y,x] + (fc-fd) * p0010[c,y,x] + (fd-fb) * p0011[c,y,x] + (fb-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]
         else:
             out[c,y,x] = (q-fd) * p0000[c,y,x] + (fd-fc) * p0001[c,y,x] + (fc-fb) * p0011[c,y,x] + (fb-fa) * p0111[c,y,x] + (fa) * p1111[c,y,x]

首先根据我们前面所讲的,对角线的P0000和P1111是一定会被选择的,另外就只需要选择3个点即可,这三个点的计算需要根据待插值点的位置,总共有24种可能性,fa、fb、fc、fd分别是待插值点4维的LSB值,q是量化系数,这里相当于用整型数再算,最后再除以q进行归一化,这里主要是根据文章中给出的逻辑,直接翻译成代码即可。
在这里插入图片描述

五、总结

  1. 效果上相比较DNN的方法还是有一定的差距,原因本人认为一是感受野极其有限,加上旋转也只有3 * 3,另外就是没有通道之间的联系,每个通道是单独操作的。
  2. 在使用的普遍性和轻量级这部分,优势比较明显。因为其从总体来看浮点的计算量是比较小的,比双线性会略大一些,也不需要特定的NPU或GPU去计算。但可以发现虽然其不依赖于GPU或NPU这类神经网络友好硬件,但是查表的过程对cache有一定得需求,当后续如果要对这类方法扩展时,就可能会遇到查表耗时的问题。当然在满足查表速度得前提下,是可以说用极其小的代价换了一个更好的超分结果的。

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

超分之SR-LUT源码解析 这篇文章是2016年发表在ECCV上的一篇SR文章,是SRCNN的进阶版——Fast-SRCNN,由SRCNN的同一个作者所发表。 Accelerating the Super-Resolution Convolutional Neural NetworkAbstract Abstract 是 阅读详情

相关推荐

论文笔记 | 【ECCV2022】MuLUT: Cooperating Multiple Look-Up Tables for Efficient Image Super-Resolution

Lowlevel论文笔记

CrispyFeSO4的大会堂演奏厅 2057

超分之SR-LUT

这篇文章是2021年CVPR会议论文,核心思想是用CNN网络训练一个LUT-Based的超分方法;由于表中存储了输入像素对应的HR像素值,故在测试的时候,我们只需要从表中进行读取(当然实践中还会增加插值操作,后续会讲到)。这篇文章是查表法在SR领域的首篇应用,推出的SR-LUT算法以快速实现LR→SRLR\to SRLR→SR为特点,当然也存在着一些可改进点。 参考文档: ①源码(Pytorch) ②【CVPR2021】Practical Single-Image Super-Resolution Usi.

Ton的博客 8710

液晶显示器色彩校准实用工具软件推荐与功能解析

要真正理解色彩空间的构成逻辑,必须追溯至20世纪初由国际照明委员会(CIE)提出的CIE 1931 XYZ 色彩空间。该模型基于人眼对光谱的感知实验数据,首次实现了颜色的量化表达。XYZ 空间中的三个分量 $X$、$Y$、$Z$ 并非直接对应红绿蓝三原色,而是通过线性变换从人眼视锥细胞响应曲线推导而来,具有完备性和设备无关性。在此基础上,所有设备相关的RGB色彩空间都可以视为XYZ空间的一个子集投影。例如,任何一种RGB空间都需明确定义以下四个要素:三原色的色度坐标。

weixin_42599558的博客 1643

图像超分算法小合集三:RCAN、SRLUT、ESPCN、VESPCN(混进来一个VSR)

目录RCAN、SRLUT、ESPCN、VESPCN 本文只是简单介绍这些算法和网络结构,详细内容可以在我的博客内找、

qq_45122568的博客 3642

三极管共集电极放大电路详解:射极跟随器的原理、计算与应用

三极管放大电路是模拟电子技术的基石,常见组态包括共发射极、共基极和共集电极。其中共集电极电路因输入电阻大、输出电阻小、电压增益接近1的特性,常被用作射极跟随器,在信号缓冲、级间隔离和低阻抗负载驱动等场景中发挥关键作用。其核心价值并非电压放大,而是完成阻抗变换,将高内阻信号源转换为低内阻输出,同时保持信号幅值基本不变。理解其静态工作点计算与动态参数推导(如电压增益、输入输出电阻)是设计实用电路的前提。本文结合12V电源下的具体设计实例和仿真验证,梳理了从电路识别、参数计算到工程实践的完整流程,并指出常见设计误

weixin_29193259的博客 365

httprunner V4.3.5 安装与使用--快速上手(超详细-超长篇)

HttpRunner是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。继承 Requests 的全部特性,轻松实现 HTTP(S) 的各种测试需求测试用例与代码分离,采用YAML/JSON的形式描述测试场景,保障测试用例具备可维护性测试用例支持分层机制,充分实现测试用例的复用测试用例支持参数化和数据驱动机制使用 skip 机制实现对测试用例的分组执行控制。

Dreams°的博客 3892

CVPR 2021 论文大盘点-超分辨率篇

作者 | CV君来源 | OpenCV中文网编辑 | 极市平台【导读】本文总结超分辨率相关论文,包括图像、视频、盲超分辨率、无参考型图像超分辨率以及基于参考的超分辨率等。共计 32 篇。...

深度学习技术前沿 3528

FPGA加速SNN实现MNIST手写数字识别的实践与优化

脉冲神经网络(SNN)作为第三代神经网络模型,采用生物启发的脉冲事件驱动机制,在处理时序信号时具有天然能效优势。其核心原理是通过神经元仅在接收足够输入脉冲时激活的稀疏特性,大幅降低计算能耗。在FPGA硬件加速领域,SNN通过量化优化、硬件友好型神经元模型设计等关键技术,可在边缘计算场景实现超高能效比。本文以MNIST手写数字识别为案例,详细解析了从6bit量化策略到双缓冲流水线设计的完整优化路径,最终在Xilinx Kintex-7平台实现97.54%识别准确率的同时,功耗仅231mW,能效比达81,712

weixin_30417487的博客 528

【超分辨率】5篇2021年CVPR超分辨率文章略读笔记

1.AdderSR: Towards Energy Efficient Image Super-Resolution 要点1: 本文采用加法网络(AdderNet)来实现对超分辨率任务的学习,使用加法是因为加法可以避免卷积产生的大量能量损耗,用人话来说就是卷积的乘法很费劲,很耗内存,用加法可能会更快。 要点2: 要想使用加法网络超分辨的任务,必须解决两个问题:第一个问题就是直接用加法网络无法很好地学习恒等映射(identity mapping),恒等映射就是ResNet中Shortcut短连接,即h(x)=

weixin_43728604的博客 3585

02-Cesium-实现天地图标记

首先天地图申请token,然后Cesium-实现天地图标记详细说明

m0_62785037的博客 1171

Hermes Agent Windows安装教程:本地智能体离线部署实战

本地智能体(Local Agent)是一种运行在用户设备端、无需云端依赖即可响应自然语言指令并自动化执行任务的轻量级AI运行时框架。其核心原理基于配置驱动的任务监听与脚本调用机制,通过服务化驻留实现持续响应能力,技术价值在于保障数据隐私、规避API调用限制、适配内网及老旧系统环境。典型应用场景包括财务报表自动整理、科研仪器数据归档、IT资产变更通知等Windows桌面自动化需求。本文聚焦Hermes Agent这一主流开源实现,围绕Windows平台特有的服务注册、权限模型、杀软拦截、中文路径与YAML编码

weixin_34411563的博客 433

【LUT技术专题】SPLUT: Learning Series-Parallel Lookup Tables for Efficient Image Super-Resolution

Look-Up Table(查找表,LUT)是一种数据结构(也可以理解为字典),通过输入的key来查找到对应的value。其优势在于无需计算过程,不依赖于GPU、NPU等特殊硬件,本质就是一种内存换算力的思想。LUT在图像处理中是比较常见的操作,如Gamma映射,3D CLUT等。近些年,LUT技术已被用于深度学习领域,由SR-LUT启发性地提出了模型训练+LUT推理的新范式。本专题旨在跟进和解读LUT技术的发展趋势,为读者分享最全最新的LUT方法,欢迎一起探讨交流。

PixelMind的博客 1823

ChatGPT Plus完整开通指南:从账号注册到稳定使用全流程

自然语言处理(NLP)技术通过深度学习模型实现对人类语言的理解与生成,其核心原理是基于Transformer架构的大规模预训练。GPT-4作为当前最先进的生成式AI模型,在代码编写、文档分析等场景展现出显著的技术价值。在实际应用中,稳定的网络环境和合规的支付方式是确保AI助手持续服务的关键因素。针对ChatGPT Plus的开通,需要系统性地解决账号验证、虚拟信用卡支付等工程实践问题,才能实现工作流的高效整合。

weixin_34239592的博客 426

图像超分辨率Super Resolution基本介绍与常用方法:插值、稀疏编码、卷积网络、生成对抗网络

图像超分辨率Super Resolution基本介绍与常用方法:插值、稀疏编码、卷积网络、生成对抗网络

欢迎一起成长呀 1268

全新RT-DETR 有效涨点改进目录 | 包含各种卷积、主干改进、各种注意力机制、Neck特征融合改进、损失函数、AIFI创新改进、独家创新、小目标检测、特殊场景检测等最全大论文及小论文必备创新改进点

《全新最全RT-DETR涨点改进专栏》提供500+种创新改进方案,涵盖卷积、注意力机制、主干网络等模块优化,适用于PCB检测、工业缺陷检测等场景。专栏包含顶会论文改进点、数据集增强方法、热力图可视化等实用功能,帮助科研人员快速提升模型性能。提供完整环境配置指南(Python3.10+Pytorch2.5.1)和训练教程,支持不同版本RT-DETR模型。定期更新涨点策略,配套QQ答疑群免费指导,适合从入门到发论文全流程需求,特别推荐给目标检测领域的研究生和工程师。

Ai缝合怪、助力小伙伴高效发论文 3392

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 651

【LUT技术专题】RCLUT: Reconstructed Convolution Module Based Look-Up Tables for Efficient Image SR

RCLUT提出了一个RC模块来提升网络的感受野,用了极小的代价提升了原始MULUT和SRLUT的一个效果。RCLUT的理论感受野已经提升至27x27,比MULUT、和SPLUT提升不少,但实际效果的提升有限,毕竟用于提升感受野的算子还是avg池化。代码部分将会单起一篇进行解读。(未完待续)

PixelMind的博客 2039

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LUT系列方法

每一种情况要存储对应的输出,如果放大比例是r( 比如256*256变成256r*256r),那么输出就是(r*r)大小的块(只管2*2的左上角像素点的取值),每个像素点还是8bit因此输出是r*r*8。感受野是2*2的,8-bits input image,因此一共有(2^8)^(2*2)种可能的小方块的取值,理想条件下都要存储。好好好看懂第一个不错了MULUT SPLUT SPFLUT等我用的时候再说吧哈哈哈哈真的好无聊不想看了!总共占用就是(2^8)^(2*2) * r*r*8。

weixin_55703970的博客 220

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【LUT技术专题】MuLUT: Cooperating Multiple Look-Up Tables for Efficient Image Super-Resolution

MuLUT在SRLUT的基础上,利用串联和并联的设计提升了感受野,并提出了 LUT微调的方式。相较SR-LUT,效果改进明显,且内存增加不多。

PixelMind的博客 2468

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

告别GPU依赖:手把手教你用PyTorch实现SR-LUT超分,在树莓派上也能实时运行

本文详细介绍了如何利用PyTorch实现SR-LUT超分技术,摆脱对GPU的依赖,在树莓派等资源受限设备上实现实时图像超分辨率。通过将CNN网络转换为轻量级查找表,SR-LUT技术显著降低了计算和内存需求,同时保持接近传统方法的视觉效果。文章包含完整的实现流程、优化技巧及树莓派部署实战,为嵌入式设备上的超分应用提供了实用解决方案。

weixin_42713608的博客 173

【轻量级自适应加权网络:超分】

仅供自己参考

weixin_43690932的博客 1896

轻量且高性能的视频超分算法——BasicVSR

向AI转型的程序员都关注了这个号????????????这篇文章是2021年的CVPR,文章作者是和EDVR同一批的人。该篇文章提出了一个轻量且高表现性能的视频超分framework——BasicVSR。BasicVSR改进了传统VSR结构中的propagation和alignment部分,分别提出了一个双向视频流的循环结构以及基于flow-based的feature-wise对齐方法。此外,在BasicVSR的基...

datayx的文章 4716

超分算法实战:用ExoPlayer提升低分辨率视频画质

# 超分算法实战:用ExoPlayer提升低分辨率视频画质 ## 一、视频画质困境:从模糊到清晰的技术挑战 当用户在移动设备上播放低分辨率视频时,常面临三大痛点:**细节丢失**(文字模糊不可辨)、**边缘锯齿**(物体轮廓失真)和**动态模糊**(快速移动场景拖影)。传统解决方案如简单拉伸放大只会导致像素化,而专业视频编辑软件又难以集成到移动应用中。 本文将系统讲解如何基于ExoPlaye...

gitblog_00266的博客 762

【LUT技术专题】SPLUT代码解读

本文是对SPLUT技术的代码解读,原文解读请看博主【LUT专题】系列。

PixelMind的博客 1034

【超分轻量化】Fully 1 × 1 Convolutional Network for Lightweight Image Super-Resolution (SCNet)

文中提出了一种简单而有效的**全$1 \times 1$卷积网络**,名为**Shift-Conv-based Network(SCNet)**。通过结合一个**无参数**的空间位移操作,使全$1 \times 1$卷积网络具备了强大的表示能力。

qq_40734883的博客 2081

SRLUT可以硬化【转载】

https://zhuanlan.zhihu.com/p/416836699

527
下一篇: 【扩散模型专题】DiffMorpher:Unleashing the Capability of Diffusion Models for Image Morphing
PixelMind
博客等级 码龄2年 4230粉丝 109原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值