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

神经网络压缩图像

在这里插入图片描述

简介

典型的压缩管道由四个组件组成:
编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z
量化:截断 z z z以丢弃一些不重要的信息
熵编码:使用某种形式的熵编码(例如:算术编码)来无损地存储截断的潜在 z ^ \hat z z^
解码:原始 x x x被重构为通过使用 z ^ \hat z z^通过解码器函数 D D D获得
x ^ \hat x x^

在这里插入图片描述
需要注意的是,压缩失真主要是由量化步骤造成的——编码器可以是一个双射函数。我们根据某种失真度量来衡量原始图像与重构图像之间的接近程度,其中常见的选择是平方误差 d d d

d ( x , x ^ ) = ∣ ∣ x − x ^ ∣ ∣ 2 2 d(x,\hat x)=||x-\hat x||^2_2 d(x,x^)=∣∣xx^22
它使得图像数据在压缩和解压缩过程中丢失了一些信息,因此导致了压缩的失真。失真度量是用来衡量原始图像和压缩后的重建图像之间的差异程度的指标,通常使用的是平方误差,即重建像素值与原始像素值之间的差的平方。

虽然传统的压缩方法(例如JPEG)独立地优化了这些组件中的每一个,但基于神经的学习方法可以联合优化它们,这可能是非常有益的。自然地,这种神经方法建立在自动编码器架构上,由三个可学习的组件组成:编码器 ε θ \varepsilon_\theta εθ,解码器 D ψ D_\psi Dψ和熵模型 p ζ p_\zeta pζ,其中 θ \theta θ ψ \psi ψ ζ \zeta ζ是可训练的参数。

上文的速率失真理论在图像压缩中是一种重要的概念

用于平衡压缩比特率(速率)和压缩图像质量之间的关系。以下是速率失真理论在图像压缩中的详细解释:

  • 速率(Rate):速率指的是用于表示和传输图像信息所需的比特数。在图像压缩中,我们希望以最小的比特数来表示图像,以减少存储和传输成本。通常情况下,速率与压缩比特率直接相关,即速率越低,表示压缩得越好。
  • 失真(Distortion):失真是指压缩后的图像与原始图像之间的差异程度。在图像压缩中,失真通常以图像的均方误差(MSE)来衡量,即压缩后图像像素与原始图像像素之间的平均差的平方。压缩时,我们希望尽量减小失真,使压缩后图像尽可能接近原始图像。
  • 速率失真函数(Rate-Distortion Function):速率失真函数描述了在给定失真水平下,所需的最小比特率。在图像压缩中,速率失真函数用于评估不同压缩算法或参数设置下的压缩性能。通常情况下,我们希望在给定的失真水平下,找到最小的速率失真函数值,以实现高效的图像压缩。
  • 速率失真优化(Rate-Distortion Optimization):速率失真优化是指在给定失真水平的约束下,通过调整压缩算法或参数来最小化所需的比特率。在图像压缩中,速率失真优化的目标是找到最佳的压缩方案,以在给定失真水平下实现最小的比特率,或在给定比特率下实现最小的失真。

当我们进行图像压缩时,我们通常希望在减少文件大小(即减少比特率或速率)的同时尽可能地保持图像的质量。速率失真理论就是帮助我们找到这种平衡的一种方法。
首先,我们要明白,压缩图像就是要以尽量少的比特(或者说数字信息)来表示图像,这样就可以节省存储空间或者传输带宽。但是,当我们减少了比特率时,压缩后的图像质量往往会下降,因为我们丢失了一些原始图像中的细节和信息。
速率失真理论告诉我们,存在一种平衡点,在这个点上,我们以最小的比特率来压缩图像,同时仍然保持了所需的图像质量。这个平衡点取决于所使用的压缩算法和质量度量标准。
换句话说,速率失真理论帮助我们找到了一个最优的压缩方案,即在压缩图像时,我们尽可能地减少比特率,但是又不至于使图像质量变得太差。这样,我们就可以在存储或传输图像时达到更高的效率,同时又不牺牲图像的观感质量。

