CSGO: Content-Style Composition in Text-to-Image Generation(代码的复现)

文章目录

  • CSGO简介
  • 论文的代码部署
    • 需要下载的模型权重:
    • 复现中存在的一些问题
  • 推理代码
  • 生成结果示意图

CSGO简介

CSGO: Content-Style Composition in Text-to-Image Generation(风格迁移)
本文是一篇风格迁移的论文:将内容参考图像和风格参考图像分别投影,然后注入到内容模块和风格模块,同时采用controlnet的方法将内容参考图像注入unet的上采样块当中。
在这里插入图片描述
github中项目的地址

论文的代码部署

需要下载的模型权重:

我们的方法与 SDXL、VAE、ControlNet 和图像编码器完全兼容。请下载它们并将它们放在 ./base_models 文件夹中。
按照readme里面的指引,下载到如下文件夹里面:

在这里插入图片描述

复现中存在的一些问题

①需要保证如下包的版本与readme一致

diffusers==0.25.1
torch==2.0.1
torchaudio==2.0.2
torchvision==0.15.2
transformers==4.40.2

② NotImplementedError: Cannot copy out of meta tensor; no data!
参考知乎这篇
大语言模型调用踩坑点记录
数据在显存和内存中切换,导致出问题(显存不够)
在这里插入图片描述
部分参数从gpu拷贝到cpu会报错,将改成low_cpu_mem_usage=False,可以正常推理

