Diffusion Models 简单代码示例

2023-11-09

一、关于Diffusion 模型的简单介绍

 

首先diffusion模型和VAE、Flow、Gan等模型类似,均属于生成模型,可以和GCN、CNN等其他深度学习网络相结合,完成特定的生成任务,如下图:

基于 GAN 生成模型,基于 VAE 的生成模型,以及基于 flow 的生成模型它们都可以生成较高质量的样本,但每种方法都有其局限性。GAN 在对抗训练过程中会出现模式崩塌和训练不稳定的问题;VAE 则严重依赖于目标损失函数;流模型则必须使用专门的框架来构建可逆变换。

扩散模型的灵感来自于非平衡热力学。他们定义了一个扩散步骤的马尔可夫链,慢慢地向数据添加随机噪声,然后学习反向扩散过程,从噪声中构建所需的数据样本。与VAE或flow模型不同,扩散模型的学习过程是固定的,潜变量具有高维数(与原始数据相同)。

扩散模型的目标是通过数据在潜在空间(latent space)的扩散过程,学习数据的潜在向量结构(latent structure),通俗点说,扩散模型学习利用数据逐步变成噪声的过程,学习反向的去噪声过程。在计算机视觉中,这意味着训练神经网络通过学习反向扩散过程对高斯噪声模糊的图像进行去噪。计算机视觉中使用的三个通用扩散建模框架的例子是去噪扩散概率模型(DDPM)、噪声条件评分网络(noise conditioned score networks)和随机微分方程(stochastic differential equations)(注:该分类为维基百科,也有分成: diffusion probabilistic models (Sohl-Dickstein et al., 2015), noise-conditioned score network (NCSNYang & Ermon, 2019), and denoising diffusion probabilistic models (DDPMHo et al. 2020))。

 接下来搬运各种连接,以便大家进一步了解diffusion 模型。

通俗的理解diffusion 模型:

Diffusion Models: A Practical Guide | Scale AIWith the Release of Dall-E 2, Google’s Imagen, Stable Diffusion, and Midjourney, diffusion models have taken the world by storm, inspiring creativity and pushing the boundaries of machine learning. In this guide we help to denoise diffusion models, describing how they work and discussing practical applications for today and tomorrow.https://scale.com/guides/diffusion-models-guide

非常详细的公式推导过程: 

What are Diffusion Models? | Lil'Log[Updated on 2021-09-19: Highly recommend this blog post on score-based generative modeling by Yang Song (author of several key papers in the references)]. [Updated on 2022-08-27: Added classifier-free guidance, GLIDE, unCLIP and Imagen. [Updated on 2022-08-31: Added latent diffusion model.So far, I’ve written about three types of generative models, GAN, VAE, and Flow-based models. They have shown great success in generating high-quality samples, but each has some limitations of its own.https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

How diffusion models work: the math from scratch | AI SummerA deep dive into the mathematics and the intuition of diffusion models. Learn how the diffusion process is formulated, how we can guide the diffusion, the main principle behind stable diffusion, and their connections to score-based models.https://theaisummer.com/diffusion-models/

训练difussion模型视频:

https://www.youtube.com/watch?v=TBCRlnwJtZUhttps://www.youtube.com/watch?v=TBCRlnwJtZU

简单的Diffusion模型代码:

GitHub - dome272/Diffusion-Models-pytorch: Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf)Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf) - GitHub - dome272/Diffusion-Models-pytorch: Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf)https://github.com/dome272/Diffusion-Models-pytorch

这里从上述github的扩散模型代码为例.

这是一个在100行代码内实现扩散模型的案例,且过程是易于理解的。与其他实现代码不同的是,这段代码没有使用下界公式进行采样(lower-bound formulation for sampling),并严格遵循DDPM(denoising diffusion probabilistic models)论文中的算法1,这使得它非常简短,易于理解。有两种实现:条件和无条件(conditional and unconditional )。此外,条件的代码还实现了分类器自由引导( Classifier-Free-Guidance,CFG)和指数移动平均( Classifier-Free-Guidance,EMA)。你可以从下面两个视频中的解释,理解扩散模型背后的理论和实现。

