Bilateral Guided Upsampling

Abstract

我们提出了一种加速一大类图像处理算子的算法。给定低分辨率参考输入和输出对,我们通过拟合将输入映射到输出的局部曲线来对算子进行建模。然后,我们可以通过在全分辨率输入上评估这些低分辨率曲线来生成全分辨率输出。我们证明,这忠实地模拟了最先进的色调映射、风格转移和重新着色操作员。这些曲线是通过将输入提升到双边网格中,然后求解仿射矩阵的 3D 阵列来计算的,该阵列能够最好地将输入颜色映射到每个 x、y 强度箱的输出颜色。我们对矩阵实施平滑项,以防止错误边缘和噪声放大。我们可以全局优化这种能量,或者通过局部拟合矩阵来快速近似解决方案,然后通过网格空间中的模糊来增强平滑度。后一种选择减少为联合双边上采样 [Kopf 等人2007] 或引导过滤器 [He 等人2013],取决于参数的选择。运行算法的成本降低到以大大降低的分辨率运行原始算法的成本,因为在移动设备上拟合曲线大约需要 10 毫秒,在桌面 CPU 上需要 1-2 毫秒,并且可以使用以下命令来评估曲线一个简单的 GPU 着色器。

1 Introduction

成像操作符可以通过多种方式改进照片。它们可用于消除雾霾 [Kim 等人2013],压缩动态范围[Paris 等人2011],着色[Levin 等人2004],风格化[Aubry 等人2014],或增强细节[Farbman 等人 2008]。然而,大多数照片完全是在手机上拍摄和处理的,由于严格的功耗预算,手机的计算能力有限。这使得文献中的大多数算法都太慢而无法部署在移动设备上。

加速算子的一个简单方法是以低分辨率应用它,然后对结果进行上采样,理想情况下使用某种方法重新引入在下采样中丢失的高分辨率原始数据中存在的细节。两种这样的方法是联合双边上采样 [Kopf 等人2007]和快速引导滤波器[He and Sun 2015]。这两种方法都足够快,可以在移动设备上运行,但它们只能重现有限范围的运算符(见图 8)。

我们提出了双边引导上采样,它统一并概括了这两种方法。我们首先观察到,对于许多成像算子来说,输入中具有相似颜色的附近像素在输出中也具有相似的颜色。否则会引入新的边缘、光环或噪声,而输入中不存在此类特征。这相当于说算子是双边空间中的平滑函数 [Barron et al. 2015]。

对于黑盒图像算子和特定的输入图像,我们可以通过以降低的分辨率运行算子,然后在双边空间中拟合局部仿射模型来学习这个平滑函数。也就是说,对于低分辨率图像的每个图块和每个强度范围,我们学习输入和输出之间的仿射关系。我们通过使用平滑项全局求解它们,或者通过使用重叠窗口拟合它们来更便宜地限制这些仿射矩阵平滑变化。作为位置和强度的函数,三线性插值到仿射模型阵列中,充当可应用于全分辨率输入的分段二次局部曲线。

如果我们将模型简化为每个空间图块的单一强度范围,那么我们将拟合直线而不是曲线,这正是快速引导滤波器。如果我们将仿射矩阵简化为其常数项,那么这正是联合双边上采样。

我们发现,我们可以以八分之一的分辨率运行大多数算子(因此工作量减少了 64 倍),并且仍然产生可比较的全分辨率输出。拟合仿射模型需要几毫秒的时间,然后可以在最小的 OpenGL 着色器(包含在补充材料中)中完成全分辨率输出的生成。因此我们大大加速了原来的算子。

我们的方法要求算子在某种程度上具有尺度不变性。以低分辨率应用它必须产生有关如何以全分辨率应用它的有用信息。这意味着我们对不成立该假设的算子(例如去噪或去模糊)的建模很差。

