当前位置: 首页 > news >正文

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

目录

原文概要

1. 训练


本文是对DnLUT技术的代码解读,原文解读请看DnLUT。 

原文概要

DnLUT通过PCM模块和L型卷积,有效提升以往基于LUT方法降低色噪声的能力,用最小的存储量得到了同样的感受野范围,主要是2个创新点:

  • 提出了一个PCM模块(Pairwise Channel Mixer),使得其转换后LUT既不会维度太大,又可以满足通道和空间的交互性。
  • 提出了L型卷积(Rotation Non-overlapping Kernel),减小了旋转中卷积核的overlapping,从而在相同的感受野条件下,降低了LUT尺寸。

其网络结构图如下:

Pairwise Channel Mixer,如下图(c)所示,是空间和通道的交互,有3个4DLUT

L型卷积(Rotation Non-overlapping Kernel),如下图(b)所示,L型卷积在旋转后达到跟S型卷积一样的感受野,但减小了除中心位置的overlap,减小了LUT的存储压力:

首先我们通过专栏前面文章的讲解,可以预判流程实现需要分为:训练、转表、微调以及推理,这里DnLUT作者只开源了训练的部分,但其他的部分其实跟MuLUT等论文大差不差。代码整体结构如下:

跟模型实现重点的部分在dn文件夹中,关于某个层的实现在common文件夹的network.py中。


1. 训练

首先我们观察common/option_dnlut_sidd.py,可以看到DnLUT调用的模型是SRNets。

class BaseOptions():def __init__(self, debug=False):self.initialized = Falseself.debug = debugdef initialize(self, parser):# experiment specificsparser.add_argument('--model', type=str, default='SRNets')parser.add_argument('--task', '-t', type=str, default='sr')parser.add_argument('--scale', '-r', type=int, default=1, help="up scale factor")parser.add_argument('--sigma', '-s', type=int, default=50, help="noise level")parser.add_argument('--qf', '-q', type=int, default=20, help="deblocking quality factor")parser.add_argument('--nf', type=int, default=64, help="number of filters of convolutional layers")parser.add_argument('--stages', type=int, default=1, help="stages of MuLUT")parser.add_argument('--modes', type=str, default='sdy', help="sampling modes to use in every stage")parser.add_argument('--interval', type=int, default=4, help='N bit uniform sampling')parser.add_argument('--modelRoot', type=str, default='../models')parser.add_argument('--expDir', '-e', type=str, default='/home/styan/DNLUT/exp/mulut_gaussian_50', help="experiment folder")parser.add_argument('--load_from_opt_file', action='store_true', default=False)parser.add_argument('--debug', default=False, action='store_true')self.initialized = Truereturn parser

SRNets模型代码实现位于dn/model_dnlut.py中:

class SRNets(nn.Module):""" A LUT-convertable SR network with configurable stages and patterns. """def __init__(self, nf=64, scale=4, modes=['s', 'd', 'y'], stages=4, channel_mix=True):super(SRNets, self).__init__()if channel_mix:self.add_module("s1_m", SRNet("Mx1", nf=nf, upscale=None))self.add_module("s2_m", SRNet("Mx1", nf=nf, upscale=None))self.add_module("s1_q", SRNet("Qx1", nf=nf, upscale=None)) self.add_module("s2_q", SRNet("Qx1", nf=nf, upscale=None)) self.add_module("s3_q", SRNet("Qx1", nf=nf, upscale=None))for s in range(stages):  # 2-stagefor mode in modes:self.add_module("s{}_{}".format(str(s + 1), mode),SRNet("{}x1".format(mode.upper()), nf=nf))print_network(self)def forward(self, x, stage, mode):key = "s{}_{}".format(str(stage), mode)# print(key)module = getattr(self, key)return module(x)

这样可以看到,每个层使用的是SRNet结构,其实现在common/network.py中。

