diffusion model 学习笔记

条件引导的 diffusion

对于无条件的DDPM 而言

p ( x t ∣ x 0 ) ∼ N ( α t ˉ x 0 , 1 − α t ˉ ⋅ I ) p(x_t | x_0) \sim \mathcal{N}( \sqrt{\bar{\alpha_t}} x_0, 1-\bar{\alpha_t} \cdot \mathrm{I} ) p(xtx0)N(αtˉ x0,1αtˉI)

可以得到

log ⁡ p ( x t ∣ x 0 ) = − 1 2 ( x t − α t ˉ x 0 ) 2 1 − α t ˉ \begin{aligned} \log p(x_t|x_0) &= - \frac{1}{2} \frac{ (x_t - \sqrt{\bar{\alpha_t}} x_0) ^ 2 }{ 1-\bar{\alpha_t} } \end{aligned} logp(xtx0)=211αtˉ(xtαtˉ x0)2

计算其 score func, 可以得到

∇ x log ⁡ p ( x t ∣ x 0 ) = − ( x t − α t ˉ x 0 ) 1 − α t ˉ = − ϵ 1 − α t ˉ ≈ − ϵ θ ( x t , t ) 1 − α t ˉ \begin{aligned} \nabla_x \log p(x_t|x_0) &= -\frac{ (x_t - \sqrt{\bar{\alpha_t}} x_0) }{ 1-\bar{\alpha_t} } \\ &= -\frac{ \epsilon } { \sqrt{1-\bar{\alpha_t}} } \\ & \approx -\frac{ \epsilon_{\theta}(x_t, t) }{ \sqrt{1-\bar{\alpha_t}} } \end{aligned} xlogp(xtx0)=1αtˉ(xtαtˉ x0)=1αtˉ ϵ1αtˉ ϵθ(xt,t)

也就是,我们训练的网络conditionalUnet 输出的是噪声的估计, 这个估计的噪声 ϵ θ ( x t , t ) \epsilon_{\theta}(x_t, t) ϵθ(xt,t)可以用来计算当前数据点在整个概率空间中的score-func: ∇ x log ⁡ p ( x t ∣ x 0 ) \nabla_x \log p(x_t|x_0) xlogp(xtx0).


对于 conditional Diffusion. 其 score func 可以写成

∇ x t log ⁡ p ( x t ∣ y ) = ∇ x t log ⁡ ( p ( x t ) ⋅ p ( y ∣ x t ) p ( y ) ) = ∇ x t log ⁡ p ( x t ) + ∇ x t log ⁡ p ( y ∣ x t ) − ∇ x t log ⁡ p ( y ) ⏟ = 0 和 x t 无关 = ∇ x t log ⁡ p ( x t ) ⏟ u n c o n d i t i o n a l s c o r e + ∇ x t log ⁡ p ( y ∣ x t ) ⏟ a d v e r s i a l g r a d i e n t \begin{aligned} \nabla_{x_t} \log p(x_t|y) &= \nabla_{x_t} \log \left ( \frac{ p(x_t) \cdot p(y|x_t) }{ p(y) } \right) \\ &= \nabla_{x_t} \log p(x_t) + \nabla_{x_t} \log p(y|x_t) - \underbrace{\nabla_{x_t} \log p(y)} _{=0 \ \ 和 x_t 无关} \\ &= \underbrace{ \nabla_{x_t} \log p(x_t)}_{ \mathrm{unconditional\ score} } + \underbrace{ \nabla_{x_t} \log p(y|x_t) }_{ \mathrm{adversial\ gradient} } \end{aligned} xtlogp(xty)=xtlog(p(y)p(xt)p(yxt))=xtlogp(xt)+xtlogp(yxt)=0  xt无关 xtlogp(y)=unconditional score xtlogp(xt)+adversial gradient xtlogp(yxt)

现在,我们需要估计 ∇ x t log ⁡ p ( x t ∣ y ) \nabla_{x_t} \log p(x_t|y) xtlogp(xty) 中的 ϵ ′ \epsilon' ϵ, 然后使用 DDPM/DDIM 采样即可. 不妨设

