GAN和CycleGAN

news2024/11/25 0:28:21

文章目录

    • 1. GAN 《Generative Adversarial Nets》
      • 1.1 相关概念
      • 1.2 公式理解
      • 1.3 图片理解
      • 1.4 熵、交叉熵、KL散度、JS散度
      • 1.5 其他相关(正在补充!)
    • 2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》
      • 2.1 基础理论和推到
      • 2.2 实验结果
      • 2.3 限制和讨论

本BLOG是个人文章阅读和知识积累,有很多的相关基础知识介绍,小白可放心食用。但由于都是手打的,如果存在问题请联系修改,有的地方博主可能也会有疑问,标出的地方有懂的大佬可留言讨论。当前整理了GAN和CycleGAN的相关内容,接下来还会整理WGAN等内容。

1. GAN 《Generative Adversarial Nets》

Ian J. Goodfellow, Jean Pouget-Abadie, Yoshua Benjio etc.

https://dl.acm.org/doi/10.5555/2969033.2969125

1.1 相关概念

生成模型:学习得到联合概率分布 P ( x , y ) P(x,y) P(x,y),即特征x和标签y同时出现的概率,然后可以求条件概率分布和其他概率分布。学习到的是数据生成的机制。

判别模型: 学习得到条件概率分布 P ( y ∣ x ) P(y|x) P(yx),即在特征x出现的情况下标记y出现的概率

学习一个分布和近似一个分布?

1.2 公式理解

GAN的损失函数:
m i n G m a x D V ( D , G ) = E x ∼ P d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] (1.1) \underset{G}{min}\underset{D}{max}V(D,G) = E_{x \sim P_{data}(x)}[log D(x)]+E_{z\sim p_{z}(z)}[log(1-D(G(z)))] \tag{1.1} GminDmaxV(D,G)=ExPdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))](1.1)

为了学习数据x的分布 p g p_g pg,定义了一个含有噪声的变量分布 p z ( z ) p_z(z) pz(z);V是评分方程(这个值是越大越好的),G是一个生成器,D是一个判别器;训练D最大化真实数据和生成数据的区别,训练G最小化真实数据和生成数据的区别;

注意这个公式有两项,第一项是指是否能正确识别真实的数据;第二项是指是否能够识别生成的数据;
(1) 完美D

  1. D ( x ) D(x) D(x)完美识别真实数据和生成数据, E x ∼ P d a t a ( x ) [ l o g D ( x ) ] E_{x\sim P_{data}(x)}[log D(x)] ExPdata(x)[logD(x)]趋近于1,而 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]趋近于0,整体趋近于1.
  2. D D D不完美的时候,由于存在 l o g log log会使得两项都是一个负数;那训练的目的就是使得这个负数尽量小
  3. 因此需要最大化判别器带来的值,来使得判别器D最佳。

(2) 完美G

  1. G只和 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]相关,如果G完美忽悠D的时候, E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]输出的结果就是负无穷;
  2. 当不是那么完美的时候,输出的值就是一个负数;我们目的是使得这个输出尽量小,以使得生成器最佳。
  3. 所以需要最小化生成器带来值 E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] E_{z\sim p_{z}(z)}[log(1-D(G(z)))] Ezpz(z)[log(1D(G(z)))]

训练过程

训练D说明