############### Image Super-Resolution ###############
class SRNet(nn.Module):""" Wrapper of a generalized (spatial-wise) MuLUT block. By specifying the unfolding patch size and pixel indices,arbitrary sampling pattern can be implemented."""def __init__(self, mode, nf=64, upscale=None, dense=True):super(SRNet, self).__init__()self.mode = modeprint(mode)if 'x1' in mode:assert upscale is Noneif mode == 'Sx1':self.model = MuLUTUnit('2x2', nf, upscale=1, dense=dense)self.K = 2self.S = 1elif mode == 'SxN':self.model = MuLUTUnit('2x2', nf, upscale=1, dense=dense)self.K = 2self.S = upscaleelif mode == 'Cx1':self.model = MuLUTcUnit('1x1', nf)self.K = 2self.S = 1elif mode == 'Px1':self.model = PoolNear()self.K = 2self.S = 1elif mode == 'Qx1':self.model = MuLUTcUnit('1x1q', nf)self.K = 2self.S = 1elif mode == 'Mx1':self.model_rg = MuLUTmixUnit('2x2', nf)self.model_gb = MuLUTmixUnit('2x2', nf)self.model_rb = MuLUTmixUnit('2x2', nf)self.K = 2self.S = 1elif mode == 'MxN':self.model_rg = MuLUTmixUnit('2x2', nf)self.model_gb = MuLUTmixUnit('2x2', nf)self.model_rb = MuLUTmixUnit('2x2', nf)self.K = 2self.S = 1elif mode == 'Vx1':self.model = MuLUTUnit('1x3', nf, upscale=1, dense=dense)self.K = 2self.S = 1elif mode == 'VxN':self.model = MuLUTUnit('1x3', nf, upscale=1, dense=dense)self.K = 2self.S = 1elif mode == 'TMx1':self.model = MuLUTcUnit('1x1', nf)self.K = 1self.S = 1elif mode == 'Dx1':self.model = MuLUTUnit('2x2d', nf, upscale=1, dense=dense)self.K = 3self.S = 1elif mode == 'DxN':self.model = MuLUTUnit('2x2d', nf, upscale=upscale, dense=dense)self.K = 3self.S = upscaleelif mode == 'Yx1':self.model = MuLUTUnit('1x4', nf, upscale=1, dense=dense)self.K = 3self.S = 1elif mode == 'YxN':self.model = MuLUTUnit('1x4', nf, upscale=upscale, dense=dense)self.K = 3self.S = upscaleelif mode == 'Ex1':self.model = MuLUTUnit('2x2d3', nf, upscale=1, dense=dense)self.K = 4self.S = 1elif mode == 'ExN':self.model = MuLUTUnit('2x2d3', nf, upscale=upscale, dense=dense)self.K = 4self.S = upscaleelif mode in ['Ox1', 'Hx1']:self.model = MuLUTUnit('1x4', nf, upscale=1, dense=dense)self.K = 4self.S = 1elif mode == ['OxN', 'HxN']:self.model = MuLUTUnit('1x4', nf, upscale=upscale, dense=dense)self.K = 4self.S = upscaleelse:raise AttributeErrorself.P = self.K - 1def forward(self, x):if 'TM' in self.mode:B, C, H, W = x.shapex = self.model(x)# print('down')return xelif 'C' in self.mode:B, C, H, W = x.shapex = self.model(x)# print('down')return xelif 'Q' in self.mode:B, C, H, W = x.shapex = self.model(x)# print('down')return xelif 'P' in self.mode:B, C, H, W = x.shapex = self.model(x)# print('down')return xelif 'M' in self.mode:B, C, H, W = x.shapex_rg = x[:, :2, :, :]x_gb = x[:, 1:, :, :]# x_rb = torch.stack((x[:, 0:1, :, :], x[:, 2:, :, :]),dim=1).squeeze(2)x_rb = torch.stack((x[:, 2:, :, :], x[:, 0:1, :, :]),dim=1).squeeze(2)processed_tensors = []for x, im in zip([x_rg, x_gb, x_rb], ['rg', 'gb', 'rb']):if 'rg' in im:x = self.model_rg(x)   # B*C*L,K,Kx_rg_ = xelif 'gb' in im:x = self.model_gb(x)   # B*C*L,K,Kx_gb_ = xelse:x = self.model_rb(x)   # B*C*L,K,Kx_rb_ = xprocessed_tensors.append(x)if x.is_cuda:device = x.deviceelse:device = torch.device('cpu')combined_x = torch.cat(processed_tensors, dim=1).to(device)# print('down')return combined_x#, x_rg_, x_gb_, x_rb_else:B, C, H, W = x.shapex = F.unfold(x, self.K)  # B,C*K*K,Lx = x.view(B, C, self.K * self.K, (H - self.P) * (W - self.P))  # B,C,K*K,Lx = x.permute((0, 1, 3, 2))  # B,C,L,K*Kx = x.reshape(B * C * (H - self.P) * (W - self.P),self.K, self.K)  # B*C*L,K,Kx = x.unsqueeze(1)  # B*C*L,l,K,Kif 'Y' in self.mode:x = torch.cat([x[:, :, 0, 0], x[:, :, 1, 1],x[:, :, 1, 2], x[:, :, 2, 1]], dim=1)x = x.unsqueeze(1).unsqueeze(1)elif 'V' in self.mode:# print(x.shape)x = torch.cat([x[:, :, 0, 0], x[:, :, 0, 1],x[:, :, 1, 1]], dim=1)# print(x.shape)x = x.unsqueeze(1).unsqueeze(1)elif 'H' in self.mode:x = torch.cat([x[:, :, 0, 0], x[:, :, 2, 2],x[:, :, 2, 3], x[:, :, 3, 2]], dim=1)x = x.unsqueeze(1).unsqueeze(1)elif 'O' in self.mode:x = torch.cat([x[:, :, 0, 0], x[:, :, 2, 2],x[:, :, 1, 3], x[:, :, 3, 1]], dim=1)x = x.unsqueeze(1).unsqueeze(1)x = self.model(x)   # B*C*L,K,Kx = x.squeeze(1)x = x.reshape(B, C, (H - self.P) * (W - self.P), -1)  # B,C,K*K,Lx = x.permute((0, 1, 3, 2))  # B,C,K*K,Lx = x.reshape(B, -1, (H - self.P) * (W - self.P))  # B,C*K*K,Lx = F.fold(x, ((H - self.P) * self.S, (W - self.P) * self.S),self.S, stride=self.S)return x