一、复制环境代码

复制项目代码:

git clone https://github.com/dome272/Diffusion-Models-pytorch.git

使用env.yml创建项目环境:

conda env create -f env.yml

三、训练unconditional diffusion model

根据github的内容,训练所需的数据集,可以从以下链接中下载:

 

可以选择其中一种类型来下载,也可以选择下载全部,这与生成的图片内容有关。下载完成后,可以放在./dataset中。也可以分为./dataset/train, ./dataset/test。

然后将ddmp.py中的以下部分换成刚才数据集保存的路径,例如:

./dataset/train

 

对于GPU只有16G显存的设备,还需要将args.batch_size改小一些,比如:6。原来的batch_size为12会导致爆内存。

 

接下来,对ddpm.py的代码进行解析,以期了解diffusion模型结构。从train()函数开始。

def train(args):
    #创建models,results,run_name文件夹
    setup_logging(args.run_name)
    device = args.device
    #加载数据为dataloader
    dataloader = get_data(args)
    model = UNet().to(device)
    #AdamW是类似adam的优化器,但是好一些?对正则化处理更正确
    optimizer = optim.AdamW(model.parameters(), lr=args.lr)
    mse = nn.MSELoss()
    #扩散模型
    diffusion = Diffusion(img_size=args.image_size, device=device)
    #记录log
    logger = SummaryWriter(os.path.join("runs", args.run_name))
    l = len(dataloader)

    for epoch in range(args.epochs):
        logging.info(f"Starting epoch {epoch}:")
        pbar = tqdm(dataloader)
        for i, (images, _) in enumerate(pbar):
            images = images.to(device)
            #随机采样扩散步数
            t = diffusion.sample_timesteps(images.shape[0]).to(device)
            #添加噪声,也称向前过程
            x_t, noise = diffusion.noise_images(images, t)
            #预测噪声,也称逆向过程
            predicted_noise = model(x_t, t)
            #噪声损失
            loss = mse(noise, predicted_noise)

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            pbar.set_postfix(MSE=loss.item())
            logger.add_scalar("MSE", loss.item(), global_step=epoch * l + i)
        #扩单模型采样(生成)照片
        sampled_images = diffusion.sample(model, n=images.shape[0])
        save_images(sampled_images, os.path.join("results", args.run_name, f"{epoch}.jpg"))
        torch.save(model.state_dict(), os.path.join("models", args.run_name, f"ckpt.pt"))

在for循环迭代中,对于每一个图片样本,都使用了随机采样扩散步数(即噪声添加步数t),添加噪声,预测噪声t步,噪声损失的过程。在生成(sample)部分,基于已经带有噪声的X,先预测噪声,然后基于噪声和X计算真实的X。所以接下来仔细看看Diffusion模块,如何实现这些过程。