pipe = StableDiffusionXLControlNetPipeline.from_pretrained(base_model_path,controlnet=controlnet,torch_dtype=torch.float16,add_watermarker=False,use_safetensors=True,vae=vae,revision="fp16",##这个参数low_cpu_mem_usage=False)

③模型加载的问题
由于下载的模型权重都是fp16的格式的,然而这里模型的加载方式的参数是统一在最外面控制的,导致不同模型加载时,识别不了对应的模型文件:
加载模型是一些参数的设定

pipe = StableDiffusionXLControlNetPipeline.from_pretrained(base_model_path,controlnet=controlnet,torch_dtype=torch.float16,add_watermarker=False,#用safetensors格式的权重文件use_safetensors=True,vae=vae,revision="fp16",#device_map="auto"low_cpu_mem_usage=False)
#这两个参数同时为fp16才会去读fp16的文件revision="fp16"variant= "fp16"

④需要统一数据的数据类型
由于之前的文本编码器的权重读取的是fp32,导致后续出现数据的类型不相同不能做运算的情况。
将pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
base_model_path,
controlnet=controlnet,
torch_dtype=torch.float16,
add_watermarker=False,
use_safetensors=True,
vae=vae,
revision=“fp16”,
#device_map=“auto”
low_cpu_mem_usage=False

)中的.from_pretrained函数(这个函数在pipeline_utils.py文件夹里)进行修改,当模型是文本编码器时,修改传入的一些参数

 if name == "text_encoder":#如果是文本编码器,将varient设置为fp16variant = "fp16"if variant is not None:# for folder in os.listdir(cached_folder):folder_path = os.path.join(cached_folder, "text_encoder")is_folder = os.path.isdir(folder_path) and "text_encoder" in config_dictvariant_exists = is_folder and any(p.split(".")[1].startswith(variant) for p in os.listdir(folder_path))if variant_exists:model_variants["text_encoder"] = variantif name == "text_encoder_2":variant = "fp16"if variant is not None:# for folder in os.listdir(cached_folder):folder_path = os.path.join(cached_folder, "text_encoder_2")is_folder = os.path.isdir(folder_path) and "text_encoder_2" in config_dictvariant_exists = is_folder and any(p.split(".")[1].startswith(variant) for p in os.listdir(folder_path))if variant_exists:model_variants["text_encoder_2"] = variantloaded_sub_model = load_sub_model(library_name=library_name,class_name=class_name,importable_classes=importable_classes,pipelines=pipelines,is_pipeline_module=is_pipeline_module,pipeline_class=pipeline_class,torch_dtype=torch_dtype,provider=provider,sess_options=sess_options,device_map=device_map,max_memory=max_memory,offload_folder=offload_folder,offload_state_dict=offload_state_dict,model_variants=model_variants,name=name,from_flax=from_flax,variant=variant,low_cpu_mem_usage=low_cpu_mem_usage,cached_folder=cached_folder,revision=revision,)logger.info(f"Loaded {name} as {class_name} from `{name}` subfolder of {pretrained_model_name_or_path}.")

⑤推理代码中的风格图像和内容图像都要是两个图像,而给的代码中是一个文本,一个图像

## 注意这里的两个图片都要转化为图片的格式,论文给的推理代码一个是文本,另一个是
style_image = Image.open("/mnt/CSGO-main/assets/{}".format(style_name)).convert('RGB')
content_image = Image.open('/mnt/test/image/{}'.format(content_name)).convert('RGB')

推理代码

import randomimport torch
from ip_adapter.utils import BLOCKS as BLOCKS
from ip_adapter.utils import controlnet_BLOCKS as controlnet_BLOCKS
from PIL import Image
from diffusers import (AutoencoderKL,ControlNetModel,StableDiffusionXLControlNetPipeline,)
from ip_adapter import CSGO#device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")device = 'cuda:0'base_model_path =  "./base_models/stable-diffusion-xl-base-1.0"  
image_encoder_path = "./base_models/IP-Adapter/sdxl_models/image_encoder"
csgo_ckpt = "./CSGO/csgo4_32.bin"
pretrained_vae_name_or_path ='./base_models/vae'
controlnet_path = "./base_models/TTPLanet_SDXL_Controlnet_Tile_Realistic"
weight_dtype = torch.float16
weight_dtype = torch.float16vae = AutoencoderKL.from_pretrained(pretrained_vae_name_or_path,torch_dtype=torch.float16)
controlnet = ControlNetModel.from_pretrained(controlnet_path, torch_dtype=torch.float16,use_safetensors=True)def get_device_map():return 'cuda' if torch.cuda.is_available() else 'cpu'device = get_device_map()pipe = StableDiffusionXLControlNetPipeline.from_pretrained(base_model_path,controlnet=controlnet,torch_dtype=torch.float16,add_watermarker=False,use_safetensors=True,vae=vae,revision="fp16",## 这里要加这个代码,不然会报错,因为显存不够,然后导致数据在显存和内存之间转换,报错low_cpu_mem_usage=False
)
pipe.enable_vae_tiling()target_content_blocks = BLOCKS['content']
target_style_blocks = BLOCKS['style']
controlnet_target_content_blocks = controlnet_BLOCKS['content']
controlnet_target_style_blocks = controlnet_BLOCKS['style']csgo = CSGO(pipe, image_encoder_path, csgo_ckpt, device, num_content_tokens=4,num_style_tokens=32,target_content_blocks=target_content_blocks, target_style_blocks=target_style_blocks,controlnet_adapter=True,controlnet_target_content_blocks=controlnet_target_content_blocks,controlnet_target_style_blocks=controlnet_target_style_blocks,content_model_resampler=True,style_model_resampler=True,)style_name = 'img_0.png'
content_name = 's_01_e_26_shot_005126_005200.png'## 注意这里的两个图片都要转化为图片的格式,论文给的推理代码一个是文本,另一个是
style_image = Image.open("/mnt/CSGO-main/assets/{}".format(style_name)).convert('RGB')
content_image = Image.open('/mnt/test/image/{}'.format(content_name)).convert('RGB')num_sample=1
caption = ''
#写个循环,看看各个参数对生成图片的影响
while True:tem = 0for ccs in range(5, 11, 1):ccs = ccs * 0.1content_scale = random.uniform(0.6, 1.5)style_scale = random.uniform(0.5, 1)images = csgo.generate(pil_content_image= content_image, pil_style_image=style_image,prompt=caption,negative_prompt= "text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry",content_scale=1.0,style_scale=1.0,guidance_scale=10,num_images_per_prompt=num_sample,num_samples=1,num_inference_steps=50,seed=42,image=content_image.convert('RGB'),controlnet_conditioning_scale=0.6,)formatted_ccs = "{:.2f}".format(ccs)formatted_content_scale = "{:.2f}".format(content_scale)formatted_style_scale = "{:.2f}".format(style_scale)images[0].save(f"inference/ccs:{formatted_ccs}-cs:{formatted_content_scale}-ss:{formatted_style_scale}.png")tem = tem + 1if tem >= 100:break

生成结果示意图

风格参考图像
在这里插入图片描述

文本: a cat

生成的图像
在这里插入图片描述

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

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

相关文章

[nssround#4 swpu]1zweb

能上传文件和查看文件 非预期:出题人没有对读取文件做限制&#xff0c;导致了目录穿越&#xff0c;可直接读取flag 预期解如下&#xff1b; 首先读取index.php与upload.php php <?php //index.php class LoveNss{ public $ljt; public $dky; public $cmd;…

Jmeter命令监控CPU等指标

JMeter 命令行执行脚本得到的报告中&#xff0c;是没有CPU、内存使用率等监控数据的&#xff0c;但是可以使用JMeter插件帮忙。 一、下载jmeter-plugins-manager.jar 下载后将文件放到jmeter安装包lib/ext目录下。打开Jmeter》菜单栏》选项》Plugins Manager 二、安装PerfMon…

江协科技STM32学习- P32 MPU6050

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

原生html+js+css+php多图上传带预览可增删判断图片大小和后缀

原生htmljscssphp多图上传带预览可增删&#xff0c;前后端判断图片大小和后缀 源码来自AI&#xff0c;有改动&#xff0c;整合亲测可用 <?php // 设置允许的最大文件大小为 2MB $maxFileSize 2 * 1024 * 1024; $allowedExtensions [jpg, jpeg, png, gif];// 上传目录&am…

java设计模式之创建者模式(5种)

设计模式 软件设计模式&#xff0c;又称为设计模式&#xff0c;是一套被反复利用&#xff0c;代码设计经验的总结&#xff0c;他是在软件设计过程中的一些不断发生的问题&#xff0c;以及该问题的解决方案。 **创建者模式又分为以下五个模式&#xff1a;**用来描述怎么“将对象…

如何一键更换ppt模板?掌握这2个ppt技巧快速搞定!

每当要制作ppt&#xff0c;很多人会第一时间去搜刮各种ppt模板&#xff0c;有时我们找到了一份貌似符合需求的模板&#xff0c;等到了ppt制作环节&#xff0c;才发现离我们的预期相距甚远&#xff0c;做到一半的ppt如何换模板呢&#xff1f; 想要在中途更换ppt模板&#xff0c;…

操作系统笔记(五)信号量,经典的IPC问题(读写者问题...)

信号量 一个信号量是一个包含两部分内容的数据结构&#xff1a; (a) 一个整数计数器, COUNT (b) 一个记录阻塞进程ID的队列, Q 信号量有两个原子操作&#xff1a; UP(V操作&#xff09; 和 DOWN (P操作) DOWN(S): if (S.count > 0) S.count …

臻于智境 安全护航 亚信安全受邀出席新华三智算新品发布会

近日&#xff0c;紫光股份旗下新华三集团在北京隆重举办了主题为“乘势 进化 臻于智境”的新华三智算新品发布会。作为新华三集团的长期战略合作伙伴&#xff0c;亚信安全受邀参会&#xff0c;亚信安全CEO马红军出席发布仪式&#xff0c;并与来自各界的业界伙伴共同探讨智能化…

【解决】Ubuntu18.04 卸载python之后桌面异常且终端无法打开,重启后进入tty1,没有图形化界面

我因为python版本太过于混乱 &#xff08;都是为了学习os&#xff09; &#xff0c;3.6—3.9版本我都安装了&#xff0c;指向关系也很混乱&#xff0c;本着“重装是最不会乱”的原则&#xff0c;我把全部版本都卸载了。然后装了3.9 发现终端打不开了&#xff0c;火狐浏览器的图…

2-140 基于Solidworks和Matlab Simulink Simscape仿真的机器人手臂仿真

基于Solidworks和Matlab Simulink Simscape仿真的机器人手臂仿真&#xff0c;使用Simulink-Simscape Multibody模块&#xff0c;完成SW-Simscape-Multibody-Link-Plugin手臂仿真&#xff0c;通过调节关节实现手臂动作&#xff0c;并显示三坐标位置。程序已调通&#xff0c;可直…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做&#xff0c;记录一下开发项目用过的协议&#xff0c;项目中&#xff0c;大多是是实时显示播放的&#xff0c;通过私有协议&#xff0c;传输到上位机&#xff0c;实时播放&#xff0c;延时小于200ms&#xff0c;仿照这些协议&#xff0c;定义的数据格式。如果用这些协…

通过思维导图【脑图】梳理Java 开发技术栈

通过思维导图【脑图】梳理Java 开发技术栈 前言一、思维导图概述二、Java 开发技术栈1.整体脑图结构2.基础知识3.核心语法4.高级特性5.常用框架6.数据库7.算法8.设计模式9.最佳实践10.资源推荐 附思维导图原件总结我是将军我一直都在&#xff0c;。&#xff01; 前言 将军深刻…

Mac “屏幕保护程序启动或显示器关闭后需要密码“无效

屏幕保护程序启动或显示器关闭后需要密码只能选择“立即”的解决方法&#xff1a; 在 iPhone mirror中设置&#xff0c;每次询问权限。 参考&#xff1a;https://support.apple.com/en-us/120421

基于matlab的凸包(Convex Hull)算法理解与测试

基于matlab的凸包Convex Hull算法理解与测试 0 引言1 Graham扫描算法原理2 Graham扫描算法实现3 Graham扫描算法关键函数4 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb; 凸包算法是计算给定点集的最小凸包的一种算法。凸包是包含给定点集中所有点…

Conmi的正确答案——在Kibana中搜索Elasticsearch的索引

Elasticsearch版本&#xff1a;7.17.25 Kibana版本&#xff1a;7.17.25 0、进入首页 1、点击空间名“默”&#xff08;我的默认空间名就是“默认”&#xff09;&#xff1b; 2、点击气泡弹窗的“管理空间”进入管理页面&#xff1b; 3、点击“索引模式”&#xff0c;进入索引模…

QT访问数据库:应用提示Driver not loaded

在QT中运行完全正确错误截图 解决办法1 我用的是MySQL。我把libmysql.dll复制到应用程序的目录下&#xff0c;即可正常访问数据库。 解决办法2 bool open_work_db() {QString info "support drivers:";for (int i0; i<QSqlDatabase::drivers().size(); i){inf…

用图说明 CPU、MCU、MPU、SoC 的区别

CPU CPU 负责执行构成计算机程序的指令&#xff0c;执行这些指令所指定的算术、逻辑、控制和输入/输出&#xff08;I/O&#xff09;操作。 MCU (microcontroller unit) 不同的 MCU 架构如下&#xff0c;注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…

你需要了解的Android repo工具

在 Android 开发中&#xff0c;repo 是 Google 用来管理多 Git 仓库的一种工具。Android 项目代码由多个 Git 仓库组成&#xff0c;repo 提供了一个高效的机制来批量管理这些仓库&#xff0c;尤其适用于大型项目和团队协作。 1. 什么是 Repo 工具&#xff1f; repo 是一个基于…

尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记

#1024程序员节&#xff5c;征文# public/index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>redux</title></head><body><div id"root"></div></body> </html&…

Linux环境下Mongodb部署

文章目录 一、系统环境二、MongoDb安装添加MongoDB官方库安装MongoDB配置MongoDB 三、MongoDB常见操作四、MongoDB用户管理创建用户修改密码删除用户 五、启用安全控制六、备份与还原1. 备份2. 恢复 七、外部工具连接MongoDB 一、系统环境 CentOS Stream 9 64bit 二、MongoD…