需要注意的有2个实现,一个是跟PCM相关的,一个是跟L型卷积相关的,分别对应的mode是Mx1以及Vx1,我们在上面关于SRNet的各种类型中定位到这具体的实现就是如下的:

        elif mode == 'Mx1':self.model_rg = MuLUTmixUnit('2x2', nf)self.model_gb = MuLUTmixUnit('2x2', nf)self.model_rb = MuLUTmixUnit('2x2', nf)self.K = 2self.S = 1elif mode == 'MxN':self.model_rg = MuLUTmixUnit('2x2', nf)self.model_gb = MuLUTmixUnit('2x2', nf)self.model_rb = MuLUTmixUnit('2x2', nf)self.K = 2self.S = 1elif mode == 'Vx1':self.model = MuLUTUnit('1x3', nf, upscale=1, dense=dense)self.K = 2self.S = 1

然后我们再观察MuLUTmixUnit和MuLUTUnit的实现,就可以基本清楚DnLUT的各个组件了,两者实现均在common/network.py中。

class MuLUTmixUnit(nn.Module):""" Channel-wise MuLUT block [RGB(3D) to RGB(3D)]. """def __init__(self, mode, nf):super(MuLUTmixUnit, self).__init__()self.act = nn.ReLU()if mode == '2x2':self.conv1 = Conv(2, nf, [1,2])else:raise AttributeErrorself.conv2 = DenseConv(nf, nf)self.conv3 = DenseConv(nf + nf * 1, nf)self.conv4 = DenseConv(nf + nf * 2, nf)self.conv5 = DenseConv(nf + nf * 3, nf)self.conv6 = Conv(nf * 5, 1, 1)def forward(self, x):x = self.act(self.conv1(x))x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = torch.tanh(self.conv6(x))return x############### MuLUT Blocks ###############
class MuLUTUnit(nn.Module):""" Generalized (spatial-wise)  MuLUT block. """def __init__(self, mode, nf, upscale=1, out_c=1, dense=True):super(MuLUTUnit, self).__init__()self.act = nn.ReLU()self.upscale = upscaleif mode == '2x2':self.conv1 = Conv(1, nf, 2)elif mode == '2x2d':self.conv1 = Conv(1, nf, 2, dilation=2)elif mode == '2x2d3':self.conv1 = Conv(1, nf, 2, dilation=3)elif mode == '1x4':self.conv1 = Conv(1, nf, (1, 4))elif mode == '1x3':self.conv1 = Conv(1, nf, (1, 3))elif mode == '1x1':self.conv1 = Conv(3, nf, (1, 1))else:raise AttributeErrorif dense:self.conv2 = DenseConv(nf, nf)self.conv3 = DenseConv(nf + nf * 1, nf)self.conv4 = DenseConv(nf + nf * 2, nf)self.conv5 = DenseConv(nf + nf * 3, nf)if mode == '1x1':self.conv6 = Conv(nf * 5, 3, 1)else:self.conv6 = Conv(nf * 5, 1 * upscale * upscale, 1)else:self.conv2 = ActConv(nf, nf, 1)self.conv3 = ActConv(nf, nf, 1)self.conv4 = ActConv(nf, nf, 1)self.conv5 = ActConv(nf, nf, 1)if mode == '1x1':self.conv6 = Conv(nf, 3 * upscale * upscale, 3)else:self.conv6 = Conv(nf, upscale * upscale, 1)if self.upscale > 1:self.pixel_shuffle = nn.PixelShuffle(upscale)def forward(self, x):x = self.act(self.conv1(x))x = self.conv2(x)x = self.conv3(x)x = self.conv4(x)x = self.conv5(x)x = torch.tanh(self.conv6(x))if self.upscale > 1:x = self.pixel_shuffle(x)return x