生成器生成的数据就是V(G,D)的第二项的输入: g ( z ) = x g(z) = x g(z)=x,那么对z的求和就可以变为对x的求和。
V ( G , D ) V(G,D) V(G,D)展开成积分/求和的形式
V ( G , D ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) d x + ∫ z p z ( z ) ⋅ l o g ( 1 − D ( g ( z ) ) ) = ∫ x p d a t a ⋅ l o g ( D ( x ) ) + p g ( x ) ⋅ l o g ( 1 − D ( x ) ) d x (1.2) \begin{aligned} V(G,D) &= \int_x p_{data} \cdot log(D(x))dx + \int_z p_z(z) \cdot log(1-D(g(z))) \\ &=\int_x p_{data} \cdot log(D(x)) + p_g(x) \cdot log(1-D(x))dx \end{aligned} \tag{1.2} V(G,D)=xpdatalog(D(x))dx+zpz(z)log(1D(g(z)))=xpdatalog(D(x))+pg(x)log(1D(x))dx(1.2)
对于 任意的 ( a , b ) ∈ R 2 \ { 0 , 0 } (a,b) \in R^2 \backslash \{0,0\} (a,b)R2\{0,0},函数 y → a l o g ( y ) + b l o g ( 1 − y ) y \rightarrow a log(y) + blog(1-y) yalog(y)+blog(1y)是一个凸函数,我们需要求这个函数的最大值,就求导数
a y + b 1 − y = 0 y = a a + b \begin{aligned} \frac{a}{y}+\frac{b}{1-y} = 0 \\ y = \frac{a}{a+b} \end{aligned} ya+1yb=0y=a+ba
则在 y = a a + b y = \frac{a}{a+b} y=a+ba的时候有最大值,对应于判别器的概率即为:
D G ∗ ( x ) = p d a t a ( x ) p d a t a ( x ) + p g ( x ) D_G^*(x) = \frac{p_{data}(x)}{p_{data}(x) + p_g(x)} DG(x)=pdata(x)+pg(x)pdata(x)
将最优解带入到价值函数之中
C ( G ) = m a x D V ( G , D ) = E x ∼ p d a t a [ l o g D G ∗ ( x ) ] + E z ∼ p z [ l o g ( 1 − D G ∗ ( G ( z ) ) ) ] = E x ∼ p d a t a [ l o g p d a t a ( x ) p d a t a ( x ) + p g ( x ) ] + E x ∼ p g [ l o g p g ( x ) p d a t a ( x ) + p g ( x ) ] (1.3) \begin{aligned} C(G) &= \underset{D}{max}V(G,D) \\ &= E_{x \sim p_{data}}[log D_G^*(x)] + E_{z \sim p_z}[log(1-D_G^*(G(z)))] \\ &= E_{x \sim p_{data}}[log \frac{p_{data}(x)}{p_{data}(x) + p_g(x)}] + E_{x \sim p_g}[log \frac{p_g(x)}{p_{data}(x) + p_g(x)}] \end{aligned} \tag{1.3} C(G)=DmaxV(G,D)=Expdata[logDG(x)]+Ezpz[log(1DG(G(z)))]=Expdata[logpdata(x)+pg(x)pdata(x)]+Expg[logpdata(x)+pg(x)pg(x)](1.3)
根据KL散度和JS散度的定义,可以将上面的公式改写为
C ( G ) = K L ( P d a t a ∣ ∣ p d a t a + p g 2 ) + K L ( p g ∣ ∣ p d a t a + p g 2 ) − l o g ( 4 ) = 2 ⋅ J S D ( p d a t a ∣ ∣ p g ) − l o g ( 4 ) (1.4) \begin{aligned} C(G) &= KL(P_{data} || \frac{p_{data}+p_g}{2}) + KL(p_g || \frac{p_{data}+p_g}{2}) -log(4) \\ &= 2 \cdot JSD(p_{data}||p_g) - log(4) \end{aligned} \tag{1.4} C(G)=KL(Pdata∣∣2pdata+pg)+KL(pg∣∣2pdata+pg)log(4)=2JSD(pdata∣∣pg)log(4)(1.4)

注意 p d a t a + p g 2 \frac{p_{data}+p_g}{2} 2pdata+pg这里除以2是为了保证是一个分布(即概率的积分是等于1的)

在固定D训练G的时候,我们就是为了最小化这个 C ( G ) C(G) C(G),根据上面推导:
所以给出结论:当 p g = p d p_g = p_d pg=pd时, D G ∗ ( x ) = 1 2 D_G^*(x) = \frac{1}{2} DG(x)=21,因此 C ( G ) = l o g 1 2 + 1 2 = − l o g 4 C(G) = log\frac{1}{2} + \frac{1}{2} = -log4 C(G)=log21+21=log4,可以得到最小的 C ( G ) C(G) C(G)

1.3 图片理解

在这里插入图片描述

绿色是生成的分布;黑色是真实分布;蓝色是判别器的分布

(b)表示训练辨别器,使得辨别器可以非常好地区分二者
©表示训练生成器,继续欺骗判别器

1.4 熵、交叉熵、KL散度、JS散度

  1. (Entropy)
    K-L散度源于信息论,常用的信息度量单位为(Entropy)
    H = − ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) H = -\sum_{i=1}^{N}p(x_i) \cdot logp(x_i) H=i=1Np(xi)logp(xi)
    注意这个对数没有确定的底数(可以使2、e或者10)。