∇ x t log ⁡ p ( x t ∣ y ) = − ϵ ′ 1 − α t ˉ \begin{align} \nabla_{x_t} \log p(x_t|y) &= -\frac{ \epsilon' }{ \sqrt{ 1- \bar{\alpha_t}} } \end{align} xtlogp(xty)=1αtˉ ϵ

则我们有

∇ x t log ⁡ p ( x t ∣ y ) = ∇ x t log ⁡ p ( x t ) + ∇ x t log ⁡ p ( y ∣ x t ) ⏟ 令 = g − ϵ ′ 1 − α t ˉ = − ϵ 1 − α t ˉ + g 可得 : ϵ ′ = ϵ − 1 − α ˉ t ⋅ g \begin{align} \nabla_{x_t} \log p(x_t|y) &= \nabla_{x_t} \log p(x_t) + \underbrace{ \nabla_{x_t} \log p(y|x_t)}_{ 令 = g } \\ -\frac{ \epsilon' }{ \sqrt{ 1- \bar{\alpha_t}} } &= -\frac{ \epsilon }{ \sqrt{ 1- \bar{\alpha_t}} } + g \\ 可得 &: \epsilon' = \epsilon - \sqrt{1-\bar{\alpha}_t} \cdot g \end{align} xtlogp(xty)1αtˉ ϵ可得=xtlogp(xt)+=g xtlogp(yxt)=1αtˉ ϵ+g:ϵ=ϵ1αˉt g

即我们在无条件模型 DDPM 估计的噪声中添加一个微小的扰动( 1 − α ˉ t ⋅ g \sqrt{1-\bar{\alpha}_t}\cdot g 1αˉt g),就可以作为条件模型的噪声估计.


  • g = ∇ x t log ⁡ p ( y ∣ x t ) g = \nabla_{x_t} \log p(y|x_t) g=xtlogp(yxt) 的含义:

    条件概率的梯度: ∇ x t log ⁡ p ( y ∣ x t ) \nabla_{x_t} \log p(y|x_t) xtlogp(yxt) 表示的是在已知 x t x_t xt的情况下,微小变化 x t x_t xt如何影响条件 y y y的对数概率。这是一个 向量场,指向增加条件 y y y出现概率的方向。

  • 如何得到 g

    假设我现在已经有了一个回归模型, 即 y = f ( x t , . . . ) y = f(x_t, ...) y=f(xt,...).

    输入一个数据 x t x_t xt, 返回其对应一个 logit 值.

    ## 输入: x_t, 模型 f
    x_t = torch.tensor(x_t, requires_grad=True)
    y = f(x_y)            ## pytorch model 预测其结果
    log_p = torch.log(y)  ## 计算 log 概率
    log_p.backward()      ## 计算梯度
    grad_x_t = x_t.grad   ## 获取梯度
    

Langevin Dynamics 采样

首先,假设我们已经有了一个训练好的score-func( s θ ( x ) s_{\theta}(x) sθ(x)). 已经接近于真实的 s ( x ) s(x) s(x), 即 s θ ( x ) = ∇ x log ⁡ p θ ( x ) s_{\theta}(x)=\nabla_{x} \log p_{\theta}(x) sθ(x)=xlogpθ(x), 其中 p θ ( x ) ≈ p ( x ) p_{\theta}(x) \approx p(x) pθ(x)p(x). 现在, 我们需要利用 s θ ( x ) s_{\theta}(x) sθ(x) 对 x 进行采样,使得 x ∼ p θ ( x ) x \sim p_{\theta}(x) xpθ(x)

郎之万公式: 描述了粒子做随机布朗运动 (粒子位置随时间变化的关系), 是一种 SDE, 描述了 由梯度力(即. U ( x ( t ) U(x(t) U(x(t))驱动并受到随机噪声(即. Z t Z_t Zt)影响的系统的时间演化.

d X ( t ) = − ∇ x U ( x ( t ) ) ⋅ d t + σ d t ⋅ Z t dX(t) = -\nabla_x U(x(t)) \cdot dt + \sigma \sqrt{dt} \cdot Z_t dX(t)=xU(x(t))dt+σdt Zt

X ( t ) X(t) X(t):


Diffuser 源码解读

DDPMSchedule

1. α , α ˉ , β \alpha, \bar{\alpha}, \beta α,αˉ,β 的关系和计算

x t = α t ⋅ x t − 1 + 1 − α t ⋅ ϵ t = ∏ i = 1 t α i ⋅ x 0 + 1 − ∏ i = 1 t α i ⋅ ϵ 0 = α t ˉ ⋅ x 0 + 1 − α t ˉ ⋅ ϵ 0 β t = 1 − α t \begin{align} x_t &= \sqrt{\alpha_t} \cdot x_{t-1} + \sqrt{ 1-\alpha_t } \cdot \epsilon_t \\ &= \sqrt{\prod_{i=1}^{t} \alpha_i } \cdot x_0 + \sqrt{1-\prod_{i=1}^{t}\alpha_i} \cdot \epsilon_0 \\ &= \sqrt{\bar{\alpha_t}} \cdot x_0 + \sqrt{1-\bar{\alpha_t}} \cdot \epsilon_0 \\ \beta_t &= 1-\alpha_t \end{align} xtβt=αt xt1+1αt ϵt=i=1tαi x0+1i=1tαi ϵ0=αtˉ x0+1αtˉ ϵ0=1αt

  • DDPMSchedule 中, 先计算出 β t \beta_t βt 的值,然后利用 α t = 1 − β t \alpha_t = 1- \beta_t αt=1βt 计算剩下的系数。

  • self.beta 的计算有各种不同的方法,

    • trained_betas: 需要传入自定义的beta
    • linear
    • squaredcos_cap_v2
  • alphaalpha_cumprod 的计算

    self.alphas = 1.0 - self.betas
    self.alphas_cumprod = torch.cumprod(self.alphas, dim=0)
    # 累积乘积(cumulative product)
    
  • self.betas: 是扩散过程中“噪声量”的度量。控制着每一步扩散过程中加入的噪声量的大小.

  • self.alphas: 每一步中保留的原始信号的比例。

图片描述

上图是 DDPM 中的 α \alpha α, β \beta β, α ˉ \bar{\alpha} αˉ 的关系。

2. 计算前向时刻的采样: x t → x t − 1 x_t \rightarrow x_{t-1} xtxt1

q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) N ( x t − 1 ; α ˉ t − 1 x 0 , ( 1 − α ˉ t − 1 ) I ) N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) ∝ N ( x t − 1 ; α t ( 1 − α ˉ t − 1 ) x t + α ˉ t − 1 ( 1 − α t ) x 0 1 − α ˉ t ⏟ μ q ( x t , x 0 ) , ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t I ⏟ Σ q ( t ) ) \begin{align} q(x_{t-1}|x_t, x_0) &= \frac{ q(x_t|x_{t-1}, x_0) q(x_{t-1}|x_0) }{ q(x_t|x_0) }\\ &= \frac{\mathcal{N}(x_{t} ; \sqrt{\alpha_t} x_{t-1}, (1 - \alpha_t)\textbf{I})\mathcal{N}(x_{t-1} ; \sqrt{\bar\alpha_{t-1}}x_0, (1 - \bar\alpha_{t-1}) \textbf{I})}{\mathcal{N}(x_{t} ; \sqrt{\bar\alpha_{t}}x_0, (1 - \bar\alpha_{t})\textbf{I})} \\ &\propto \mathcal{N}( x_{t-1} ; \underbrace{\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_{t} + \sqrt{\bar\alpha_{t-1}}(1-\alpha_t)x_0}{1 -\bar\alpha_{t}}}_{\mu_q(x_t, x_0)}, \underbrace{\frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}}\textbf{I}}_{{\Sigma}_q(t)}) \end{align} q(xt1xt,x0)=q(xtx0)q(xtxt1,x0)q(xt1x0)=N(xt;αˉt x0,(1αˉt)I)N(xt;αt xt1,(1αt)I)N(xt1;αˉt1 x0,(1αˉt1)I)N(xt1;μq(xt,x0) 1αˉtαt (1αˉt1)xt+αˉt1 (1αt)x0,Σq(t) 1αˉt(1αt)(1αˉt1)I)