可以看到,其实PCM就是3个1x2,输入通道有2个的卷积,而L型卷积是kernel_size变成了一个1x3,以前是一个2x2,当然需要配合合适的input形状。

最后就是一个整体的forward过程,实现在dn/1_train_model_dnlut.py中。

mode_pad_dict = {"s": 1, "d": 2, "y": 2, "e": 3, "h": 3, "o": 3, 'm': 1, 'v': 1}def mulut_predict(model_G, x, phase="train", opt=None):modes, stages = opt.modes, opt.stagespred = 0## Pair-wise Mixer stage 1for r in [0, 1, 2, 3]:tmp = round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, 1, 0, 0), mode='replicate'), stage=1, mode='m'), (4 - r) % 4, [2, 3]) * 127)pred += tmpavg_factor, bias, norm = 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / norm# L-conv Stage 1pred = 0for mode in modes:pad = mode_pad_dict[mode]for r in [0, 1, 2, 3]:pred += round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, pad, 0, pad), mode='replicate'), stage=1, mode=mode), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = len(modes) * 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / normx1 = x# L-conv Stage 2pred = 0for mode in modes:pad = mode_pad_dict[mode]for r in [0, 1, 2, 3]:pred += round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, pad, 0, pad), mode='replicate'), stage=2, mode=mode), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = len(modes) * 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / normx2 = x# L-conv Stage 3pred = 0for mode in modes:pad = mode_pad_dict[mode]for r in [0, 1, 2, 3]:pred += round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, pad, 0, pad), mode='replicate'), stage=3, mode=mode), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = len(modes) * 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / normx3 = x# concatx_r = torch.cat([x1[:, 0:1], x2[:, 0:1], x3[:, 0:1]], dim=1).to('cuda')x_g = torch.cat([x1[:, 1:2], x2[:, 1:2], x3[:, 1:2]], dim=1).to('cuda')x_b = torch.cat([x1[:, 2:], x2[:, 2:], x3[:, 2:]], dim=1).to('cuda')# R: 3 -> 1r = 0pred = round_func(torch.rot90(model_G(F.pad(torch.rot90(x_r, r, [2, 3]), (0, 0, 0, 0), mode='replicate'), stage=1, mode='q'), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = 1, 127, 255.0x_r = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / norm# G: 3 -> 1r = 0pred = round_func(torch.rot90(model_G(F.pad(torch.rot90(x_g, r, [2, 3]), (0, 0, 0, 0), mode='replicate'), stage=1, mode='q'), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = 1, 127, 255.0x_g = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / norm# B: 3 -> 1r = 0pred = round_func(torch.rot90(model_G(F.pad(torch.rot90(x_b, r, [2, 3]), (0, 0, 0, 0), mode='replicate'), stage=1, mode='q'), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = 1, 127, 255.0x_b = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / normx = torch.cat([x_r, x_g, x_b], dim=1).to('cuda')# L-conv Stage 4pred = 0for mode in modes:pad = mode_pad_dict[mode]for r in [0, 1, 2, 3]:pred += round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, pad, 0, pad), mode='replicate'), stage=4, mode=mode), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = len(modes) * 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / norm# Pair-wise Mixer stage 2pred = 0for r in [0, 1, 2, 3]:tmp = round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, 1, 0, 0), mode='replicate'), stage=2, mode='m'), (4 - r) % 4, [2, 3]) * 127)# print(tmp.shape, r)pred += tmpavg_factor, bias, norm = 4, 127, 255.0x = round_func(torch.clamp((pred / avg_factor) + bias, 0, 255)) / norm# L-conv Stage 5pred = 0for mode in modes:pad = mode_pad_dict[mode]for r in [0, 1, 2, 3]:pred += round_func(torch.rot90(model_G(F.pad(torch.rot90(x, r, [2, 3]), (0, pad, 0, pad), mode='replicate'), stage=5, mode=mode), (4 - r) % 4, [2, 3]) * 127)avg_factor, bias, norm = len(modes), 0, 1x = round_func((pred / avg_factor) + bias)if phase == "train":x = x / 255.0return x