那么如何将这个概念加入到神经网络编码中呢

在这篇论文中《Improving Statistical Fidelity for Neural Image Compression with Implicit Local Likelihood Models》介绍了一种方法,下文将以这篇论文为基础展开理论介绍

论文地址:https://proceedings.mlr.press/v202/muckley23a/muckley23a.pdf

代码地址:https://github.com/facebookresearch/NeuralCompression/tree/main/projects/illm

在神经网络编码中引入速率失真理论的关键在于将其约束条件融入训练过程中,以平衡压缩率、失真度量和统计保真度。这需要设计合适的损失函数和训练目标,以确保编码器和解码器的性能在压缩数据时能够尽可能地接近最优的速率失真性能。接下来,我们将探讨如何将速率失真理论融入到神经网络编码中,并详细介绍其中涉及的方法和公式。

符号表示

我们使用了一些数学符号和概念来描述神经网络编码器的设计。

首先引入了使用概率空间 ( Ω , F , P ) (Ω,F,P) ΩFP来描述随机变量的行为。在这里, Ω Ω Ω代表样本空间, F F F代表事件空间, P P P则是概率函数,用于描述事件发生的可能性。

然后引入了两个随机变量, X : Ω → X X:Ω→X XΩX Y : Ω → Y Y:Ω→Y YΩY,它们分别将样本空间映射到 X X X Y Y Y的值域 ,它们分别表示原始信号和编码后的信号,这两个随机变量都是函数,将样本空间映射到它们的取值范围上。我们用大写字母表示随机变量,例如 X X X Y Y Y

用小写字母表示它们的具体取值,如 x ∈ X x ∈ X xX。分布函数 P X P_X PX表示 X X X的概率分布,而 p x px px表示 P X P_X PX的概率质量函数。还引入了条件分布表示 P X ∣ Y P_{X|Y} PXY,它描述了在给定 Y Y Y的情况下 X X X的分布情况。

这实际上是一系列概率测度,对于每个y的取值,都存在相应的条件分布 P X ∣ Y = y P_{X|Y=y} PXY=y。期望值用 E x ∼ P X [ q ( x ) ] E_{x∼PX}[q(x)] ExPX[q(x)]表示,也可以简写为 E [ q ( x ) ] E[q(x)] E[q(x)]

速率失真感知理论

在有损压缩中,目标是尽可能用尽量少的比特(比特率)存储离散随机变量 X X X的结果 x ∼ P X x∼P_X xPX,例如自然图像,同时确保重构 x ^ ∼ P X ^ ∣ x \hat x∼P_{\hat X|x} x^PX^x的质量水平不低于 τ τ τ。这个方法表述为速率失真理论(Shannon,1948)。Shannon得出的最佳比特率R由速率失真函数表征:

在这里插入图片描述

其中 I ( ⋅ ; ⋅ ) I(·;·) I(⋅;⋅)表示互信息, ρ ( ⋅ , ⋅ ) ρ(·,·) ρ(⋅,⋅)是一个失真度量。Blau & Michaeli(2019)将上述速率失真函数扩展为另一个约束方法,该约束方法表征了重构的统计数据与真实数据分布的统计数据之间的相似程度:

在这里插入图片描述

这里 d ( ⋅ , ⋅ ) d(·,·) d(⋅,⋅) 是分布之间的某种差异度量,如Kullback-Leibler散度(KLD)。

接下来,将展示如何通过逼近和放宽受限速率失真感知函数 R ( τ , σ ) R(τ,σ) R(τ,σ) 来构建可微分的训练目标。也就是损失函数

有损压缩编解码器损失优化

在有损压缩算法中,我们的目标是设计一个编码器和解码器,能够将原始数据 x x x压缩成潜在表示 y y y,并能够从该潜在表示重构出近似原始数据 x ^ \hat{x} x^。为了在训练过程中平衡压缩率、失真度量和统计保真度,我们需要引入概率空间和相关的概率分布。