#扩散模型
class Diffusion:
    def __init__(self, noise_steps=1000, beta_start=1e-4, beta_end=0.02, img_size=256, device="cuda"):
        self.noise_steps = noise_steps
        self.beta_start = beta_start
        self.beta_end = beta_end
        self.img_size = img_size
        self.device = device

        self.beta = self.prepare_noise_schedule().to(device)
        self.alpha = 1. - self.beta
        #1-β累乘,其中每个元素的值等于其在x及之前所有元素的乘积
        self.alpha_hat = torch.cumprod(self.alpha, dim=0)

    def prepare_noise_schedule(self):
        #β,线性变化
        return torch.linspace(self.beta_start, self.beta_end, self.noise_steps)

    def noise_images(self, x, t):
         #添加噪声过程,向前过程,t步,由于高斯分布的特征不需要一步步添加。
         #根号下1-β的累乘
        sqrt_alpha_hat = torch.sqrt(self.alpha_hat[t])[:, None, None, None]
        #根号下1-(1-β)的累乘
        sqrt_one_minus_alpha_hat = torch.sqrt(1 - self.alpha_hat[t])[:, None, None, None]
        Ɛ = torch.randn_like(x)
        return sqrt_alpha_hat * x + sqrt_one_minus_alpha_hat * Ɛ, Ɛ

    def sample_timesteps(self, n):
        #随机添加噪声的步数
        return torch.randint(low=1, high=self.noise_steps, size=(n,))

    def sample(self, model, n):
        logging.info(f"Sampling {n} new images....")
        model.eval()
        with torch.no_grad():
            #随机初始化
            x = torch.randn((n, 3, self.img_size, self.img_size)).to(self.device)
            for i in tqdm(reversed(range(1, self.noise_steps)), position=0):
                t = (torch.ones(n) * i).long().to(self.device)
                #第t步的噪声,注意这里的t是从大到小的过程
                predicted_noise = model(x, t)
                alpha = self.alpha[t][:, None, None, None]
                alpha_hat = self.alpha_hat[t][:, None, None, None]
                beta = self.beta[t][:, None, None, None]
                if i > 1:
                    noise = torch.randn_like(x)
                else:
                    noise = torch.zeros_like(x)
                #还原样本
                x = 1 / torch.sqrt(alpha) * (x - ((1 - alpha) / (torch.sqrt(1 - alpha_hat))) * predicted_noise) + torch.sqrt(beta) * noise
        model.train()
        x = (x.clamp(-1, 1) + 1) / 2
        x = (x * 255).type(torch.uint8)
        return x

扩散模型的添加噪音过程是不需要一步步添加的,以下公式:

 

Xt为第t步的特征,可以直接表示为X0和高斯分布Z的叠加。所以显然这里不需要一步步叠加噪声。但是去噪过程需要一步步进行的。

由于这里没有采用下界公式进行采样(lower-bound formulation for sampling),所以这里的损失会简单一些,简化了,直接使用MSE损失。

以下是unconditional diffusion 的测试代码:

import os
import torch
import torch.nn as nn
from matplotlib import pyplot as plt
from tqdm import tqdm
from torch import optim
from utils import *
from modules import UNet
import logging

from ddpm import Diffusion

device = "cuda"
model = UNet().to(device)
ckpt = torch.load("unconditional_ckpt.pt")
model.load_state_dict(ckpt)
diffusion = Diffusion(img_size=64, device=device)
x = diffusion.sample(model, n=16)
plot_images(x)

生成的图片如下。质量还是比较差的,可能是模型没有训练好或者模型不完整的原因。

四、conditional diffusion model

train函数与unconditional的类似,不同的是,在预测噪声时候,是带有标签的,同时在采样时也需要有标签信息(标签和标签类别。)

def train(args):
	    setup_logging(args.run_name)
	    device = args.device
	    dataloader = get_data(args)
        # conditional 的UNet
	    model = UNet_conditional(num_classes=args.num_classes).to(device)
	    optimizer = optim.AdamW(model.parameters(), lr=args.lr)
	    mse = nn.MSELoss()
	    diffusion = Diffusion(img_size=args.image_size, device=device)
	    logger = SummaryWriter(os.path.join("runs", args.run_name))
	    l = len(dataloader)
	    ema = EMA(0.995)
	    ema_model = copy.deepcopy(model).eval().requires_grad_(False)
	
	    for epoch in range(args.epochs):
	        logging.info(f"Starting epoch {epoch}:")
	        pbar = tqdm(dataloader)
	        for i, (images, labels) in enumerate(pbar):
	            images = images.to(device)
	            labels = labels.to(device)
	            t = diffusion.sample_timesteps(images.shape[0]).to(device)
	            x_t, noise = diffusion.noise_images(images, t)
	            if np.random.random() < 0.1:
	                labels = None
                #预测噪声时,带有condition,即labels
	            predicted_noise = model(x_t, t, labels)
	            loss = mse(noise, predicted_noise)
	
	            optimizer.zero_grad()
	            loss.backward()
	            optimizer.step()
	            ema.step_ema(ema_model, model)
	
	            pbar.set_postfix(MSE=loss.item())
	            logger.add_scalar("MSE", loss.item(), global_step=epoch * l + i)
	
	        if epoch % 10 == 0:
	            labels = torch.arange(10).long().to(device)
	            sampled_images = diffusion.sample(model, n=len(labels), labels=labels)
	            ema_sampled_images = diffusion.sample(ema_model, n=len(labels), labels=labels)
	            plot_images(sampled_images)
	            save_images(sampled_images, os.path.join("results", args.run_name, f"{epoch}.jpg"))
	            save_images(ema_sampled_images, os.path.join("results", args.run_name, f"{epoch}_ema.jpg"))
	            torch.save(model.state_dict(), os.path.join("models", args.run_name, f"ckpt.pt"))
	            torch.save(ema_model.state_dict(), os.path.join("models", args.run_name, f"ema_ckpt.pt"))
	            torch.save(optimizer.state_dict(), os.path.join("models", args.run_name, f"optim.pt"))