本文介绍了这种方法背后的理论(第 3 节)、我们提出的算法(第 4 节)及其在一系列成像算子上的性能(第 5 节)。该算法快速、有效且简单。我们提供局部和全局算法的源代码以及全分辨率图像作为补充材料。

2 Related Work

双边滤波器是一种非线性的边缘保留滤波器,由 Tomasi 和 Manduchi [1998] 提出。已经提出了许多技术和数据结构来加速双边滤波器[Paris and Durand 2006;陈等人2007年;亚当斯等人2010;加斯塔尔和奥利维拉 2011;加斯塔尔和奥利维拉 2012]。陈等人[2007] 引入了双边网格,这是一种能够对图像进行边缘感知操作的数据结构。陈等人使用规则的样本网格,但这种表示已扩展到其他布局,例如 k-d 树和高维网格 [Adams 2011]。巴伦等人[2015]引入了“双边空间”优化的概念,表明通过将问题投影到双边网格上可以快速解决立体问题。 Barron 和 Poole [2016] 将其推广到着色、深度超分辨率和语义分割。

科普夫等人[2007]提出联合双边上采样。他们使用这种技术将低分辨率着色、色调映射和深度图上采样为高分辨率,从而尊重底层场景的颜色不连续性。虽然他们的方法产生了分段平滑的图像,但我们解决了图像对之间的平滑变换。

我们的仿射模型受到引导过滤器的启发 [He et al. 2013],这是一种快速的边缘保留过滤器。该方法的工作原理是在引导图像和输入图像中的重叠块之间拟合仿射函数的二维数组。然后将这些仿射函数应用于输入图像。这会平滑输入图像,同时尊重引导图像中的边缘。相反,我们在图像的双边网格表示上拟合 3D 仿射函数数组,这意味着在单个补丁中,我们在每个强度范围内拟合不同的仿射函数。在网格具有单个强度箱的退化情况下,我们的表示相当于引导滤波器的表示。图 8 展示了我们模型的表达能力的提高。

Yuan 和 Sun [2011] 解决了使用离线处理的低分辨率伪原始文件增强相机上生成的高分辨率 JPEG 的相关问题。他们的色调映射步骤使用局部仿射模型将处理后的 RAW 文件中的补丁与原始 JPEG 相关联。与引导滤波器一样,这只能表达局部直线,而不能表达曲线。

加尔比等人[2015]引入了transform recipes的概念。尽管我们试图完全避免计算全分辨率算子,但 Gharbi 等人,相反,将工作卸载到云服务器,然后发回一个与我们的模型相似但比我们更丰富的多尺度模型,描述操作符的效果,以便可以在设备上重现。与转换配方相比,我们更快、更简单,并且完全在设备上运行。然而,我们无法忠实地模拟算子对最高频率的影响,因为我们从未以全分辨率运行算子。尽管如此,我们的 PSNR 与他们的技术相比还是有竞争力的(图 8)。

3 Local Properties of Imaging Operators

在本节中,我们分析输入图像与操作符动作产生的输出图像之间的关系。图 2 包含一个散点图,说明了在特定图像上运行的特定算子的映射。

考虑输入的一小部分及其在输出中的相应部分。我们将尝试通过在补丁上拟合模型来捕获操作符的动作,该模型可以预测给定输入的输出。对于 1 × 1 补丁,我们可以用一个简单说明输出强度的常数模型来拟合任何算子,无论多么奇特。在稍大的块上,恒定模型仅在输出图像无特征的情况下才是正确的。为了更准确地建模这种关系,我们可以考虑泰勒级数中的下一项,并记录输出强度在输入强度的小扰动下如何变化。现在这是一个仿射模型。

对于行为良好的算子,这些一阶项应该很小。如果输入强度的微小变化会导致输出强度的较大变化,则操作符必须放大存在的任何噪声。

