AIGC笔记--基于Stable Diffusion实现图片的inpainting

1--完整代码

SD_Inpainting

2--简单代码

import PIL
import torch
import numpy as np
from PIL import Image
from tqdm import tqdm
import torchvision
from diffusers import AutoencoderKL, UNet2DConditionModel, DDIMScheduler
from transformers import CLIPTextModel, CLIPTokenizer# 预处理mask
def preprocess_mask(mask):mask = mask.convert("L") # 转换为灰度图: L = R * 299/1000 + G * 587/1000+ B * 114/1000。w, h = mask.size # 512, 512w, h = map(lambda x: x - x % 32, (w, h))  # resize to integer multiple of 32mask = mask.resize((w // 8, h // 8), resample = PIL.Image.NEAREST) # 64, 64mask = np.array(mask).astype(np.float32) / 255.0 # 归一化 64, 64mask = np.tile(mask, (4, 1, 1)) # 4, 64, 64mask = mask[None].transpose(0, 1, 2, 3)mask = 1 - mask  # repaint white, keep black # mask图中,mask的部分变为0mask = torch.from_numpy(mask)return mask# 预处理image
def preprocess(image):w, h = image.sizew, h = map(lambda x: x - x % 32, (w, h))  # resize to integer multiple of 32image = image.resize((w, h), resample=PIL.Image.LANCZOS)image = np.array(image).astype(np.float32) / 255.0image = image[None].transpose(0, 3, 1, 2)image = torch.from_numpy(image)return 2.0 * image - 1.0if __name__ == "__main__":model_id = "runwayml/stable-diffusion-v1-5" # online download# model_id = "/mnt/dolphinfs/hdd_pool/docker/user/hadoop-waimai-aigc/liujinfu/All_test/test0714/huggingface.co/runwayml/stable-diffusion-v1-5" # local path# 读取输入图像和输入maskinput_image = Image.open("./images/overture-creations-5sI6fQgYIuo.png").resize((512, 512))input_mask = Image.open("./images/overture-creations-5sI6fQgYIuo_mask.png").resize((512, 512))# 1. 加载autoencodervae = AutoencoderKL.from_pretrained(model_id, subfolder = "vae")# 2. 加载tokenizer和text encoder tokenizer = CLIPTokenizer.from_pretrained(model_id, subfolder = "tokenizer")text_encoder = CLIPTextModel.from_pretrained(model_id, subfolder = "text_encoder")# 3. 加载扩散模型UNetunet = UNet2DConditionModel.from_pretrained(model_id, subfolder = "unet")# 4. 定义noise schedulernoise_scheduler = DDIMScheduler(num_train_timesteps = 1000,beta_start = 0.00085,beta_end = 0.012,beta_schedule = "scaled_linear",clip_sample = False, # don't clip sample, the x0 in stable diffusion not in range [-1, 1]set_alpha_to_one = False,)# 将模型复制到GPU上device = "cuda"vae.to(device, dtype = torch.float16)text_encoder.to(device, dtype = torch.float16)unet = unet.to(device, dtype = torch.float16)# 设置prompt和超参数prompt = "a mecha robot sitting on a bench"negative_prompt = ""strength = 0.75guidance_scale = 7.5batch_size = 1num_inference_steps = 50generator = torch.Generator(device).manual_seed(0)with torch.no_grad():# get prompt text_embeddingstext_input = tokenizer(prompt, padding = "max_length", max_length = tokenizer.model_max_length, truncation = True, return_tensors = "pt")text_embeddings = text_encoder(text_input.input_ids.to(device))[0]# get unconditional text embeddingsmax_length = text_input.input_ids.shape[-1]uncond_input = tokenizer([negative_prompt] * batch_size, padding = "max_length", max_length = max_length, return_tensors = "pt")uncond_embeddings = text_encoder(uncond_input.input_ids.to(device))[0]# concat batchtext_embeddings = torch.cat([uncond_embeddings, text_embeddings])# 设置采样步数noise_scheduler.set_timesteps(num_inference_steps, device = device)# 根据strength计算timestepsinit_timestep = min(int(num_inference_steps * strength), num_inference_steps)t_start = max(num_inference_steps - init_timestep, 0)timesteps = noise_scheduler.timesteps[t_start:]# 预处理init_imageinit_input = preprocess(input_image)init_latents = vae.encode(init_input.to(device, dtype=torch.float16)).latent_dist.sample(generator)init_latents = 0.18215 * init_latentsinit_latents = torch.cat([init_latents] * batch_size, dim=0)init_latents_orig = init_latents# 处理maskmask_image = preprocess_mask(input_mask)mask_image = mask_image.to(device=device, dtype=init_latents.dtype)mask = torch.cat([mask_image] * batch_size)# 给init_latents加噪音noise = torch.randn(init_latents.shape, generator = generator, device = device, dtype = init_latents.dtype)init_latents = noise_scheduler.add_noise(init_latents, noise, timesteps[:1])latents = init_latents # 作为初始latents# Do denoise stepsfor t in tqdm(timesteps):# 这里latens扩展2份,是为了同时计算unconditional predictionlatent_model_input = torch.cat([latents] * 2)latent_model_input = noise_scheduler.scale_model_input(latent_model_input, t) # for DDIM, do nothing# 预测噪音noise_pred = unet(latent_model_input, t, encoder_hidden_states=text_embeddings).sample# Classifier Free Guidancenoise_pred_uncond, noise_pred_text = noise_pred.chunk(2)noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond)# x_t -> x_t-1latents = noise_scheduler.step(noise_pred, t, latents).prev_sample# 将unmask区域替换原始图像的nosiy latentsinit_latents_proper = noise_scheduler.add_noise(init_latents_orig, noise, torch.tensor([t]))# mask的部分数值为0# 因此init_latents_proper * mask为保留原始latents(不mask)# 而latents * (1 - mask)为用生成的latents替换mask的部分latents = (init_latents_proper * mask) + (latents * (1 - mask)) # 注意要对latents进行scalelatents = 1 / 0.18215 * latentsimage = vae.decode(latents).sample# 转成pillowimg = (image / 2 + 0.5).clamp(0, 1).detach().cpu()img = torchvision.transforms.ToPILImage()(img.squeeze())img.save("./outputs/output.png")print("All Done!")