通过上面的公式,我们可以知道,当知道 x 0 x_0 x0 x t x_t xt, 既可以得到 x t − 1 x_{t-1} xt1. 但是, 我们没有办法获取真实的 x 0 x_0 x0, 所以只能估计 x t x_t xt 对应的 x ^ 0 \hat{x}_0 x^0 是什么样子的。

μ q ( x t , x 0 ) = α t ( 1 − α ˉ t − 1 ) x t + α ˉ t − 1 ( 1 − α t ) x 0 1 − α ˉ t Σ q ( t ) = ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t I \begin{align} \mu_q(x_t, x_0) &= \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_{t} + \sqrt{\bar\alpha_{t-1}}(1-\alpha_t)x_0}{1 -\bar\alpha_{t}} \\ {\Sigma}_q(t) &= \frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}}\textbf{I} \end{align} μq(xt,x0)Σq(t)=1αˉtαt (1αˉt1)xt+αˉt1 (1αt)x0=1αˉt(1αt)(1αˉt1)I

  • 第一种: 先利用预测的噪声 ϵ t \epsilon_t ϵt 估计 x ^ 0 \hat{x}_0 x^0. 然后利用 x t x_t xt x ^ 0 \hat{x}_0 x^0 估计 x t − 1 x_{t-1} xt1