仿射模型能够很好地近似输入输出映射的尺度取决于底层算子的属性。我们在图 3 中对此进行了说明,其中显示了不同大小斑块的输入输出强度散点图。仿射模型适用于小斑块,尤其是那些包含有限亮度变化的斑块,但一旦斑块大小超出算子的自然比例,仿射模型就会崩溃。

如果斑块包含大范围的强度并且算子是非线性的,则一阶泰勒展开式不再成立。例如,如果块包含由边缘分隔的非常亮的像素和非常暗的像素,则该边缘两侧的输入和输出之间的关系可能非常不同。然而,如果我们将单独的仿射模型拟合到补丁中存在的每个强度范围,我们仍然可以使用仿射模型来建模关系。在该仿射模型阵列内作为强度函数进行线性插值会产生分段二次样条,该分段二次样条描述了该补丁内将输入映射到输出的局部曲线。

如果我们将补丁变得更大,那么对于许多有趣的算子,输入中的等强度像素可能会映射到输出中非常不同的强度,并且这种关系不能再通过任何单个函数来建模(参见中最右边的散点图)图 3)。因此,我们将图像分割成图块,并在每个图块内拟合一条不同的曲线。对于表现良好的操作符来说,这些曲线必须在空间中平滑变化。如果不这样做,输入中具有相同强度的相邻像素在输出中可能具有非常不同的强度,这意味着操作符引入了输入中不存在的新边缘。对于一小部分操作符来说,这只是理想的行为,尤其是超分辨率和去模糊。

我们现在有一个仿射模型的 3D 数组,按位置和强度索引。我们要求它们随位置和强度平滑变化,因此我们可以以低分辨率表示它们。事实上,以低分辨率拟合它们会将原始算子投影到不会放大噪声或引入新边缘的算子空间上。 3D 阵列可以被视为一种双边网格,它存储仿射模型而不是颜色。给定任何输入位置和强度,我们可以对其进行三线性插值,以检索适当的仿射模型,该模型将告诉我们输出强度。

单独使用输入/输出图像数据,该双边网格是稀疏的。我们只能在有输入数据的单元格中拟合仿射模型(见图 4)。如果我们希望将模型应用于新的、以前未见过的输入强度,那么我们需要扩展我们的模型以覆盖整个网格。我们所需的平滑度属性和仿射表示使这一点变得简单。可以通过最小化 x 和 y 方向上模型系数的有限差异来增强空间平滑度。同样,可以通过最小化强度方向 z 上的有限差来增强强度平滑度。完全填充的双边网格告诉我们成像算子在仅给出单个示例输入和输出的任何图像上的动作。然而,它只是关于这个特定输入的算子的一阶泰勒级数,因此当我们偏离它时,质量会迅速下降。如果我们在由相同输入的更高分辨率版本驱动的位置对网格进行采样,那么我们会保持接近原始流形,因此产生的输出与以更高分辨率运行原始算子非常相似。

Affine color model

到目前为止,我们的讨论仅限于灰度图像。为了处理颜色输入和输出,我们可以使用 5D 双边网格,它存储每个 (x, y, r, g, b) 单元格从输入到输出颜色的 3 × 4 仿射矩阵。然而,这个空间太大:即使使用低分辨率网格,每个单元也没有足够的数据来充分适应仿射变换。相反,我们发现混合颜色模型效果很好。我们使用 3D 网格,其中 z 坐标对应于亮度,但在每个单元内,我们存储一个 3 × 4 仿射矩阵(1 × 4 用于将颜色映射到灰色的运算符)。混合模型仅通过将亮度边缘编码为欧几里德距离来尊重亮度边缘,但局部将算子建模为仿射颜色变换,如 [Bousseau 等人,2017] 中所示2009]。我们所有的结果都使用这个颜色模型。

Connection to transform recipes