熵度量了数据的信息量,可以帮助我们了解用概率分布近似代替原始分布的时候我们到底损失了多少信息;但问题是如何将熵值压缩到最小值,即如何编码可以达到最小的熵(存储空间最优化)。

  1. 交叉熵 : 量化两个概率分布之间的差异
    H ( p , q ) = − ∑ x p ( x )    l o g    q ( x ) H(p,q) = -\sum_{x}p(x) \; log \; q(x) H(p,q)=xp(x)logq(x)

  2. KL散度kullback-Leibler divergence):量化两种概率分布 P和Q之间差异的方式,又成为相对熵
    将熵的定义公式稍加修改就可以得到K-L散度的定义公式:
    D K L ( P ∣ ∣ Q ) = ∑ i = 1 N p ( x i ) ⋅ ( l o g p ( x i ) − l o g q ( x i ) ) = ∑ i = 1 N p ( x i ) ⋅ l o g p ( x i ) q ( x i ) D_{KL}(P||Q) = \sum_{i=1}^{N} p(x_i) \cdot (log p(x_i) - log q(x_i)) = \sum_{i=1}^{N}p(x_i) \cdot log \frac{p(x_i)}{q(x_i)} DKL(P∣∣Q)=i=1Np(xi)(logp(xi)logq(xi))=i=1Np(xi)logq(xi)p(xi)
    其中 p p p q q q分别表示数据的原始分布和近似的概率分布。

根据公式所示,K-L散度其实是数据的原始分布p和近似分布之间的对数差的期望。如果用2位底数计算,K-L散度表示信息损失的二进制位数,下面用期望表示式展示:
D K L ( P ∣ ∣ Q ) = E [ l o g p ( x ) − q ( x ) ] D_{KL}(P||Q) = E[log p(x) - q(x)] DKL(P∣∣Q)=E[logp(x)q(x)]