conditional diffusion 模型的代码:与unconditional的不同,conditional diffusion在预测噪音是需要输入标签信息,同时使用unconditional的噪音,进行线性插值,获得用于复原样本的噪音。

class Diffusion:
    def __init__(self, noise_steps=1000, beta_start=1e-4, beta_end=0.02, img_size=256, device="cuda"):
        self.noise_steps = noise_steps
        self.beta_start = beta_start
        self.beta_end = beta_end

        self.beta = self.prepare_noise_schedule().to(device)
        self.alpha = 1. - self.beta
        self.alpha_hat = torch.cumprod(self.alpha, dim=0)

        self.img_size = img_size
        self.device = device

    def prepare_noise_schedule(self):
        return torch.linspace(self.beta_start, self.beta_end, self.noise_steps)

    def noise_images(self, x, t):
        sqrt_alpha_hat = torch.sqrt(self.alpha_hat[t])[:, None, None, None]
        sqrt_one_minus_alpha_hat = torch.sqrt(1 - self.alpha_hat[t])[:, None, None, None]
        Ɛ = torch.randn_like(x)
        return sqrt_alpha_hat * x + sqrt_one_minus_alpha_hat * Ɛ, Ɛ

    def sample_timesteps(self, n):
        return torch.randint(low=1, high=self.noise_steps, size=(n,))

    def sample(self, model, n, labels, cfg_scale=3):
        logging.info(f"Sampling {n} new images....")
        model.eval()
        with torch.no_grad():
            x = torch.randn((n, 3, self.img_size, self.img_size)).to(self.device)
            for i in tqdm(reversed(range(1, self.noise_steps)), position=0):
                t = (torch.ones(n) * i).long().to(self.device)
                predicted_noise = model(x, t, labels)
                if cfg_scale > 0:
                    uncond_predicted_noise = model(x, t, None)
                    #基于没有条件的噪音,带条件的噪音,类别信息进行线性插值,生成条件噪音
                    predicted_noise = torch.lerp(uncond_predicted_noise, predicted_noise, cfg_scale)
                alpha = self.alpha[t][:, None, None, None]
                alpha_hat = self.alpha_hat[t][:, None, None, None]
                beta = self.beta[t][:, None, None, None]
                if i > 1:
                    noise = torch.randn_like(x)
                else:
                    noise = torch.zeros_like(x)
                x = 1 / torch.sqrt(alpha) * (x - ((1 - alpha) / (torch.sqrt(1 - alpha_hat))) * predicted_noise) + torch.sqrt(beta) * noise
        model.train()
        x = (x.clamp(-1, 1) + 1) / 2
        x = (x * 255).type(torch.uint8)
        return x

基于上述内容,可以发现,扩散模型中的Unet模型是用来预测噪音的,而不是直接生成图片,这一点与其他的生成模型不同。

conditional diffusion 的测试代码(conditional_model_test.py):