我们假设源符号 x x x将被编码成一个(量化的)潜在表示 y = f ( x ) y = f(x) y=f(x),其中 f : X → Y f:X→Y fXY。随后,我们使用一个熵编码器 g ω ( y ) g_ω(y) gω(y)来将 y y y无损地压缩成其可能的最短比特串。

r ( x ) : = ∣ g ω ( y ) ∣ r(x) := |g_ω(y)| r(x):=gω(y)表示由 g ω g_ω gω生成的二进制串的比特率或长度。由于发送方和接收方都具有熵编码器的共同知识,接收方可以应用解码器 h : Y → X h:Y→X hYX来恢复源信号 x ^ = h ( y ) = f ◦ h ( x ) \hat x = h(y) = f ◦ h(x) x^=h(y)=fh(x)

我们将编码器、解码器和熵编码器的元组称为有损编解码器 ( f , g ω , h ) (f, g_ω, h) f,gω,h。在这个设计中,我们的目标是通过学习参数化的有损编解码器 ( f φ , g ω , h υ ) (f_φ, g_ω, hυ) fφ,gω,hυ来优化。在这种情况下,编码器 f φ f_φ fφ和解码器 h υ h_υ hυ是神经网络,熵编码器 g ω g_ω gω将由对表示的边缘参数化近似定义,换句话说,我们需要学习 P Y ∣ ω P_{Y|ω} PYω。为了实现这一目标,我们需要将速率失真理论的约束应用于训练目标中,以便在优化过程中平衡比特率、失真度量和统计保真度。

使用拉格朗日乘数放松(1)速率和(2)失真感知函数的约束,并考虑到统计保真度约束,我们的训练目标如下:

在这里插入图片描述

在这里详细描述我们损失编解码器的功能形式之前,需要说明如何在实践中近似计算分布的差异。

机械地说,通常很容易为 ρ ( f φ ◦ h υ ( x ) , x ) ρ(f_φ ◦ h_υ(x), x) ρ(fφhυ(x),x)指定失真函数,但最小化 P X ^ P_{\hat X} PX^ P X P_X PX 之间的差异项 d ( P X ^ , P X ) d(P_{\hat X} , P_X) d(PX^,PX) 可能会更加复杂。一种常用的技术是使用生成对抗网络(GANs)来优化对称的Jensen-Shannon散度(JSD)(Goodfellow等,2014;Nowozin等,2016)。JSD是分布之间的一种合适的散度度量,这意味着如果有足够的训练样本并且模型类 P X ^ P_{\hat X} PX^ 足够丰富,就可以准确地近似 P X P_X PX。Goodfellow等(2014)展示了JSD通过众所周知的GAN最小最大优化问题得到最小化:

在这里插入图片描述

其中 D ϕ D_ϕ Dϕ是一个参数化的鉴别器函数(具有参数 ϕ ϕ ϕ),用于估计一个样本是否来自真实数据分布,我们使用了简写 x ^ = f φ ◦ h υ ( x ) \hat x = f_φ ◦ h_υ(x) x^=fφhυ(x)。在神经压缩中,假设 P X ^ P_{\hat X} PX^ 是联合分布 P X P X ^ ∣ x P_XP_{\hat X|x} PXPX^x 的边际分布。为了计算(4)中的经验风险,我们为 x x x x ^ \hat x x^ 绘制不同的样本。从(4)中反转符号的生成器损失函数是:

在这里插入图片描述

可以将其用作(3)中 d ( P X ^ , P X ) d(P_{\hat X} , P_X) d(PX^,PX) 的替代项(用于鉴别器的交替最小化)。这种方法已经应用于几种神经压缩系统中(Agustsson等,2019;Mentzer等,2020)。与用于图像生成的GAN相比, P X ^ P_{\hat X} PX^ 的任务由于神经压缩任务的属性而大大简化。因此,重新设计了鉴别器,以反映压缩所需的投影的局部性。

论文结构和方法