同时transform recipes [Gharbi 等人2015]以不同的方式处理颜色,对于亮度,它们也适合将输入强度映射到输出强度的局部曲线。事实上,他们更进一步,为每个空间频带拟合不同的曲线。然而,在这种表示中拟合高频项需要访问全分辨率输入和输出,这对我们来说回避了这个问题。我们正在尝试生成全分辨率输出,而无需在该分辨率下运行原始运算符。尽管存在这样的缺陷,我们的技术在 PSNR 方面的功能和转换方法(图 8)都快得多。

4 Algorithm

我们通过将成像算子应用于低分辨率版本的输入,将仿射模型的双边网格拟合到低分辨率输入/输出对,然后将模型应用于高分辨率输入来加速成像算子。我们提出了两种拟合仿射模型的方法。第一个基于优化,速度较慢,但​​会产生最高质量的结果。第二个是在移动设备上实时运行的快速近似。

一旦拟合,将模型应用于高分辨率输入涉及每像素三线性插值以检索 3 × 4 仿射颜色变换,然后进行矩阵乘法以生成输出颜色。这可以在 GPU 上快速完成,补充材料中包含实现此功能的 OpenGL 着色器。

Preliminaries

陈等人[2007]表明,图像相对于引导的联合双边滤波可以表示为 splat-blur-slice 过程。我们通过将输入值分布在由引导图像确定的位置处构建双边网格,用小高斯核模糊网格中的值,然后通过在由引导图像确定的相同位置采样来将值从网格中切出。巴伦等人[2015]表明,通过匹配重建滤波器(例如三线性),滤波可以表示为 STBSx,其中 x 是要滤波的值的向量,S 和 ST 分别是依赖于引导图像的 splat 和 slice 矩阵,并且B 是网格空间中的模糊。使用这种表示法,我们建立了一个优化问题来求解仿射模型网格。

Optimization

该优化问题可以使用标准有限元分析进行离散化,并使用稀疏 QR 分解求解得到的线性方程组。对于 320 × 240 图像和 20 × 15×10 双边网格,我们的 MATLAB 实现在桌面工作站上大约需要 15 秒,这对于实时应用程序来说太慢了。下面,我们得出了适合在移动设备上部署的快速近似值。

Fast approximation

我们的快速近似是用 Halide 图像处理语言编写的 [Ragan-Kelley 等人2013],并且基于该项目的双边网格示例代码。它以相同的方式进行并行化、矢量化和局部融合。使用默认设置,我们的实现可以在台式机 CPU 上 1-2 毫秒内解决仿射模型,在移动 CPU 上大约 10 毫秒(见图 5)。

Connection to the fast guided filter

快速引导滤波器 [He and Sun 2015] 拟合仿射矩阵阵列,将输入 RGB 映射到重叠图块内的输出 RGB。它之所以快,不仅因为它适合低分辨率,还因为它利用了我们所做的相同技巧——它模糊了 Gram 矩阵以产生重叠问题。如果我们将快速逼近限制为单个强度箱(从而将数组的维数从三维减少到二维),并相应地使用双线性插值而不是三线性插值来切出仿射矩阵,我们的方法就变成了快速引导滤波器。该技术只能表达局部直线,而不能表达局部曲线,因此对一组更有限的算子进行建模(见图 8)。

Connection to joint bilateral upsampling

虽然Kopf等人[2007]最初并没有这样描述,但联合双边上采样可以使用双边网格来实现,方法是将低分辨率的输出值溅射到由低分辨率输入强度确定的位置,在网格内进行模糊,然后在由高分辨率图像确定的位置进行切片[Adams 2011]。如果我们限制我们的快速方法只求解每个网格单元中的常数项,而不是一个仿射矩阵,它就简化为这种联合双边上采样的实现。我们在每个网格单元中求解的线性系统简化为1 × 1,正是联合双侧上采样所需权值之和的除法。

拟合常数而不是仿射矩阵往往会产生分段常数输出(再次参见图 8)。科普夫等人,因此,不要使用联合双边上采样来直接生成输出 RGB 值,而是使用自然分段常数的量,例如深度、alpha 遮罩、色度或用于局部色调映射的增益图。因此,有效利用联合双边上采样需要一定程度的针对特定问题的洞察力。