这里的计算过程跟我们前面讲解的论文过程是一致的,每个计算的过程是通过调用我们前面讲到的SRNets的forward实现的,通过输入不同的stage和不同的mode(比如说mode='m'调用的是PCM即MuLUTmixUnit层,L型卷积通过查看options发现其调用就是V型卷积实现,即MuLUTUnit搭配mode=1x3)得到不同层的输出,中间当然需要搭配旋转和量化clip,最后完成输出。


以上针对于DnLUT的训练代码实现的部分讲解完毕,如果有不清楚的问题欢迎大家提出,关于转表和微调测试的部分大家可以自己尝试实现,原理逻辑是跟前面的文章一致的。

相关文章:

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

目录 原文概要 1. 训练 本文是对DnLUT技术的代码解读,原文解读请看DnLUT。 原文概要 DnLUT通过PCM模块和L型卷积,有效提升以往基于LUT方法降低色噪声的能力,用最小的存储量得到了同样的感受野范围,主要是2个创新点&#xff1…...

python宠物用品商城系统

目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中&#xf…...

2156. 查找给定哈希值的子串

给定整数 p 和 m ,一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算: hash(s, p, m) (val(s[0]) * p0 val(s[1]) * p1 ... val(s[k-1]) * pk-1) mod m. 其中 val(s[i]) 表示 s[i] 在字母表中的下标,从 val(a) 1 到 v…...

Index-AniSora技术升级开源:动漫视频生成强化学习

B站升级动画视频生成模型Index-AniSora技术并开源,支持番剧、国创、漫改动画、VTuber、动画PV、鬼畜动画等多种二次元风格视频镜头一键生成! 整个工作技术原理基于B站提出的 AniSora: Exploring the Frontiers of Animation Video Generation in the So…...

游戏引擎学习第297天:将实体分离到Z层中