在这里插入图片描述
图 2. 使用基于鉴别器的差异最小化的学习有损压缩系统概述。图像 x x x 被编码并量化为潜变量 y y y。概率模型 g ω g_ω gω 可以对 y y y 进行熵编码,并估计速率 r φ , ω r_{φ,ω} rφ,ω。解码器 h υ h_υ hυ 将量化的 y y y 转换回压缩图像 x ^ \hat x x^。为了提高统计保真度,还通过一个鉴别器 D ϕ D_ϕ Dϕ 进行训练,该鉴别器试图匹配预训练标签器 u u u 的标签。

自动编码器架构

在这里,描述了编码器 f φ f_φ fφ,解码器 h υ h_υ hυ 以及由熵编码器 g ω g_ω gω 使用的潜在边缘 P Y ∣ ω P_{Y|ω} PYω。由于速率失真函数与变分推断之间的关系,神经编解码器可以被视为一种变分自动编码器的类型(Balle等人,2017)。与神经压缩领域的先前工作一致,使用了两级分层自动编码器来建模数据分布,也称为超先验模型(Balle等人,2018)。这个模型类别以自身为模型的主导先验 P Y ∣ ω P_{Y|ω} PYω 命名,本身被建模为一个潜变量模型:

P Y ∣ ω = ∑ P Y ∣ z ; ω P z P_{Y∣ω}=\sum P_{Y∣z;ω}P_z PYω=PYz;ωPz

先前的工作对先验分布进行了不同的选择,例如条件高斯(Balle等人,2018;Minnen等人,2018;Mentzer等人,2020)。采用了Minnen等人(2018)的方法,对高斯的均值和尺度进行条件设定,并将其称为均值-尺度超先验模型。对于编码器和解码器的架构,遵循了Mentzer等人(2020)的方法,其使用的模型比Minnen等人(2018)使用的模型更大更深。

隐式局部似然模型

为了开发的似然模型,假设可以访问一个标签向量函数 u : X → 0 , 1 ( C + 1 ) × W × H u:X→{0,1}^{(C+1)×W×H} u:X0,1(C+1)×W×H。对于数据集中的任何 x x x u u u 输出一个三维空间分布的独热目标向量图,其中 C C C 是标签数量, W W W 是潜空间宽度, H H H 是潜空间高度。将零标签保留为“假”类,用于指示重构图像,并使用其余的 C C C 类来标记原始图像。定义 b 0 b0 b0 作为一个独热目标 ( C + 1 ) × W × H (C+1)×W×H (C+1)×W×H 张量,其中 C C C 维度中的零元素的值为 1,实际上是标准 GAN 术语中的“假”类。

遵循Sushko等人(2022),现在可以定义两个 c-GAN 风格的对抗损失函数:

在这里插入图片描述

其中 D ϕ ( x ) D_ϕ(x) Dϕ(x) 现在是一个矢量值函数, ⟨ ⋅ , ⋅ ⟩ ⟨·,·⟩ ⋅,⋅ 表示内积。请注意,与其仅区分原始和重构图像不同,这里鉴别器的目标是区分原始图像的 C C C 个图像标签,以及检测重构图像。生成器损失对应于Goodfellow等人(2014)提出的非饱和 GAN 损失,扩展到多标签情况。它的目标是为重构图像最大化相应实际图像标签的鉴别器概率。这实际上允许鉴别器在标签中使用更多的局部信息。

标签函数的选择

标签函数的选择影响方法的成功。方程(6)和(7)允许广泛类别的标签,包括当设置 W = H = 1 W = H = 1 W=H=1 时的全局图像标签,以及 H , W > 1 H,W > 1 HW>1 时的空间分布标签。由于目标是在隐式似然模型中强制执行局部性,论文选择应用 VQ-VAEs(van den Oord等人,2017;Razavi等人,2019)。通过向量量化,将 VQ-VAE 自动编码器的潜空间划分为具有集群均值 m c c = 1 C {mc}_{c=1}^{C} mcc=1C C C C 个簇。对于原始图像,设置为如下

在这里插入图片描述