请注意,如果我们通过将极限设为 λ → ∞ 来降低快速方法的性能,则方程 2 变为 M = γI。这表明我们的正则化器相当于 Kopf 的色调映射方法,该方法联合双边对局部增益图进行上采样。

因此,我们的快速近似统一了快速引导滤波器和联合双边上采样,如果适当限制的话可以减少到其中任何一个,并且比两者都更具表现力。

5 Results

我们评估了我们的全局方法和各种图像处理算子的快速逼近,应用于transform recipes数据集中的 116 个图像。我们运行的操作符有:

大多数图像为 5–8 Mpixel(肖像为 1.3 Mpixel)。我们对每个图像进行 4 倍和 8 倍的框下采样,然后应用算子产生低分辨率输出。我们在一系列网格分辨率上运行双边引导上采样,并通过计算其 PSNR 和相对于地面实况的结构相似性指数 (SSIM) 来评估图像质量。使用 8 倍下采样、8 个强度箱和对应于低分辨率输入中 16 × 16 像素的空间箱的默认参数,我们的全局方法在整个数据集上实现了 28.4 dB 的平均 PSNR 和 0.92 的平均 SSIM。我们的快速近似产生的图像质量稍低(平均 PSNR 为 27.0 dB,平均 SSIM 为 0.88),但在桌面工作站上运行时间不到 1 毫秒。为了测量交换性的影响,我们对全分辨率地面实况进行框下采样,以表示通过下采样进行交换的理想尺度不变算子的输出(见图 6)。当应用于这些图像对时,全局方法的平均 PSNR 和 SSIM 增加到 33.3 dB 和 0.94,快速近似方法的平均 PSNR 和 SSIM 增加到 29.3 dB 和 0.88。图 6 和图 7 中图像的全分辨率版本以及整个数据集的 PSNR 和 SSIM 均包含在补充中。

对于具有默认参数的 10 MPixel 图像,我们在桌面 CPU 上的快速近似需要 2 毫秒将采样降低 8 倍,需要 2 毫秒来拟合曲线,并需要 13 毫秒来应用曲线。大部分成本来自双边网格的三线性插值,这在没有纹理硬件的 CPU 上速度很慢,但在 GPU 上几乎免费。实际上,对于大多数应用程序(如图 7 所示),性能主要取决于以低分辨率运行原始算子,即使我们通过以 8 倍降低的分辨率计算获得了 64 倍加速。

Discussion and Limitations

在给定正确的参数的情况下,全局优化及其快速逼近都表现良好。虽然我们在图 7 中使用了统一的参数设置,但下采样因子和网格分辨率的最佳选择取决于算子,反映了算子发挥作用的自然尺度。大多数运算符都有语义上有意义的参数,指导它们如何随分辨率缩放。线性参数(例如滤波器半径)应线性缩放(例如,USM锐化),对数参数(例如金字塔级别数)应减去(例如,局部拉普拉斯算子、纵向传输),并且正确设计的正则化器应具有诸如逆像素之类的单位或反像素平方,这决定了它们如何缩放。对于标签传播,我们保守地使用最近邻来对掩模进行下采样(着色、抠图、肖像传输)。