回顾并为今天的内容做准备 昨天我们做了雾效混合(fog blend)和透明度混合(alpha blending)的尝试,现在正在进行渲染部分的深度(Z)清理工作。今天的重点是把“切片”(slices&#xf…...

全局对比度调整

目录 一、全局对比度调整原理 二、饱和度保持 一、全局对比度调整原理 Figure1.2 展示了一幅全局对比度较低的图像及其亮度直方图。该直方图分布范围较窄,像素的强度仅集中在中间调区域,不存在明亮或深色的像素,因此图像中的细节难以区分,可用动态范围未得到有效利用。在动…...

Canvas SVG BpmnJS编辑器中Canvas与SVG职能详解

Canvas详解与常见API 一、Canvas基础 核心特性 • 像素级绘图:Canvas是基于位图的绘图技术,通过JavaScript操作像素实现图形渲染,适合动态、高性能场景(如游戏、数据可视化)。 • 即时模式:每次绘制需手动…...

【图像大模型】Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南

Stable Diffusion 3 Medium:多模态扩散模型的技术突破与实践指南 一、架构设计与技术演进1.1 核心架构革新1.2 关键技术突破1.2.1 整流流(Rectified Flow)1.2.2 动态掩码训练 二、系统架构解析2.1 完整推理流程2.2 性能对比 三、实战部署指南…...

PID项目---硬件设计

该项目是立创训练营项目,这些是我个人学习的记录,记得比较潦草 1.硬件-电路原理电赛-TI-基于MSPM0的简易PID项目_哔哩哔哩_bilibili 这个地方接地是静电的考量 这个保护二极管是为了在电源接反的时候保护电脑等设备 大电容的作用:当电机工作…...

渗透测试流程

2.1 信息收集 2.1.1 资产监控与架构分析 目标:明确目标范围(IP、域名、子公司资产),识别网络架构(云服务/CDN/反向代理)。 工具与技巧: 使用FOFA、Shodan搜索关联资产(如title="目标公司")。 通过nslookup或dig解析域名,确认真实IP是否隐藏于CDN…...

PCIe EP/RC 核心功能解释

1. Bar访问(BAR Access) BAR(Base Address Register) 是 PCIe 设备上的 地址窗口,用于主机与设备之间的 寄存器访问。功能: 主机通过 BAR 访问 EP 卡的 控制寄存器 或 数据缓冲区。每个 BAR 对应一段物理内…...

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht...

SQLynx 团队协作实践:提升数据库开发效率的解决方案​

在数据库开发与管理场景中,团队协作的效率直接影响项目进度与质量。传统协作方式常面临权限混乱、代码复用率低、跨地域协作困难等问题,而 SQLynx 作为一款轻量化 Web SQL 工具,凭借其独特的团队协作功能,为这些难题提供了有效解决…...

基于自然语言转SQL的BI准确率如何?

基于自然语言转SQL的商业智能(BI)工具的准确率受多种因素影响,目前整体处于中等偏上水平,但尚未达到完全精准的程度。以下从技术原理、影响准确率的因素、实际应用场景及未来趋势等方面展开分析: 一、技术原理与当前准…...

「华为」持续加码人形机器人赛道!

温馨提示:查看运营团队2025年最新原创报告(共210页) —— 正文: 现阶段,全球大厂入局具身智能赛道典型代表:[英伟达]和[特斯拉],是全球科技巨头/大厂(谷歌、微软、Meta、OpenAI、华…...

Visual Studio 2022 无法编译.NET 9 项目的原因和解决方法

Visual Studio 2022 无法运行.NET 9 项目的原因和解决方法。 目录 1. Visual Studio 2022 无法编译TargetFramework是.NET 9 项目 2. 解决方法 3. 用Visual Studio Code开发 1. Visual Studio 2022 无法编译TargetFramework是.NET 9 项目 本机安装了Visual Studio 2022 版…...

C++从入门到实战(十六)String(中)String的常用接口(构造接口,析构接口,迭代器,遍历修改,容量管理与数据访问)

C从入门到实战(十六)String(中)详细讲解String的常用接口 前言一、std::string二、string的构造接口1. 默认构造函数:创建空字符串2. 拷贝构造函数:复制已有字符串3. 从已有字符串截取部分4. 用C风格字符串…...

RabbitMQ ⑤-顺序性保障 || 消息积压 || 幂等性

幂等性保障 幂等性(Idempotency) 是计算机科学和网络通信中的一个重要概念,指的是某个操作无论被执行多少次,所产生的效果与执行一次的效果相同。 应用程序的幂等性: 在应用程序中,幂等性就是指对一个系统…...

go.mod:5: unknown directive: toolchain

Go语言版本较旧,而项目使用了较新版本的Go语言特性。错误信息"unknown directive: toolchain"表明go.mod文件中使用了"toolchain"指令,这是在Go 1.21版本中新引入的特性,但您当前安装的Go版本不支持这个指令。 解决方法…...

分布式序列生成方案 : Redis Incr | 基于Redisson创建自增获取序号,每天更换一个key, key到期时间1天,用于创建订单号、快递单号

文章目录 引言I 在 Spring Boot 应用程序中集成 Redisson1. Maven2. 配置 Redisson 客户端3. 创建 Redisson 配置类4. 自动装配 RedissonClientII 应用: 基于Redisson创建自增获取序号生成每日自增序号创建订单号创建快递单号封装 :系统自动生成单号引言 应用: 创建订单号、…...

Android7 Input(八)App Input事件接收器InputEventReceiver

概述 上一个章节,我们讲解了App如何使用InputChannel通道与input系统服务建立通信的桥梁的过程,本章我们讲述App如何从input系统服务中获取上报的输入事件,也就是我们本章讲述的InputEventReceiver。 本文涉及的源码路径 frameworks/base/c…...

阿里云服务器Ubuntu的git clone失败问题解决方案

一、问题 我们再使用阿里云服务器或者别的服务器,git clone失败 二、解决方案 ​1. 确认SSH密钥是否存在并正确配置​​ ​​检查密钥文件​​: ls -al ~/.ssh 确认存在 id_rsa(私钥)和 id_rsa.pub(公钥&#xff…...

Mujoco 学习系列(二)基础功能与xml使用

这篇文章是 Mujoco 学习系列第二篇,主要介绍一些基础功能与 xmI 使用,重点在于如何编写与读懂 xml 文件。 运行这篇博客前请先确保正确安装 Mujoco 并通过了基本功能与GUI的验证,即至少完整下面这个博客的 第二章节 内容: Mujoc…...

8 定时任务与周期性调度

在构建复杂的分布式系统时,我们经常会遇到需要“定时”或“周期性”执行的任务。比如,每天凌晨生成报表,每小时同步一次数据,或者在特定时间发送提醒邮件。这些任务如果都依赖人工触发,不仅效率低下,而且容…...

idea 插件开发自动发布到 nexus 私服中(脚本实例)

如下脚本内容为 idea 插件开发项目中的 build.gradle.kts 文件示例,其中自定了 updatePluginsXml 和 uploadPluginToNexus 两个任务,一个用来自动修改 nexus 中的配置文件,一个用来自动将当前插件打包后的 zip 文件上传到 nexus 私服中。 脚…...

关于 APK 反编译与重构工具集

一、apktool — APK 解包 / 重打包 apktool 是一款开源的 Android APK 工具,用于: 反编译 APK 查看资源和布局文件 生成 smali 文件(DEX 的反汇编) 对 APK 进行修改后重新打包 它不能还原 Java 源码,只能将 D…...

【课堂笔记】核方法和Mercer定理

文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况,此时通常需要将其映射到高维空间中,使其变得线性可分。例如二维数据: 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…...

Cribl 中 Parser 扮演着重要的角色 + 例子

先看文档: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…...

MVDR源码(可直接运行)

该代码可正常运行,信号使用的是模拟信号,可改为指定信号。 本代码使用了一个基于MVDR(最小方差无失真响应)算法的麦克风阵列声源定位方法。代码首先设置了麦克风阵列的参数,包括阵元数量、采样率、信号频率等&#xff…...

MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统

MyBatis实战指南(一)MyBatis入门基础与利用IDEA从零开始搭建你的第一个MyBatis系统 一、什么是MyBatis1. MyBatis 是什么?2. JDBC 的三大痛点3. MyBatis 的核心优势1. 告别重复代码,专注核心逻辑2. 灵活控制 SQL,适应各…...

React Flow 数据持久化:Django 后端存储与加载的最佳实践(含详细代码解析)

在构建 React Flow 应用时,前端呈现的节点与连线构成的可视化流程只是冰山一角,其背后的数据持久化与灵活调取才是确保应用稳定运行、支持用户数据回溯与协作的关键。因此,后端存储与加载 React Flow 信息的环节,就如同整个应用的…...

第32节:基于ImageNet预训练模型的迁移学习与微调

1. 引言 在深度学习领域,迁移学习(Transfer Learning)已经成为解决计算机视觉任务的重要方法,特别是在数据量有限的情况下。其中,基于ImageNet数据集预训练的模型因其强大的特征提取能力而被广泛应用于各种视觉任务。本文将详细介绍迁移学习的概念、ImageNet预训练模型的特…...

接口自动化可视化展示

目的将接口返回的实际对比返回 前端:使用Geeker-Admin二次开发使用 后端 flaskpythonrequests 实际实现展示 接口测试通过 接口测试不通过 接口数据的增删改查...

Hbuilder X4.65新建vue3项目存在的问题以及解决办法

有关Vue的多篇文章: 1.使用Vue创建前后端分离项目的过程:使用Vue创建前后端分离项目的过程(前端部分)_vue前端项目打包的dish-CSDN博客 2.vue3实现自定义导航菜单:vue3实现自定义导航菜单_vue3 导航栏-CSDN博客 3…...

SpringBoot 项目实现操作日志的记录(使用 AOP 注解模式)

本文是博主在做关于如何记录用户操作日志时做的记录,常见的项目中难免存在一些需要记录重要日志的部分,例如权限和角色设定,重要数据的操作等部分。 博主使用 Spring 中的 AOP 功能,结合注解的方式,对用户操作过的一些…...

C/C++ 整数类型的长度

参考 cppreference.cn 在某些语言中,整数类型的长度是固定的,如java中 char 8short 16int 32long 64 可是C/C 与机器相关,整数类型长度与平台有关 先可以记一个简单的 按照C标准: char > 8short > 16int > 16long &g…...

解决npm install报错:getaddrinfo ENOTFOUND registry.nlark.com

问题背景 在使用 npm install 安装依赖时,突然遇到以下错误: npm ERR! network request to https://registry.nlark.com/fsevents/download/fsevents-2.3.2.tgz failed, reason: getaddrinfo ENOTFOUND registry.nlark.com这表明 npm 在尝试从 registr…...

PostgreSQL简介安装

目录 一. PostgreSQL 1. 简介 2. 特点 3. 优势 4. 架构 5. 应用场景 二. 安装PostgerSQL 1. 编译安装 (1) 安装编译安装所需环境 (2) 编译安装 (3) 配置环境变量 (4) 登录数据库 2. DNF安装 (1) 安装postgreSQL (2) 初始化数据库 (3) 登录数据库 三. postgreSQ…...

vue3+elementPlus穿梭框拖拽

安装 npm install sortablejs --save <template><div class"transfer" ref"transfer"><div><el-transfer v-model"inputForm" :data"data" :titles"titles"><template #default"{ option }…...

牛客周赛 Round 93题解(个人向A-E)

牛客周赛 Round 93题解&#xff08;个人向A-E&#xff09; 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/109904 a题 签到题&#xff0c;直接按题意模拟即可 #include <bits/stdc.h> using namespace std; #define ll long long int main() {ios::sync_…...

MySQL高可用之ProxySQL + MGR 实现读写分离实战

部署MGR 1、MGR 前置介绍 阿里云RDS集群方案用的就是MGR模式&#xff01; 1.1、什么是 MGR MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞生的&#xff0c;是MySQL自带的一个插件&#xff0c;可以灵活部署。保证数据一致性又可以自动切换&#x…...

React TS中如何化简DOM事件的定义

概要 我们在做TS开发时候&#xff0c;总要面对各种类型的定义。React使用自己的Sythetic Event机制管理DOM事件&#xff0c;不同于原生的DOM事件定义&#xff0c;所以在TS中&#xff0c;事件的类型定义更加繁琐。 本文提供一中简化定义的方法&#xff0c;在使用中&#xff0c…...

BigemapPro蒙版使用技巧:精准导出地图范围

在地图制图过程中&#xff0c;我们常常会遇到需要按照特定边界裁剪地图&#xff0c;或者对指定范围以外的地图进行模糊处理等情况&#xff0c;这时"添加蒙版"功能就非常实用。 BigemapPro的蒙版功能&#xff0c;可满足用户按自定义形状裁剪地图、控制区域外显示效果&…...

CesiumEarth v1.15 更新

更新&#xff1a;​ CesiumEarth 更新至1.15.0版本&#xff0c;包含浏览器在线版、Desktop Windows版本、Desktop 安卓版本 界面优化&#xff1a;​ 项目列表已适配手机屏幕 功能​ 扩展模块更新 1、在底部工具栏区域&#xff0c;所有已生效&#xff08;已勾选&#xff0…...

SOC-ESP32S3部分:2-2-VSCode进行编译烧录

飞书文档https://x509p6c8to.feishu.cn/wiki/CTzVw8p4LiaetykurbTciA42nBf?fromScenespaceOverview 无论是使用Window搭建IDF开发环境&#xff0c;还是使用Linux Ubuntu搭建IDF开发环境&#xff0c;我们都建议使用VSCode进行代码编写和编译&#xff0c;VSCode界面友好&#x…...

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…...

关于element-ui的table type=“expand“ 嵌套表格展开异常问题解决方案

也许是很久没用这个库了 今天找这个问题还花了一会儿时间 也是蛮简单的一个问题 排查过程就不说了 直接说结果吧 记录一下 发现问题 展开第一列的时候表格没问题 收起的时候 莫名其妙多了一个展开的按钮 代码咋一看没什么问题 百思不解不得其解 甚至怀疑row-key的问题 检查了数…...

Pichome 开源网盘程序index.php 文件读取漏洞(CVE-2025-1743)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…...

[SpringBoot]Spring MVC(6.0)----图书管理系统(初)

图书管理系统 需求: 1. 登录: 用户输入账号,密码完成登录功能. 2. 列表展示: 展示图书. 准备工作 将前端代码复制到 static 目录下. 约定前后端交互接口 两个功能: 用户登录 和 图书列表展示. 需求分析: 1. 用户登录 url : /user/login param : userName 和 password return …...

C语言:基础篇之常见概念

文章目录 1.C语言是什么&#xff1f;2.C语言的历史和辉煌3.编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022 的优缺点 4.VS项目和源文件、头文件介绍5.第一个C语言程序6.main函数7.printf和库函数8.关键字介绍9.字符和ASCII编码10.字符串和\011.转义字符12.语句和…...