注意:

  • 从散度的定义公式中可以看出其不符合对称性(距离度量应该满足对称性)
  • KL散度非负性
  1. JS散度(Jensen-shannon divergence)
    由于K-L散度是非对称的,所以对其进行修改,使得其能够对称,称之为 JS散度
    (1) 设 M = 1 2 ( P + Q ) M = \frac{1}{2}(P+Q) M=21(P+Q),则:
    D J S ( P ∣ ∣ Q ) = 1 2 D K L ( P ∣ ∣ M ) + 1 2 D K L ( Q ∣ ∣ M ) D_{JS}(P||Q) = \frac{1}{2}D_{KL}(P||M) + \frac{1}{2}D_{KL}(Q||M) DJS(P∣∣Q)=21DKL(P∣∣M)+21DKL(Q∣∣M)
    (2) 将KL散度公式带入上面
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) 2 ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{\frac{p(x_i) + q(x_i)}{2}}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{\frac{p(x_i)+q(x_i)}{2}}) DJS=21i=1Np(xi)log(2p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(2p(xi)+q(xi)q(xi))
    (3) 将 l o g log log中的 1 2 \frac{1}{2} 21放到分子上
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( 2 p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( 2 q ( x i ) p ( x i ) + q ( x i ) ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{2p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{2q(x_i)}{p(x_i)+q(x_i)}) DJS=21i=1Np(xi)log(p(xi)+q(xi)2p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)2q(xi))
    (4) 提出2
    D J S = 1 2 ∑ i = 1 N p ( x i ) l o g ( p ( x i ) p ( x i ) + q ( x i ) ) + 1 2 ∑ i = 1 N q ( x i ) ⋅ l o g ( q ( x i ) p ( x i ) + q ( x i ) ) + l o g ( 2 ) D_{JS} = \frac{1}{2}\sum_{i=1}^{N}p(x_i)log(\frac{p(x_i)}{p(x_i) + q(x_i)}) + \frac{1}{2}\sum_{i=1}^{N}q(x_i) \cdot log(\frac{q(x_i)}{p(x_i)+q(x_i)}) + log(2) DJS=21i=1Np(xi)log(p(xi)+q(xi)p(xi))+21i=1Nq(xi)log(p(xi)+q(xi)q(xi))+log(2)
    注意这里是因为 ∑ p ( x ) = ∑ q ( x ) = 1 \sum p(x) = \sum q(x) = 1 p(x)=q(x)=1

JS散度的缺陷:当两个分布完全不重叠的时候,几遍两个分布的中心离得很近,其JS散度都是一个常数,所以其获取的梯度是0,是没有办法进行更新的。而两个分布没有重叠的原因:从理论和经验而言,真实的数据分布其实是一个低维流形(不具备高维特征),而是存在一个嵌入在高维度的低维空间内。由于维度存在差异,数据很可能不存在分布的重合。

1.5 其他相关(正在补充!)


2. Cycle GAN 《Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks》

一开始是应用到图像风格迁移上面的
在这里插入图片描述

2.1 基础理论和推到

  1. 概念描述
    在这里插入图片描述

CycleGAN具有一个双判别器结构

  • G:从X到Y的生成器
  • F:从Y到X的生成器
  • D x D_x Dx:判别生成的X是真实X,还是生成的X
  • D y D_y Dy:判别生成的Y是真实Y,还是生成的Y

训练过程

  1. forward cycle-consistency loss
    x → G ( x ) → F ( G ( x ) ) ≈ x x \rightarrow G(x) \rightarrow F(G(x)) \approx x xG(x)F(G(x))x
    • 输入 x x x,生成器 G G G,得到输出 y ^ = G ( x ) \hat{y} = G(x) y^=G(x),判别器 D y D_y Dy判别该输出是真实 y y y还是生成的;
    • y ^ \hat{y} y^继续输入到另一个生成器 F F F之中,输出 x ^ = F ( y ^ ) = F ( G ( x ) ) \hat{x} = F(\hat{y}) = F(G(x)) x^=F(y^)=F(G(x))
  2. backward cycle-consistency loss
    y → F ( y ) → G ( F ( y ) ) ≈ y y \rightarrow F(y) \rightarrow G(F(y)) \approx y yF(y)G(F(y))y
    • 输入 y y y,生成器 F F F,得到输出 x ^ = F ( y ) \hat{x} = F(y) x^=F(y),判别器 D x D_x Dx判断该输出是真实 x x x还是生成的;
    • x ^ \hat{x} x^继续输入到另一个生成器 G G G之中,输出 y ^ = G ( x ^ ) = G ( F ( y ) ) \hat{y} = G(\hat{x}) =G(F(y)) y^=G(x^)=G(F(y))

损失函数
L ( G , F , D x , D y ) = L G A N ( G , D y , X , Y ) + L G A N ( F , D x , Y , X ) + λ L c y c ( G , F ) , (2.1) L(G,F,D_x,D_y) = L_{GAN}(G,D_y,X,Y) + L_{GAN}(F,D_x,Y,X) + \lambda L_{cyc}(G,F), \tag{2.1} L(G,F,Dx,Dy)=LGAN(G,Dy,X,Y)+LGAN(F,Dx,Y,X)+λLcyc(G,F),(2.1)
其中包含有两个原始GAN的损失和一个CycleGAN的损失。

G : X → Y G:X \rightarrow Y G:XY
L G A N ( G , D y , X , Y ) = E y ∼ p d a t a ( y ) [ l o g D y ( y ) ] + E x ∼ p d a t a ( x ) [ l o g ( 1 − D y ( G ( x ) ) ) ] , (2.2) L_{GAN}(G,D_y,X,Y) = E_{y \sim p_{data}(y)}[log D_y(y)] + E_{x \sim p_{data}(x)}[log(1 - D_y(G(x)))], \tag{2.2} LGAN(G,Dy,X,Y)=Eypdata(y)[logDy(y)]+Expdata(x)[log(1Dy(G(x)))],(2.2)

F : Y → X F:Y \rightarrow X F:YX
L G A N ( F , D y , X , Y ) = E x ∼ p d a t a ( x ) [ l o g D x ( x ) ] + E y ∼ p d a t a ( y ) [ l o g ( 1 − D x ( F ( y ) ) ) ] , (2.3) L_{GAN}(F,D_y,X,Y) = E_{x \sim p_{data}(x)}[log D_x(x)] + E_{y \sim p_{data}(y)}[log(1 - D_x(F(y)))], \tag{2.3} LGAN(F,Dy,X,Y)=Expdata(x)[logDx(x)]+Eypdata(y)[log(1Dx(F(y)))],(2.3)

在理论上,对抗学习可以学习到一种映射关系,以生成器G为例,它得到的输出的分布是与目标域是同分布。但是呢,在足够大的生成能力下,一个网络模型可以映射相同一系列输入图像到任意随机排列在目标域的图像中,其中任何一个学到的映射都可以得到与目标域匹配的输出分布。什么意思呢?就是可能有两个不同的生成器生成的图像都可能得到相同的能与目标域匹配的图像分布。为了得到一个满意的输出,因此单单一个对抗损失远远不够。为了进一步减少可能映射函数的空间域,作者认为学习到的映射因该具有循环一致性损失,就如我在方法中说的那样。

L c y c ( G , F ) = E x ∼ p d a t a ( x ) [ ∣ ∣ F ( G ( x ) ) − x ∣ ∣ 1 ] + E y ∼ p d a t a ( y ) [ ∣ ∣ G ( F ( y ) ) − y ∣ ∣ 1 ] . (2.4) L_{cyc}(G,F) = E_{x \sim p_{data}(x)}[||F(G(x)) -x||_1] + E_{y \sim p_{data}(y)}[||G(F(y)) - y||_1]. \tag{2.4} Lcyc(G,F)=Expdata(x)[∣∣F(G(x))x1]+Eypdata(y)[∣∣G(F(y))y1].(2.4)

2.2 实验结果

在这里插入图片描述
在这里插入图片描述

2.3 限制和讨论

  1. 限制:
    • 并非所有的例子都是非常好的效果的
    • 颜色风格的变化容易实现,但是几何风格的变化难以实现
    • 训练数据的特征分布会影响训练的过程,容易导致训练失败(比如只是用马和斑马进行训练,如果加入人骑在马上面进行风格迁移就会失败,因为没有学习到这个特征)
    • 成对训练数据和非成对数据训练的效果仍然存在较大的区别

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务Spring整合MyBatis

Spring整合MyBatis 在整合之前需要保证mybatis、springframework、mybatis-spring、spring-jdbc的包都已经导入 并且要根据官网提示保证mybatis、springframework、mybatis-spring版本相对应&#xff0c;否则会产生冲突报错 maven依赖如下&#xff1a; <!-- Spring Web…

SAS应用入门学习笔记6

SQL (SAS): Features&#xff1a; 1&#xff09;不需要在每个query中重复调用每个SQL&#xff1b; 2&#xff09;每个statement都是独立去完成的&#xff1b; 3&#xff09;我们是没有proc print和proc sort语句的&#xff1b;&#xff08;order by&#xff09; key synta…

vue3的shallowReactive和shallowRef,readonly和shallowReadonly

shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09; <template><span>姓名&#xff1a;{{name}}</span><span>年龄&#xff1a;{{age}}</span><span>职业&#xff1a;{{salary.job.num}}</spa…

JAVA SE复习(第5章 面向对象(上))

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用5.1 面向对象编程5.1.2 类和对象1、什么是类类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&am…

springboot集成kafka

选择特定版本spring-kafka官方使用文档 进入官网&#xff1a;https://spring.io/ 选择自己使用版本 点进去后按照 /2.7.0/reference/html/ 路径点进去就能看到想要版本的文档了

C++实现线程池

C实现线程池一、前言二、线程池的接口设计2.1、类封装2.2、线程池的初始化2.3、线程池的启动2.4、线程池的停止2.5、线程的执行函数run()2.6、任务的运行函数2.7、等待所有线程结束三、测试线程池四、源码地址总结一、前言 C实现的线程池&#xff0c;可能涉及以下知识点&#…

JVM - 垃圾回收

目录 垃圾回收基础和根搜索算法 垃圾回收概述 根搜索算法 引用分类 垃圾回收基础(跨代引用、记忆集、写屏障、判断垃圾的步骤、STW) 跨代引用 记忆集(Remembered Set) 写屏障 判断是否垃圾的步骤 GC类型 Stop-The-World 垃圾收集类型 判断类无用的条件 垃圾回收算…

Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程

0. 前言1. Spring对SqlSessionTemplate的管理1.1. SqlSessionTemplate的创建&#xff1a;1.2. MapperProxy中sqlSession的来源&#xff1a;2. SqlSessionInterceptor中的getSqlSession0. 前言 众所周知&#x1f60f;:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executo…

在VMware17 Pro中设置创建虚拟机Ubuntu 20

在VMware17 Pro中设置创建虚拟机Ubuntu 200 前言1 安装Ubuntu 20步骤0 前言 书接上回&#xff0c;安装好了VMware17 Pro之后&#xff0c;就是安装虚拟机了&#xff0c;前提是下好了系统安装包&#xff0c;以Ubuntu 20为例 1 安装Ubuntu 20步骤 首先点击创建新的虚拟机 新建…

利用NAS免费部署动态解析实现内网穿透

‍ 想要从外网访问家中的NAS等设备&#xff0c;一般来说我们需要知道家中路由器的公网IP。 现在固定的公网IP基本上很难免费申请到了&#xff0c;但是一般来说运营商可以免费提供一个动态变化的公网IP&#xff1a;当路由设备重启时&#xff0c;运营商会给你重新分配一个新的I…

PHP加载3D模型【WebGL】

这是另一篇关于如何使用 PHP加载 3D 模型的文章。 在这里&#xff0c;我使用 Laravel 作为后端及其存储。 我在前端使用 Three.Js 库来渲染和显示 3D 模型。 我将向您展示如何上传 3D 模型以及如何从 Laravel 存储加载 3D 模型。 请仔细完成以下步骤。 大家可以在评论区提出任何…

8Manage PPM项目管理系统独特的功能:项目完整性保护

项目有其内在复杂性&#xff08;项目管理的科学部分&#xff09;&#xff0c;这种复杂性可以进行划分和克服。项目也有人为的或偶然的复杂性&#xff08;项目管理的艺术部分&#xff09;&#xff0c;这种复杂性无法进行划分和克服。偶然的高复杂性会影响并使内在复杂性难以管理…

【系统架构设计师】计算机组成与体系结构 ① ( 计算机组成 | CPU | 存储器 | 总线 | IO 外设 | CPU 组成 | 运算器 | 控制器 )

文章目录一、计算机组成与体系结构二、计算机组成结构三、CPU 组成1、运算器2、控制器一、计算机组成与体系结构 计算机组成与体系结构 对应 大学的 计算机组成原理 课程 , 主要分为 : 计算机组成体系结构划分 两大知识板块 ; 在架构师考试时 , 平均分值是 3 分 ; 计算机组成…

三相可控全桥整流与DC Buck变换电路设计仿真问题汇总

目 录 问题 一、开关管没有打开的情况下&#xff0c;DC Buck输出负电压&#xff1f; 二、问题分析 1.输出端存在与母线电压反相的电压&#xff0c;因此可以确定为差模感应电压&#xff0c;如果输出端与母线端产生的是大小相等&#xff0c;方向相同的同相电压&#xff0c;则为共…

大数据框架之Hadoop:HDFS(六)DataNode(面试开发重点)

6.1DataNode工作机制 DataNode工作机制&#xff0c;如下图所示。 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳…

ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现

发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息&#xff0c;流程如图 步骤一 创建功能包&#xff08;工作空间为~/catkin_ws/src&#xff09; $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…

FLStudio水果最新版本V21支持中文语言

FL Studio简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio习惯叫它水果。软件现有版本是FLStudio21&#xff0c;已全面升级支持简体中文语言界面 。FL Studio 能让你的计算机就像是全功能的录音室一样&#xff0c;完成编曲、剪辑、录音、混音等工作&#xff0c;帮助爱好…

2023大厂高频软件测试面试真题(附答案)

一、接口测试面试题&#xff1a;1.接口测试是怎么做的&#xff0c;如何分析数据&#xff1f;接口测试实际跟一般测试不同就是测试用例的设计部分。获取接口规范。设计接口测试功能用例&#xff08;主要从用户角度出发看接口能否实现业务需求&#xff0c;用例设计就是黑盒用例那…

2022财年净新增1159家门店,百胜中国门店高速扩张背后有何阳谋?

中国最大餐饮企业百胜中国控股有限公司&#xff08;下称“百胜中国”&#xff09;&#xff0c;2月8日发布了2022年度第四季度及全年未经审核的财务业绩。 从财报数据来看&#xff0c;这家拥有肯德基、必胜客、黄记煌等诸多餐饮品牌的巨头&#xff0c;已经顺利渡过了疫情笼罩下…

计算机网络(第7版)第五章(物理层)知识点整理

计算机网络 参考书目&#xff1a;《计算机网络&#xff08;第7版&#xff09;》&#xff1a;谢希仁——电子工业出版社 《精通Windows Sockets网络开发--基于Visual C实现》&#xff1a;孙海民——人民邮电出版社 第五章&#xff1a;物理层计算机网络一、基本概念二、传输媒体…