运行结果:

3--基于Diffuser进行调用

import torch
import torchvision
from PIL import Image
from diffusers import StableDiffusionInpaintPipelineLegacyif __name__ == "__main__":# load inpainting pipelinemodel_id = "runwayml/stable-diffusion-v1-5"# model_id = "/mnt/dolphinfs/hdd_pool/docker/user/hadoop-waimai-aigc/liujinfu/All_test/test0714/huggingface.co/runwayml/stable-diffusion-v1-5" # local pathpipe = StableDiffusionInpaintPipelineLegacy.from_pretrained(model_id, torch_dtype = torch.float16).to("cuda")# load input image and input maskinput_image = Image.open("./images/overture-creations-5sI6fQgYIuo.png").resize((512, 512))input_mask = Image.open("./images/overture-creations-5sI6fQgYIuo_mask.png").resize((512, 512))# run inferenceprompt = ["a mecha robot sitting on a bench", "a cat sitting on a bench"]generator = torch.Generator("cuda").manual_seed(0)with torch.autocast("cuda"):images = pipe(prompt = prompt,image = input_image,mask_image = input_mask,num_inference_steps = 50,strength = 0.75,guidance_scale = 7.5,num_images_per_prompt = 1,generator = generator).images# 转成pillowfor idx, image in enumerate(images):image.save("./outputs/output_{:d}.png".format(idx))print("All Done!")

运行结果:

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

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

相关文章

【python】Pandas运行报错分析:SettingWithCopyWarning及其处理

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【k8s部署elasticsearch】k8s环境下安装elasticsearch集群和kibana

文章目录 简介一.条件及环境说明二.需求说明三.实现原理及说明四.详细步骤4.1.规划节点标签4.2.创建三个statefulset和service headless配置4.3.创建service配置 五.安装kibana六.调整索引分区七.安装说明 简介 k8s集群中搭建有elasticsearch服务一般都会用到pvc,但…

Linux中运用xsync实现免密集群分发

一、前言 今天搭建了三台虚拟机的集群,在集群中部分操作在三台虚拟机上的操作都一致,为了提高效率,就需要配置xsync实现集群分发。 二、设置免密登录 1.生成公钥和私钥 ssh-keygen -t rsa一直敲回车,会生成两个文件&#xff0c…