这里 e ( i , j ) e^{(i,j)} e(i,j) 是来自 VQ 编码器位置 ( i , j ) (i, j) (i,j) 处的通道向量。VQ-VAE 编码器将潜向量空间划分为 C C C 个Voronoi单元格。由于Voronoi单元格是凸的,任何两点都是路径连通的。此外,由于解码器架构是连续映射,因此即使在重构空间 X X X 中,路径连通性仍然保持不变。换句话说,使用 VQ-VAE 方法,标签空间的局部性意味着图像空间的局部性。这与其他标签方法形成对比,例如 ImageNet 类。没有用于生成潜在代码的模型,论文的方法不考虑无条件生成,尽管可以使用自回归技术实现这一点。我们的 VQ-VAE 架构基于带有一些修改的 VQ-GAN 变体(Esser等人,2021):

论文使用 ChannelNorm(Mentzer等人,2020)代替 GroupNorm,以改善不同图像区域的归一化统计稳定性。
我们使用 XCiT(El-Nouby等人,2021)用于注意力层,以提高计算效率。

鉴于此架构,似然函数的数量由潜空间的空间大小( W × H W×H W×H)和 VQ-VAE 的代码本大小 C C C 控制。更大的潜空间和代码本将导致更小的似然邻域。除非另有说明,使用 256 × 256 256×256 256×256 图像的 32 × 32 32×32 32×32 潜空间和代码本大小为 1024 1024 1024

鉴别器架构

对于鉴别器,论文使用了 U-Net 架构(Ronneberger等人,2015),这是Sushko等人(2022)在语义图像合成背景下提出的。在他们的情况下,鉴别器的目标是使用语义分割图的条件标签为真实图像的像素打上相应的标签,同时将生成图像中的像素标记为“假”。在这个情况下,鉴别器不是预测手动注释的语义类别,而是预测标签函数 u u u 提供的标签中的类别。U-Net 变体使用了 LeakyReLU(Xu等人,2015)作为激活函数,并构建在残差块上,而不是原始 U-Net 的前馈块上(Ronneberger等人,2015)。由于潜在分辨率与图像分辨率不同,在 32 × 32 32×32 32×32 潜空间的输出路径处截断了 U-Net 的输出路径,该潜空间由 u ( x ) u(x) u(x) 提供。

相关文章:

神经网络压缩图像

简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…...

Catagory(rt)

继承(IMP融合):支持super命令码;继承推荐重写 分类(IMP替换):不支持super命令码;分类推荐组合 //替换(原来没了/破坏掉原来IMP/分类(替换特性)) 情况1: 自封装(组件化)开源库>分类推荐组合 情况2:逆向分析> 有意替换>分类IMP替换 #import "CatagoryViewContro…...

Games104 现代游戏引擎3

Sprite Animation 序列帧动画 自由度(degrees of freedom,DoF)对于刚体而言描述它的运动需要3个位移3个旋转,一共6个自由度 顶点动画(per-vertex animation)利用网格的顶点来控制运动。此时网格上的每个顶…...

【云计算】混合云分类

《混合云》系列,共包含以下 3 篇文章: 【云计算】混合云概述【云计算】混合云分类【云计算】混合云组成、应用场景、风险挑战 😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀&#x1f68…...

探索分布式系统监控zabbix------------自动发现与自动注册

目录 一、部署 zabbix 服务端 二、部署 zabbix 客户端 2.1环境准备 2.2服务端和客户端都配置时间同步 (ntp) 2.2.1服务端zbx-server 2.2.2服务端zabbix-agent01客户端 2.3客户端配置时区,与服务器保持一致 2.4设置 zabbix 的下载源&…...

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…...

WPF Extended.Wpf.Toolkit 加载界面

1、NuGet 中安装 Extended.Wpf.Toolkit 。 2、在MainWindow.xaml中添加xmlns:tk"http://schemas.xceed.com/wpf/xaml/toolkit" 。 MainWindow.xaml 代码如下。 <Window x:Class"WPF_Extended_Wpf_Toolkit_Loading.MainWindow" xmlns"ht…...

【切换网络连接后】VMware虚拟机网络配置【局域网通信】