import os
import torch
import torch.nn as nn
from matplotlib import pyplot as plt
from tqdm import tqdm
import os
import copy
import numpy as np
import torch
import torch.nn as nn
from tqdm import tqdm
from torch import optim
from utils import *
from modules import UNet_conditional, EMA
import logging

from ddpm_conditional import Diffusion

n = 10
device = "cuda"
model = UNet_conditional(num_classes=10).to(device)
ckpt = torch.load("conditional_ema_ckpt.pt")
model.load_state_dict(ckpt)
diffusion = Diffusion(img_size=64, device=device)
y = torch.Tensor([6] * n).long().to(device)
x = diffusion.sample(model, n, y, cfg_scale=3)
plot_images(x, 'conditional_ema_test')

生成的图片如下:

看起来还像那么回事。

整个项目代码,可以从百度网盘上下载:

 我通过百度网盘分享的文件:Diffusio....zip
链接:https://pan.baidu.com/s/1wm-ITu_q_kNQ8f2euovHfg 
提取码:4896 
复制这段内容打开「百度网盘APP即可获取」

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Diffusion Models 简单代码示例 的相关文章

  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • 比尔盖茨与萨姆.奥尔特曼的对话及感想

    谈话内容 比尔 盖茨 嘿 萨姆 萨姆 奥尔特曼 嘿 比尔 比尔 盖茨 你好吗 萨姆 奥尔特曼 哦 天哪 这真的太疯狂了 我还好 这是一个非常激动人心的时期 比尔 盖茨 团队情况怎么样 萨姆 奥尔特曼 我想 你知道很多人都注意到了这样一个事实
  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

    传统搜索系统基于关键字匹配 在面向 游戏攻略 技术图谱 知识库等业务场景时 缺少对用户问题理解和答案二次处理能力 本文探索使用大语言模型 Large Language Model LLM 通过其对自然语言理解和生成的能力 揣摩用户意图 并对
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 用CHAT写一份标题为职业教育教师教学能力提升培训总结

    CHAT回复 标题 职业教育教师教学能力提升培训总结 一 活动概述 本次由学校组织的职业教育教师教学能力提升培训于8月15日至8月20日顺利进行 来自全校的60位职业教育教师参与了此次培训 主讲人为享有盛名的教育专家马丁先生 二 培训内容与
  • Soul App:年轻人的社交状态,还有多少种可能?

    查尔斯 狄更斯在 双城记 的开篇写下 这是最好的时代 这是最坏的时代 这是智慧的时代 这是愚蠢的时代 这是信仰的时期 这是怀疑的时期 人们面前有着各样事物 人们面前一无所有 既然万事万物都和狄更斯所说般 好坏参半 那又何必执着于过去 苦恼于
  • 基于java的ssh医院在线挂号系统设计与实现

    基于java的ssh医院在线挂号系统设计与实现 I 引言 A 研究背景和动机 基于Java的SSH医院在线挂号系统设计与实现的研究背景和动机 随着信息技术的迅速发展和应用 医院在线挂号系统已成为医院管理的重要组成部分 传统的挂号方式存在许多
  • 让CHAT介绍下V2ray

    CHAT回复 V2Ray是一个网络工具 主要用于科学上网和保护用户的网络安全 它的名字源自Vmess Ray 光线 通过使用新的网络协议 为用户提供稳定且灵活的代理服务 下面是一些V2Ray的主要特性 1 多协议支持 V2Ray 提供了大量
  • 毕业设计:基于卷积神经网络的验证码识别系统 机器视觉 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 字符分割算法 2 2 深度学习 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 【毕业设计选题】复杂背景下的无人机(UVA)夜间目标检测系统 python 人工智能 深度学习

    前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大家顺利通过和节省时间
  • 台积电再被坑,2纳米光刻机优先给Intel和三星,美国太霸道了

    外媒指出今年ASML的10台2纳米光刻机分配已经基本确定了 Intel拿到6台 三星获得3台 台积电只能得到一台 考虑到美国对ASML的强大影响力 外媒的这些消息应该有较高的可信性 Intel在先进工艺制程方面 自从2014年量产14纳米之
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

    检索增强生成 Retrieval Augmented Generation RAG 是一种结合了检索 Retrieval 和生成 Generation 的技术 它有效地解决了大语言模型 LLM 的一些问题 比如幻觉 知识限制等 随着 RAG
  • AI在保护环境、应对气候变化中的作用

    对于AI生命周期数据领域的全球领导者而言 暂时搁置我们惯常的AI见解和AI生命周期数据内容产出 来认识诸如世界地球日这样的自然环境类活动日 似乎是个奇怪的事情 我们想要知道 数据是否真的会影响我们的地球环境 简而言之 是 确实如此 但作为一
  • AI在广告中的应用——预测性定位和调整

    营销人员的工作就是在恰当的时间将适合的产品呈现在消费者面前 从而增加他们购买的可能性 随着时间的推移 营销人员能够深入挖掘越来越精准的客户细分市场 他们不仅具备了实现上述目标的能力 而且这种能力还在呈指数级提升 在AI技术帮助下 现在的营销
  • 回望计算机视觉会议ICCV的31年

    作者 原野寻踪 编辑 汽车人 原文链接 https zhuanlan zhihu com p 670393313 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 本文只做
  • 史上最全自动驾驶岗位介绍

    作者 自动驾驶转型者 编辑 汽车人 原文链接 https zhuanlan zhihu com p 353480028 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 本
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 深度学习(5)--Keras实战

    一 Keras基础概念 Keras是深度学习中的一个神经网络框架 是一个高级神经网络API 用Python编写 可以在TensorFlow CNTK或Theano之上运行 Keras优点 1 允许简单快速的原型设计 用户友好性 模块化和可扩