我们方法的质量取决于算子是否可以建模为局部曲线,以及以降低的分辨率运行它是否能够忠实地捕获它对同一场景的更高分辨率图像的作用。但情况并非总是如此(图 6)。对于增强最高频率的小支撑非锐化掩模,我们的局部曲线模型仅适用于小空间箱,并且下采样可能完全丢弃我们学习有效模型所需的频率。在相反的极端情况下,全局对比度曲线仅需要一个空间箱,并且可以从分辨率非常低的输入/输出对拟合曲线。当网格箱的大小或下采样因子对于操作符来说太大时,我们在应用单个全局曲线的方向上会失败,这仅仅保留输入细节而不是增强它(例如,风格转移中的墙),或者抑制它(例如,L0 平滑和 alpha 抠图)。引导滤波器和联合双边上采样更强烈地表现出同样的现象(图 8)。 Transform Recipes 基于金字塔的模型具有更强的代表性,但需要以全分辨率运行原始算子。如果人们可以在不以全分辨率运行原始运算符的情况下学习Transform Recipes ,则可能会获得这两种技术的好处。

6 Conclusion

我们描述了一种加速一大类图像算子的简单方法。对于许多算子来说,输入中具有相似颜色的附近像素在输出中也具有相似的颜色,这意味着将输入颜色映射到输出颜色的图像相关函数在双边空间中是平滑的。我们可以通过以降低的分辨率运行算子并拟合将输入映射到输出的仿射矩阵双边网格来学习这个平滑函数。这个仿射矩阵的集合可以被认为是真实函数的切平面——对于每个输入位置和强度,常数项产生输出颜色,线性项控制输入位置或颜色的微小变化如何产生输出颜色的微小变化,输出颜色。因此,它们让我们能够在给定更高分辨率的输入的情况下准确预测操作员的结果。

我们的模型可以单独限制为常数项,以产生联合双边上采样,或者限制为单个强度箱以产生快速引导滤波器。因此,我们将这两种方法联系起来,并证明它们都可以解释为通过拟合和应用局部模型进行重采样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/205375.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典策略梯度算法

经典策略梯度算法 DDPG算法 DDPG 算法被提出的初衷其实是 DQN 算法的一个连续动作空间版本扩展。深度确定性策略梯度算法( deep deterministic policy gradient,DDPG),是一种确定性的策略梯度算法。 由于DQN算法中动作是通过贪…

DCDC前馈电容与RC串并联电路

一、RC串并联电路特性分析 1、RC串联电路 RC 串联的转折频率: f01/(2πR1C1),当输入信号频率大于 f0 时,整个 RC 串联电路总的阻抗基本不变了,其大小等于 R1。 2、RC并联电路 RC 并联电路的转折频率&…

学习笔记三十六:通过Ingress-nginx实现灰度发布

通过Ingress-nginx实现灰度发布 灰度发布原理将新版本灰度给部分用户切一定比例的流量给新版本 部署两个版本的服务以 nginx 为例,先部署一个 v1 版本:部署一个 v2 版本再创建一个 Ingress,对外暴露服务,指向 v1 版本的服务:访问验证 基于 He…

csdn最新最全面的Jmeter接口测试:jmeter_逻辑控制器_循环控制器

循环控制器 循环次数:设置该控制器下的请求的循环执行次数 永远:勾选上的话,会一直循环,即所谓死循环 注意:如果线程组本身已经设置了循环次数的话,那循环控制元件控制的子节点 的循环次数为线程组设置的…

高级IO select 多路转接实现思路

文章目录 select 函数fd_set 类型timeval 结构体select 函数的基本使用流程文件描述符就绪条件以select函数为中心实现多路转接的思路select 缺陷 select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); selec…

科普:什么是合同生命周期管理?

在当前,企业面临自身转型升级与行业数字建设的挑战,急需一种系统化的解决方案,帮助企业在自身运作方面实现降本增效,为拓展业务获得发展提供助力,而合同生命周期管理在其中就扮演着十分重要的角色。 一、合同生命周期…

解读《陆奇最新演讲实录—我的大模型世界观》

腾讯科技频道记者张小珺一篇《陆奇最新演讲实录—我的大模型世界观》刷爆朋友圈。文章知识点丰富、字里行间处处流淌着创业方法论和AI应用商机,含金量极高! PS:一家之言、不求苟同。如有不爽之处,欢迎来 找我。 腾讯新闻原文&am…