初次安装Linux虚拟机以及切换网络都需要配置虚拟机网络&#xff0c; 从而使得win主机内通过远程连接工具能够连接该虚拟机&#xff0c; 而不是在虚拟机内操作。 本片文章你将了解到网络切换后如何配置虚拟机网络的一些基础操作&#xff0c;以及局域网通信的一些基础知识。 …...

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

国内鞋服零售企业经过多年的发展&#xff0c;已经形成诸多家喻户晓的品牌&#xff0c;但近年来一些企业的库存问题也时常显现&#xff0c;高库存不仅困扰着品牌商&#xff0c;也使一些多年合作良好的经销商深受其害&#xff0c;当下的订货会制度在初期帮助企业解决了盲目生产的…...

word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法

一&#xff0c;引言 在日常生活和工作中&#xff0c;我们经常需要处理各种Word文件。有时&#xff0c;由于某些原因&#xff0c;我们可能需要更改Word文件的创建时间和修改时间。虽然这听起来可能有些复杂&#xff0c;但实际上&#xff0c;通过一些简单的方法和工具&#xff0…...

redisson -- 延迟队列RDelayedQueue

1.maven配置 <!-- 用于管理起步工程的依赖管理 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/> </parent…...

Flex弹性盒子布局案例(认识弹性布局)

一、导航菜单 此示例创建了一个水平导航菜单&#xff0c;其中链接在 Flex 容器中等距分布。 HTML结构&#xff1a; <nav class"nav-menu"><a href"#">Home</a><a href"#">About</a><a href"#">…...

【ros2】ros1和ros2可以同时在一台机器上运行吗

可以&#xff0c;ROS 1 和 ROS 2 是两个不同版本的 Robot Operating System (ROS)&#xff0c;它们分别有着各自的架构、消息传递机制以及配套工具集。尽管存在这些差异&#xff0c;ROS 1 和 ROS 2 可以在同一台 Ubuntu 系统上共存并独立运行。以下是一些关键点来说明如何实现这…...

PMSM MATLAB

// s-function搭建变参数PMSM模型 ///...

笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2

对应于其强大的能力&#xff0c;大语言模型 (LLM) 需要强大的算力支撑&#xff0c;而个人计算机上很难满足这一需求。因此&#xff0c;我们别无选择&#xff0c;只能将它们部署至由本地或云端托管的性能强大的定制 AI 服务器上。 为何需要将 LLM 推理本地化 如果我们可以在典配…...

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …...

010Node.js自定义模块通过exports的使用,两种暴露的方法及区别(二)

module/request.js var obj{get:function(){console.log(从服务器获取数据);},post:function(){console.log(提交数据);} }exports.xxxxobj;//方法一 { xxxx: { get: [Function: get], post: [Function: post] } }//module.exportsobj;//方法二 //{ get: [Function: g…...

【CVE-2010-2883】进行钓鱼攻击的研究

最近作业中研究APT攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…...

【Python】如何在Ubuntu上设置Python脚本开机自启

你不知道我为什么狠下心 盘旋在你看不见的高空里 多的是 你不知道的事 蝴蝶眨几次眼睛 才学会飞行 夜空洒满了星星 但几颗会落地 我飞行 但你坠落之际 很靠近 还听见呼吸 对不起 我却没捉紧你 &#x1f3b5; 王力宏《你不知道的事》 前置要求 确保你的Ub…...

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛&#xff0c;它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来&#xff0c;这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…...

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…...

【iOS】——SDWebImage源码学习

文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库&#xff0c;可以给UIKit框架中的控…...

树和二叉树(一)

一、树 非线性数据结构&#xff0c;在实际场景中&#xff0c;存在一对多&#xff0c;多对多的情况。 树( tree&#xff09;是n (n>0&#xff09;个节点的有限集。当n0时&#xff0c;称为空树。 在任意一个非空树中&#xff0c;有如下特点。 1.有且仅有一个特定的称为根的节点…...

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 &#xff08;条带化存储&#xff09; 2.RAID 1&#xff08;镜像存储&#xff09; 3.RAID 5 4.RAID 6 5.RAID 10&#xff08;先做镜像&#xff0c;再做条带&#xff09; 6.RAID 01 &#xff08;先做条带…...

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间&#xff0c;节省…...