随机推荐

  • 求集合的所有子集的算法(C++)

    求集合的所有子集的算法 对于任意集合A 元素个数为n 空集n 0 其所有子集的个数为2 n个 如集合A a b c 其子集个数为8 对于任意一个元素 在每个子集中 要么存在 要么不存在 对应关系是 a gt 1或a gt 0 b gt 1或
  • linux网络摄像头服务器,网络摄像头Logitech和Linux

    我有罗技c310相机 宣称的特点是720p30fps 如果您将相机连接到Windows 则记录与所述720p 30fps完全一致 图片清晰 挑战是将同一个摄像头连接到Orangepi 服务器Armbian 并在其上保存视频文件 相机显示为
  • 区块链:一场始料未及的革命

    当主流媒体还在忙于猜测加密货币价格及其黑市阴谋时 他们已经遗漏了这一切的本质事实 那就是 密码学家们悄然发明了一套全新的技术原型 Unitimes特约作者Haseeb Qureshi在其文章 区块链 一场始料未及的革命 Blockchain
  • Qt-OpenCV学习笔记--图像的腐蚀--erode()

    概述 通过一个特定的结构元素 腐蚀 一个图像 图像腐蚀的过程类似于一个卷积的过程 源图像矩阵A以及结构元素B B在A矩阵上依次移动 每个位置上B所覆盖元素的最小值替换B的中心位置值 即锚点处 完成整个腐蚀的过程 算法通俗理解 其运算过程就是
  • 如何科学进行用户分析?六大方法论了解一下!

    用户研究是用户中心的设计流程中的第一步 它是一种理解用户 将他们的目标 需求与商业宗旨相匹配的理想方法 能够帮助企业定义产品的目标用户群 在用户研究过程中 数据的使用及挖掘是非常重要的 那么 有哪些通用的用户分析方法 如何分析你的用户 本篇
  • verilog 产生16进制递增bin文件

    https verificationacademy com forums systemverilog how do i write binary dump file array my testbench w 写 r 读 a 追加 b 二进制
  • 手把手教你搞定 微信支付 跳出微信支付的坑 (公众号支付,核心代码可以用于小程序支付)

    1 准备工作 设置支付目录 请确保实际支付时的请求目录与后台配置的目录一致 否则将无法成功唤起微信支付 在微信商户平台 pay weixin qq com 设置您的公众号支付支付目录 设置路径 商户平台 gt 产品中心 gt 开发配置 如下
  • 2013年11月22日星期五(T3DLIB1剩余---1)

    现在进行T3DLIB的残余 define SCREEN DARKNESS 0 define SCREEN WHITENESS 1 define SCREEN SWIPE X 2 define SCREEN SWIPE Y 3 define
  • 【计算机网络】物理层:物理层要解决哪些问题?

    物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流 而不是具体的传输媒体 现有的计算机网络中的硬件设备和传输媒体的种类非常繁多 而通信手段也有许多不同方式 物理层的作用是尽可能屏蔽这些差异 使物理层上面的数据链路层感觉不到这些
  • iptables需求:开启防火墙:可以正常使用ssh服务,dns服务, httpd服务,chrony服务, nfs服务安装

    1 iptables需求 开启防火墙 可以正常使用ssh服务 dns服务 httpd服务 chrony服务 nfs服务 安装 yum install y iptables services 关闭firewalld 开启iptables sy
  • git的代码撤销步骤

    工作区的代码撤销 1 git status 查看哪些文件是修改过的 2 git checkout 文件路径 让这个文件回到最近一次git commit或git add时的状态 git add到暂存区的代码要撤销 1 git reset HE
  • 时序预测

    时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 目录 时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 预测结果 基本介绍 模型结构 程序设计 参考资料 预测
  • MySQL数据库、表常用命令

    目录 一 数据库分类 1 关系型数据库 2 非关系型数据库 二 MySQL相关基础 三 MySQL数据库基础操作 1 显示数据库 2 创建数据库 3 删除数据库 4 使用数据库 四 常用数据类型 1 数值类型 2 字符串类型 3 日期类型
  • 【C51】单片机芯片之——图解74HC595

    第一部部分用于快速查阅使用 详细的使用见文章第二部分 引脚图 14脚 DS SER 串行数据输入引脚 13脚 OE 输出使能控制脚 它是低电才使能输出 所以接GND 12脚 RCK 存储寄存器时钟输入引脚 上升沿时 数据从移位寄存器转存带存
  • Maven依赖冲突

    An attempt was made to call a method that does not exist 依赖冲突完整报错如下 Description An attempt was made to call a method tha
  • 字符串04--左旋转字符串

    字符串04 左旋转字符串 jz43 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 汇编语言中有一种移位指令叫做循环左移 ROL 现在有个简单的任务 就是用字符串模拟这个指令的运算结果 对于一个给定的字符序列S 请你把其循环左
  • express和koa中的超时处理

    从某个话题中得到的灵感 这里做一个分享 http cnodejs org topic 592fdc2f03dba3510d8a62a0 59364c3b538dbcaa6bc7dd48 楼主遇到一个问题 如何管理express中的超时 ex
  • BigDecimal 精度问题

    BigDecimal 精度问题 在使用BigDecimal过程中 暂时遇到两个问题 都是精度问题 一个是精度丢失 一个是精度显示问题 精度丢失 BigDecimal创建对象有很多种方式 通过double类型去声明bigdecimal对象时
  • Hyperledger Fabric架构设计

    目录 1 逻辑架构 答疑 什么叫做背书策略 2 运行时架构 答疑 什么是锚节点 1 逻辑架构 Hyperledger Fabric从1 X开始 在扩展性及安全性方面有了很大的提升 且新增了诸多特性 多通道 支持多通道 提高隔离安全性 可插拔
  • Diffusion Models 简单代码示例

    一 关于Diffusion 模型的简单介绍 首先diffusion模型和VAE Flow Gan等模型类似 均属于生成模型 可以和GCN CNN等其他深度学习网络相结合 完成特定的生成任务 如下图 基于 GAN 生成模型 基于 VAE 的生