观察者模式的实现

引言:观察者模式——程序中的“通信兵” 在现代战争中,通信是胜利的关键。信息力以网络、数据、算法、算力等为底层支撑,在现代战争中不断推动感知、决策、指控等各环节产生量变与质变。在软件架构中,观察者模式扮演着类似的角色…

Go:基本变量与数据类型

目录 前言 前期准备 环境配置: Hello World! 一、基本变量 1.1 声明变量 1.2 初始化变量 1.3 变量声明到初始化的过程 1.4 变量值交换 1.5 匿名变量 1.6 变量的作用域 二、数据类型 1.1 整型 1.2 浮点型 1.3 字符串 1.4 布尔类型 1.5 数据类型判断…

STM32(五):STM32指南者-按键控制灯开关实验

说明:源代码和教程可从野火处下载,本博客为了记录学习过程STM32(四):STM32指南者-跑马灯实验的基础上 一、采用轮询方式1、bsp_key.h2、bsp_key.c3、main.c 二、采用中断方式1、bsp_exti.h2、bsp_exti.c3、stm32f10x_i…

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境,就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1)具体安装步骤操作即可: npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…

uniapp 微信小程序根据后端返回的文件链接打开并保存到手机文件夹中【支持doc、docx、txt、xlsx等类型的文件】

项目场景: 我们在使用uniapp官方提供的uni.downloadFile以及uni.saveFile时,会发现这个文件下载的默认保存位置和我们预想的不太一样,容易找不到,而且没有提示,那么我们就需要把文件打开自己保存并且有提示保存到哪个…

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言:本节主要讲解内核也就是操作系统对于硬件的管理, 本节内容同样为进程的周边知识。 主要是关于软件方面, 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章, 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…

Databend 开源周报第 153 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend。 支持必须更改密码…

【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)

​​​​​​​ 目录 一、引言 二、自动语音识别(automatic-speech-recognition) 2.1 概述 2.2 技术原理 2.2.1 whisper模型 2.2.2 Wav2vec 2.0模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数​​​​​​​ 2.3.2 pipeline对象使用参数…

JavaScript 匿名函数

https://andi.cn/page/621568.html

css的三大特性

一、层叠性, 选择器的优先级

Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器

章节内容 上节我们完成了: ZNode的基本介绍ZNode节点类型的介绍事务ID的介绍ZNode实机测试效果 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff…

FlinkErr:org/apache/hadoop/hive/ql/parse/SemanticException

在flink项目中跑 上面这段代码出现如下这个异常&#xff0c; java.lang.NoClassDefFoundError: org/apache/thrift/TException 加上下面这个依赖后不报错 <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId…

ORB_SLAM2 ORBSLAM2 Ubuntu18.04 ROS Melodic虚拟机镜像 下载

下图为build.sh和build_ros.sh的编译结果&#xff1a; 下面的视频是slam测试&#xff1a; orbslam2_test 下载地址&#xff08;付费资料&#xff0c;不能接受请勿浪费时间下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BCl_egUbNjM4nHc4DX4hkw?pwd…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中&#xff0c;渲染农场作为幕后英雄&#xff0c;以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统&#xff0c;通过独特的逐帧渲染策略&#xff0c;解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

FUSE使用总结

1.FUSE简介 由于近期一个项目用到FUSE实现一个文件系统&#xff0c;所以有一些使用FUSE的经验。现总结如下&#xff1a; FUSE&#xff08;Filesystem in Userspace&#xff09;是一个开源项目&#xff0c;它可以为用户提供编写用户态文件系统的接口。 运行架构如下&#xff1…

产品经理的AI大模型学习之旅

随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;正逐渐成为产品经理&#xff08;Product Manager, PM&#xff09;在产品开发过程中不可或缺的工具。大模型&#xff0c;尤其是语言模型&#xff0c;能够处理和理解自然语言&a…

GB35114控制信令认证流程

GB35114控制信令认证说明&#xff1a; 注册成功后,信令发送方与信令接收方进行交互时,采用基于带密钥的杂凑方式保障信令来源安 全&#xff61;对除REGISTER消息以外的消息做带密钥的杂凑&#xff61;启用Date字段,扩展信令消息头域,在头域中 增加 Note 字 段 (值 为 Digest…