宝塔mongodb启动失败

宝塔mongodb启动失败 尝试以下步骤: 命令行启动看报错信息 /etc/init.d/mongodb start出现 error:14,查看 mongodb.log 提示 MongoDB –无法解除套接字文件 /tmp/mongodb-27017 的链接 查看 /tmp/mongodb-27017.sock,发现拥有…

STM32CubeIDE(CUBE-MX)----快速移植FreeRTOS实战

文章目录 前言一、Freertos可视化配置二、生成代码三、实验现象总结 前言 FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能&#xf…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进,分布式架构也得到蓬勃的发展,那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式,本地锁Reentrantlock和Synchnorized就无法使用了,当然很多同学脱口而出的基于Redis的se…

[iOS学习笔记]浅谈RunLoop底层

RunLoop是什么? RunLoop是iOS开发中比较重要的知识点,它贯穿程序运行的整个过程。它是线程基础架构的一部分,是一种保障线程循环处理事件而不会退出的机制。同时也负责管理线程需要处理的事件,让线程有事儿时忙碌,没事…

网络基础_1

目录 网络基础 协议 协议分层 OSI七层模型 网络传输的基本流程 数据包的封装和分用 IP地址和MAC地址 网络基础 网络就是不同的计算机之间可以进行通信,前面我们学了同一台计算机之间通信,其中有进程间通信,前面学过的有管道&#xff…

Mendix UI页面布局以案说法

一、前言 试着回想最近一次与公司网站交互的情况,访问了多个页面,并且可能使用了某些功能。有可能基于这种互动,可以向某人介绍公司的一些主要功能。其中一些可能是更肤浅的东西,比如他们的标志是什么样子或他们的主要配色方案是…

第20 章 多线程

20.1线程简介. 20.2创建线程 2.1继承Thread类 Thread 类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread 实例。Thread类中常用的两个构造方法如下: public Thread():创建一个新的线程对象。 public Threa…

[跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

Installation(下载代码-装环境) conda create -n bk-sdm python3.8 conda activate bk-sdm git clone https://github.com/Nota-NetsPresso/BK-SDM.git cd BK-SDM pip install -r requirements.txt Note on the torch versions weve used torch 1.13.1 for MS-COCO evaluation…

简单好用!日常写给 ChatGPT 的几个提示词技巧

ChatGPT 很强,但是有时候又显得很蠢,下面是使用 GPT4 的一个实例: 技巧一:三重冒号 """ 引用内容使用三重冒号 """,让 ChatGPT 清晰引用的内容: 技巧二:角色设定…

C++中的map和set的使用

C中的map详解 关联式容器键值对树形结构的关联式容器set的使用1. set的模板参数列表2. set的构造3. set的迭代器4. set的容量5. set修改操作6. set的使用举例 map1. map的简介2. map的模板参数说明3. map的构造4. map的迭代器5. map的容量与元素访问6. map的元素修改 multimap和…

centos8 下载

下载网址 Download 直接下载地址 https://mirrors.cqu.edu.cn/CentOS/8-stream/isos/x86_64/CentOS-Stream-8-20231127.0-x86_64-dvd1.iso 这个版本安装的时候方便

增强静态数据的安全性

静态数据是数字数据的三种状态之一,它是指任何静止并包含在永久存储设备(如硬盘驱动器和磁带)或信息库(如异地备份、数据库、档案等)中的数字信息。 静态数据是指被动存储在数据库、文件服务器、端点、可移动存储设备…

一篇文章带你掌握MongoDB

文章目录 1. 前言2. MongoDB简介3. MongoDB与关系型数据库的对比4. MongoDB的安装5. Compass的使用6. MongoDB的常用语句7. 总结 1. 前言 本文旨在帮助大家快速了解MongoDB,快速了解和掌握MongoDB的干货内容. 2. MongoDB简介 MongoDB是一种NoSQL数据库,采用了文档…