Web3与社会契约:去中心化治理的新模式

在数字化时代&#xff0c;技术不断为我们提供新的可能性&#xff0c;而Web3技术作为一种基于区块链的创新&#xff0c;正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑&#xff0c;还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…...

实体类List重复校验

如果实体类有多个属性&#xff0c;并且你希望根据所有属性的组合来进行重复校验&#xff0c;你可以考虑以下几种方法&#xff1a; 使用集合存储已经出现过的实体对象&#xff1a; 将每个实体对象放入一个 Set 中进行重复校验。在 Set 中元素的比较可以使用自定义的 equals 方法…...

loadash常用的函数方法

Lodash是一个JavaScript实用工具库&#xff0c;提供了很多常用的函数方法来简化开发过程。以下是一些常用的Lodash函数方法&#xff1a; _.map(array, iteratee)&#xff1a;对数组中的每个元素应用一个函数&#xff0c;并返回结果数组。_.filter(collection, predicate)&…...

【零基础入门TypeScript】模块

目录 内部模块 内部模块语法&#xff08;旧&#xff09; 命名空间语法&#xff08;新&#xff09; 两种情况下生成的 JavaScript 是相同的 外部模块 选择模块加载器 定义外部模块 句法 例子 文件&#xff1a;IShape.js 文件&#xff1a;Circle.js 文件&#xff1a;…...

Scala 之数组

可变数组与不可变数组 import scala.collection.mutable.ArrayBuffer// 不可变数组。 长度不可变&#xff0c;但是元素的值可变 object Demo1 {def main(args: Array[String]): Unit {// 不可变数组定义方式// 未初始化有默认值 Int > 0val arr1 : Array[Int] new Arr…...

外贸商城网站建设公司/seo经验是什么

输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 例如&#xff0c;如果输入如下矩阵&#xff1a; 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路&#xff1a;   先判断循环条件&#xff0c;由图可以发现当行数和列数都 > 循…...

域名如何做跳转到其他网站上/奉化网站关键词优化费用

由于JetBrains封杀&#xff0c;大部分激活服务器已经不能使用&#xff0c;如果以上方法无效&#xff0c;则可以使用下面的比较麻烦的方法&#xff0c;但是有效期是到December 31&#xff0c;2099&#xff08;emmmm&#xff0c;也算是永久破解了吧&#xff0c;毕竟是到2099年&am…...

网站排名优化公司推荐/下载百度浏览器

本文总结了PHP GD库相关图像生成和处理函数。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这几天在学习图像验证码部分&#xff0c;参考了许多例子&#xff0c;都是用GD库来生成和绘制图像的&#xff0c;所以打算把GD库封装成类来使用&#xff0c;顺便也学习和练习一…...

wordpress 音乐/快速排名优化怎么样

先浅复习一下es6 let与const 作⽤域 全局作⽤域 局部作⽤域 块级作⽤域 let ⽤法&#xff1a;声明⼀个变量 特点&#xff1a; ​ 只在声明的代码块内有效 在同⼀作⽤域内不允许重复声明 没有变量提升 暂时性死区 用法&#xff1a;声明一个只读的变量(可理解为常量) …...

wordpress 调试模式/app优化网站

Javascript有许多内建的方法来产生对话框&#xff0c;如&#xff1a;window.alert(), window.confirm(),window.prompt().等。 然而IE提供更多的方法支持对话框。如&#xff1a; showModalDialog() (IE 4 支持)   showModelessDialog() (IE 5 支持) window.showModalDialog()方…...

政府网站建设整改工作方案/营销软文300字

初识KNN KNN算法是《机器学习实践》这本书介绍的第一个分类算法&#xff0c;可见其地位非凡。虽然随着入行资历增长&#xff0c;可能会越来越看轻它&#xff0c;但这就是历练的必经之路&#xff0c;要想过此路&#xff0c;先得跨过它。 KNN&#xff08;K-NearestNeighbor&…...