x ^ 0 t − 1 = x t − 1 − α ˉ t ⋅ ϵ θ ( x t , t ) α ˉ t \begin{align} \hat{x}_0^{t-1} &= \frac{ x_t - \sqrt{1-\bar{\alpha}_t} \cdot \epsilon_{\theta}(x_t, t) }{ \sqrt{\bar{\alpha}_t} } \end{align} x^0t1=αˉt xt1αˉt ϵθ(xt,t)

x ^ 0 t − 1 \hat{x}_0^{t-1} x^0t1 表示第 t − 1 t-1 t1时刻估计的 x 0 x_0 x0. 基本上,在采样一半时,基本上预测的 x 0 x_0 x0 就和真实图片差不多了.

接下来计算 x t − 1 x_{t-1} xt1 的均值和方差. 方差非常重要,不能忽略
m e a n ( x t − 1 ) = α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ⋅ x t + α ˉ t − 1 ( 1 − α t ) 1 − α ˉ t ⋅ x ^ 0 t − 1 v a r ( x t − 1 ) = ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t ⋅ I x t − 1 = m e a n ( x t − 1 ) + v a r ( x t − 1 ) \begin{align} \mathrm{mean}(x_{t-1}) &= \frac{ \sqrt{\alpha_t}(1-\bar{\alpha}_{t-1}) }{ 1-\bar{\alpha}_{t} } \cdot x_t + \frac{ \sqrt{\bar{\alpha}_{t-1}}(1-\alpha_t) }{ 1-\bar{\alpha}_{t} } \cdot \hat{x}_0^{t-1} \\ \mathrm{var}(x_{t-1}) &= \frac{(1 - \alpha_t)(1 - \bar\alpha_{t-1})}{1 -\bar\alpha_{t}} \cdot \textbf{I} \\ x_{t-1} &= \mathrm{mean}(x_{t-1}) + \mathrm{var}(x_{t-1}) \end{align} mean(xt1)var(xt1)xt1=1αˉtαt (1αˉt1)xt+1αˉtαˉt1 (1αt)x^0t1=1αˉt(1αt)(1αˉt1)I=mean(xt1)+var(xt1)

for i, t in enumerate(ddpm_scheduler.timesteps):alpha_t = alphas[t] alpha_t_bar = alphas_cumprod[t]alpha_t_bar_prev = alphas_cumprod[t - 1] if t - 1 >= 0 else torch.tensor(1.0)# -------------## 1. x_0 和 x_t的系数pred_ori_sample_coeff = torch.sqrt(alpha_t_bar_prev) * (1-alpha_t) / (1-alpha_t_bar)current_sample_coeff = torch.sqrt(alpha_t) * (1-alpha_t_bar_prev) / (1-alpha_t_bar)## 2. 预测 x_0noise_pred = ddpm_noise_model(x_t, t)['sample']est_x_0 = (x_t - torch.sqrt(1-alpha_t_bar) * noise_pred) / torch.sqrt(alpha_t_bar)## 3. clip x_0est_x_0 = est_x_0.clamp(-1, 1)## 4. 预测 x_{t-1}x_t_prev = pred_ori_sample_coeff * est_x_0 + current_sample_coeff * x_t## 5. 添加噪声if t > 0:std_var_noise = torch.randn_like(x_t).to(device)x_t_var_coeff = (1-alpha_t) * (1-alpha_t_bar_prev) / (1-alpha_t_bar)x_t_var_coeff = torch.sqrt(x_t_var_coeff)x_t_prev = x_t_prev + x_t_var_coeff * std_var_noisex_t = x_t_prev

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

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

相关文章

3.4 大数据生态

文章目录 1. 数据存储1.1 Apache Hadoop - HDFS1.2 Apache HBase1.3 Apache Kudu1.4 云平台存储组件 2. 数据计算2.1 Apache Hadoop - MapReduce2.2 Apache Hive2.3 Apache Spark2.4 Apache Flink 3. 数据传输3.1 Apache Kafka3.2 Apache Pulsar3.3 Apache Flume3.4 Apache Sqo…

Community Enterprise Operating System

起源与背景 CentOS项目始于2003年,由一群热心的Linux用户和开发者共同发起。 它的诞生旨在为用户提供一个免费且与RHEL高度兼容的操作系统,满足那些希望使用RHEL的稳定性和安全性但又不想支付商业许可费用的用户和组织的需求。 CentOS社区会将Red Hat…

论文精读:PRL RuO2中不存在交错磁自旋分裂

Phys. Rev. Lett., 2024, 133, 176401. https://doi.org/10.1103/PhysRevLett.133.176401 https://mp.weixin.qq.com/s/Miv6kvT5vh-Sha1xP38YLQ 摘要节选 金红石RuO2被认为是一种潜在的d波交变磁候选材料,预测自旋分裂高达1.4 eV。尽管积累了理论预测和输运测量…

【GIN】go-gin 中 validator 验证功能

文章目录 前言一、基础用法二、常用字段说明常用字段说明1. required2. len3. min 和 max4. gte 和 lte 、 gt 和 lt 、ne5. oneof6. email7. url 三、示例代码运行效果 总结 前言 在 Go 中使用 Gin 框架时,BindJSON 可以将 JSON 请求体中的数据绑定到结构体上&…

[ 问题解决篇 ] win11中本地组策略编辑器gpedit.msc打不开(gpedit.msc缺失)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

RSTP的工作过程

RSTP简介: 生成树协议(STP)用于在网络中防止环路产生,但 STP 的收敛速度较慢。 RSTP(Rapid Spanning Tree Protocol )快速生成树协议:RSTP 是对 STP 的改进,它能在网络拓扑发生变化…

HTML 结构化标签完全指南:<html>、<head>、<body> 和布局标签 <div>、<span> 的功能及其在网页中的应用

文章目录 1. <html> 标签2. <head> 标签3. <body> 标签4. <div> 标签5. <span> 标签小结 在 HTML 文档中&#xff0c;使用特定的结构标签可以有效地组织和管理网页内容。这些标签不仅有助于浏览器正确解析和渲染页面&#xff0c;还能提高网页的可…

php把十六进制转化成字符串 和 字符串转十六进制

最近项目中碰到需要把接收十六进制的数据&#xff0c;十六进制的数据不便阅读 方法一&#xff0c;只是不同的函数 // 十六进制转字符串 function hexToStr($hex) {$hex str_replace( , , $hex); // 去除空格$string ;for ($i 0; $i < strlen($hex) - 1; $i 2) {$st…

异步编程的利之Future模式深入解析(In Depth Analysis of Future Patterns)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

《TCP/IP网络编程》学习笔记 | Chapter 1:理解网络编程和套接字

《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字 《TCP/IP网络编程》学习笔记 | Chapter 1&#xff1a;理解网络编程和套接字基本概念服务端客户端 基于 Linux 平台的 "Hello world!" 服务端和客户端基于 Linux 的文件操作打开文件关闭文件…

代理人工智能如何应对现代威胁的速度和数量

Seven AI首席执行官 Lior Div 讨论了代理 AI 的概念及其在网络安全中的应用。他解释了代理 AI 与传统自动化安全系统的区别&#xff0c;即代理 AI 具有更大的自主性和决策能力。 Div 强调&#xff0c;通过实时处理大量警报&#xff0c;代理 AI 特别适合对抗现代 AI 驱动的威胁…

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

<HarmonyOS第一课>应用/元服务上架的课后习题

善者&#xff0c;吾善之&#xff1b; 不善者&#xff0c;吾亦善之&#xff0c;德善。 信者&#xff0c;吾信之&#xff1b; 不信者&#xff0c;吾亦信之&#xff0c;德信。 圣人在天下&#xff0c;歙歙焉为天下浑其心&#xff0c;百姓皆注其耳目&#xff0c;圣人皆孩之。 通过&…

九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图

近日&#xff0c;九识智能与徐工汽车签署战略合作协议&#xff0c;标志着双方在智能驾驶技术与新能源商用车融合应用、联合生产及市场推广等方面迈入深度合作的新篇章&#xff0c;将共同引领智能驾驶技术商业化浪潮。 近年来&#xff0c;在国家智能化发展战略的引领下&#xff…

根据Redis漏洞通知的整改修复过程

一、收到通知&#xff1a; 二、查看本校“宝山商城&#xff08;教学&#xff09;”已安装的Redis版本号 对照影响范围的版本号&#xff0c;在其内&#xff0c;所以需要升级Redis版本。 三、升级centos中的Redis版本 在Cent0S系统中&#xff0c;如果我们需要升级Redis版本&…

docker 可用镜像服务地址(2024.10.31亲测可用)

1.错误 Error response from daemon: Get “https://registry-1.docker.io/v2/” 原因&#xff1a;镜像服务器地址不可用。 2.可用地址 编辑daemon.json&#xff1a; vi /etc/docker/daemon.json内容修改如下&#xff1a; {"registry-mirrors": ["https://…

Git (推送到远端仓库)

目录 一、在 gitee 上创建一个仓库 二、将项目推送到远程仓库 三、解释推送命令 一、在 gitee 上创建一个仓库 操作如下&#xff1a; 二、将项目推送到远程仓库 这里例举新的项目推送到远程仓库的例子&#xff1a; 打开仓库查看&#xff1a; 三、解释推送命令 添加远程仓库…

opencv学习笔记(6):图像预处理(直方图、图像去噪)

3.直方图 直方图是用来表现图像中亮度分布的&#xff0c;给出的是图像中某个亮度或者某个范围亮度下共有几个像素&#xff0c;即统计一幅图某个亮度像素的数量。 直方图不能反映某一灰度值像素在图像中的位置&#xff0c;失去了图像的空间信息。图像直方图由于其计算代价较小&a…

《双指针篇》---移动零

题目传送门 这道题可以归类为 数组划分/数组分块 。 题目制定了一个规则&#xff0c;我们可以在这个规则下&#xff0c;将数组划分为若干个区间。 这道题让我们把所有非零元素移动到左边。所有零元素移动到右边。 将数组划分为&#xff1a; 左区间非0&#xff1b; 右区间&…

OpenHarmony、HarmonyOS、HarmonyNext互相兼容吗?

1&#xff0c;三者之间的关系 OpenHarmony&#xff1a;开源底层。HarmonyOS&#xff1a;闭源手机系统&#xff0c;兼容安卓生态。HarmonyOS NEXT&#xff1a;纯血鸿蒙&#xff0c;不兼容安卓。 上一篇文章简单介绍过&#xff0c;就不再多说了&#xff0c;这里说一下HarmonyOS …