最新虚拟试衣框架IMAGDressing模型部署

news2024/9/23 7:22:00

IMAGDressing是一个全新的虚拟试衣框架,它由南京理工大学、武汉理工大学、腾讯AI实验室和南京大学共同开发。

该项目旨在通过先进的技术提升消费者的在线购物体验,特别是通过虚拟试穿技术(VTON)来实现逼真的服装效果。

IMAGDressing定义了一个新的虚拟穿衣任务,专注于生成具有固定服装和可选条件的自由可编辑人物图像,同时设计了一种全面的亲和度指标来评估生成图像与参考服装之间的一致性。

此外,IMAGDressing-v1还结合了一个服装UNet,该UNet从CLIP捕获语义特征,从VAE捕获纹理特征,并引入了一个混合注意力模块,包括冻结的自注意力和可训练的交叉注意力,以将服装特征整合到冻结的去噪UNet中,确保用户可以通过文本控制不同的场景。

github项目地址:https://github.com/muzishen/IMAGDressing。

一、环境安装

1、python环境

建议安装python版本在3.10以上。

2、pip库安装

pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

3、IMAGDressing模型下载

git lfs install

git clone https://huggingface.co/feishen29/IMAGDressing

4、sd-vae-ft-mse模型下载

git lfs install

git clone https://huggingface.co/stabilityai/sd-vae-ft-mse

5、Realistic_Vision_V4.0_noVAE模型下载

git lfs install

git clone https://huggingface.co/SG161222/Realistic_Vision_V4.0_noVAE

6、IP-Adapter-FaceID模型下载

git lfs install

git clone https://huggingface.co/h94/IP-Adapter-FaceID

7、control_v11p_sd15_openpose模型下载

git lfs install

git clone https://huggingface.co/lllyasviel/control_v11p_sd15_openpose

8、IP-Adapter模型下载

git lfs install

git clone https://huggingface.co/h94/IP-Adapter

9、IDM-VTON模型下载

git lfs install

git clone https://huggingface.co/spaces/yisol/IDM-VTON

、功能测试

1、命令行运行测试

(1)指定服装的python代码测试

import os
import torch
from PIL import Image
from diffusers import UNet2DConditionModel, AutoencoderKL, DDIMScheduler
from torchvision import transforms
from transformers import CLIPImageProcessor
from diffusers.pipelines.stable_diffusion import StableDiffusionSafetyChecker
from transformers import CLIPTextModel, CLIPTokenizer, CLIPVisionModelWithProjection
from adapter.attention_processor import CacheAttnProcessor2_0, RefSAttnProcessor2_0, CAttnProcessor2_0
import argparse
from adapter.resampler import Resampler
from dressing_sd.pipelines.IMAGDressing_v1_pipeline import IMAGDressing_v1

def resize_img(input_image, max_side=640, min_side=512, size=None,
               pad_to_max_side=False, mode=Image.BILINEAR, base_pixel_number=64):
    w, h = input_image.size
    ratio = min_side / min(h, w)
    w, h = round(ratio * w), round(ratio * h)
    ratio = max_side / max(h, w)
    input_image = input_image.resize([round(ratio * w), round(ratio * h)], mode)
    w_resize_new = (round(ratio * w) // base_pixel_number) * base_pixel_number
    h_resize_new = (round(ratio * h) // base_pixel_number) * base_pixel_number
    input_image = input_image.resize([w_resize_new, h_resize_new], mode)
    return input_image

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows * cols
    w, h = imgs[0].size
    grid = Image.new("RGB", size=(cols * w, rows * h))
    grid_w, grid_h = grid.size
    for i, img in enumerate(imgs):
        grid.paste(img, box=(i % cols * w, i // cols * h))
    return grid

def prepare(args):
    generator = torch.Generator(device=args.device).manual_seed(42)
    vae = AutoencoderKL.from_pretrained("path/to/sd-vae-ft-mse").to(dtype=torch.float16, device=args.device)
    tokenizer = CLIPTokenizer.from_pretrained("path/to/Realistic_Vision_V4.0_noVAE", subfolder="tokenizer")
    text_encoder = CLIPTextModel.from_pretrained("path/to/Realistic_Vision_V4.0_noVAE", subfolder="text_encoder").to(dtype=torch.float16, device=args.device)
    image_encoder = CLIPVisionModelWithProjection.from_pretrained("path/to/IP-Adapter", subfolder="models/image_encoder").to(dtype=torch.float16, device=args.device)
    unet = UNet2DConditionModel.from_pretrained("path/to/Realistic_Vision_V4.0_noVAE", subfolder="unet").to(dtype=torch.float16, device=args.device)

    image_proj = Resampler(dim=unet.config.cross_attention_dim, depth=4, dim_head=64, heads=12, num_queries=16, embedding_dim=image_encoder.config.hidden_size, output_dim=unet.config.cross_attention_dim, ff_mult=4).to(dtype=torch.float16, device=args.device)

    attn_procs = {}
    for name in unet.attn_processors.keys():
        cross_attention_dim = None if name.endswith("attn1.processor") else unet.config.cross_attention_dim
        if name.startswith("mid_block"):
            hidden_size = unet.config.block_out_channels[-1]
        elif name.startswith("up_blocks"):
            block_id = int(name[len("up_blocks.")])
            hidden_size = list(reversed(unet.config.block_out_channels))[block_id]
        elif name.startswith("down_blocks"):
            block_id = int(name[len("down_blocks.")])
            hidden_size = unet.config.block_out_channels[block_id]
        if cross_attention_dim is None:
            attn_procs[name] = RefSAttnProcessor2_0(name, hidden_size)
        else:
            attn_procs[name] = CAttnProcessor2_0(name, hidden_size=hidden_size, cross_attention_dim=cross_attention_dim)
    unet.set_attn_processor(attn_procs)
    adapter_modules = torch.nn.ModuleList(unet.attn_processors.values()).to(dtype=torch.float16, device=args.device)

    ref_unet = UNet2DConditionModel.from_pretrained("path/to/Realistic_Vision_V4.0_noVAE", subfolder="unet").to(dtype=torch.float16, device=args.device)
    ref_unet.set_attn_processor({name: CacheAttnProcessor2_0() for name in ref_unet.attn_processors.keys()})

    model_sd = torch.load(args.model_ckpt, map_location="cpu")["module"]

    ref_unet_dict = {}
    unet_dict = {}
    image_proj_dict = {}
    adapter_modules_dict = {}
    for k, v in model_sd.items():
        if k.startswith("ref_unet"):
            ref_unet_dict[k.replace("ref_unet.", "")] = v
        elif k.startswith("unet"):
            unet_dict[k.replace("unet.", "")] = v
        elif k.startswith("proj"):
            image_proj_dict[k.replace("proj.", "")] = v
        elif k.startswith("adapter_modules"):
            adapter_modules_dict[k.replace("adapter_modules.", "")] = v

    ref_unet.load_state_dict(ref_unet_dict)
    image_proj.load_state_dict(image_proj_dict)
    adapter_modules.load_state_dict(adapter_modules_dict)

    noise_scheduler = DDIMScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", steps_offset=1)

    pipe = IMAGDressing_v1(unet=unet, reference_unet=ref_unet, vae=vae, tokenizer=tokenizer,
                         text_encoder=text_encoder, image_encoder=image_encoder,
                         ImgProj=image_proj, scheduler=noise_scheduler,
                         safety_checker=StableDiffusionSafetyChecker,
                         feature_extractor=CLIPImageProcessor())
    return pipe, generator

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='IMAGDressing_v1')
    parser.add_argument('--model_ckpt', default="path/to/IMAGDressing-v1_512.pt", type=str)
    parser.add_argument('--cloth_path', type=str, required=True)
    parser.add_argument('--output_path', type=str, default="./output_sd_base")
    parser.add_argument('--device', type=str, default="cuda:0")
    args = parser.parse_args()

    output_path = args.output_path
    os.makedirs(output_path, exist_ok=True)

    pipe, generator = prepare(args)
    print('====================== Pipe loaded successfully ===================')

    num_samples = 1
    clip_image_processor = CLIPImageProcessor()

    img_transform = transforms.Compose([
        transforms.Resize([640, 512], interpolation=transforms.InterpolationMode.BILINEAR),
        transforms.ToTensor(),
        transforms.Normalize([0.5], [0.5]),
    ])

    prompt = 'A beautiful woman, best quality, high quality'
    null_prompt = ''
    negative_prompt = 'bare, naked, nude, undressed, monochrome, lowres, bad anatomy, worst quality, low quality'

    clothes_img = Image.open(args.cloth_path).convert("RGB")
    clothes_img = resize_img(clothes_img)
    vae_clothes = img_transform(clothes_img).unsqueeze(0).to(args.device)
    ref_clip_image = clip_image_processor(images=clothes_img, return_tensors="pt").pixel_values.to(args.device)

    output = pipe(ref_image=vae_clothes, prompt=prompt, ref_clip_image=ref_clip_image, null_prompt=null_prompt, negative_prompt=negative_prompt, width=512, height=640, num_images_per_prompt=num_samples, guidance_scale=7.5, image_scale=1.0, generator=generator, num_inference_steps=50).images

    save_output = [clothes_img.resize((512, 640), Image.BICUBIC)]
    save_output.append(output[0])

    grid = image_grid(save_output, 1, 2)
    grid.save(os.path.join(output_path, os.path.basename(args.cloth_path)))

未完......

更多详细的内容欢迎关注:杰哥新技术

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

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

相关文章

QT界面布局

目录 界面布局 静态布局 动态布局 界面布局 静态布局 静态布局指的是在设计时固定每个控件(如按钮、文本框等)的位置和大小,无论窗口大小如何变化,控件的位置和大小都不会改变。 动态布局 动态布局指的是控件的位置和大小可…

【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐

战神3是圣莫尼卡公司的大作,PS3 上必玩的游戏之一。 本文收集了战神3和升天两作,附存档,完美不死机,没有BUG,强烈推荐。 解压即玩。 立即下载:【chumenx.com】【解压既玩】PS3模拟器v0.0.32战神3战神升天…

VisionPro二次开发学习笔记9-使用 CogRecordDisplay控件

使用 CogRecordDisplay控件 这个示例展示了如何使用 CogRecordDisplay 在表单上显示 Blob Tool 的 LastRunRecord 图形。 它还演示了如何通过 BlobTool 的 LastRunRecordEnable 属性有选择性地启用或禁用不同的图形特性。这个模式可以应用于所有 VisionPro 工具。 具体步骤如…

实验25.创建文件

已完成实验 已完成实验链接 简介 实验 25. 创建文件 总结 inode 就是文件 i_no 就是 inode 号i_sectors 是块地址数组,表示这个文件的内容是那些块构成的.如果是文件,那么块的内容是文件的内容如果是目录,那么这些块的内容是一个个目录项 dir_entry 目录项 是目录文件的…

思科CCIE最新考证流程

CCIE CCIE,全称Cisco Certified Internetwork Expert,是美国Cisco公司于1993年开始推出的专家级认证考试。被全球公认为IT业最权威的认证,是全球Internetworking领域中最顶级的认证证书。 CCIE方向 CCIE主要有六大方向:企业基础架构Enterp…

JDK源码——Atomic包(一)

包介绍 JDK的atomic包提供了一组原子类,用于多线程环境中的原子操作,确保线程安全和高性能。 Atomic包是Java在并发编程中的重要工具,它利用CAS(Compare-And-Swap)机制保证操作的原子性,同时避免了重量级…

3.Redis数据类型(二)

LIST List 是一个简单的双向链表,支持从两端进行插入和删除操作。 常用命令: lpush/rpush/lrange lpush 插入一个或多个元素到列表的左端。 rpush 插入一个或多个元素到列表的右端。 lrange key start stop 获取元素(前闭后闭&#xff0…

构建可刷卡手持终端,思路与必备元素剖析-SAAS 本地化及未来之窗行业应用跨平台架构

构建可刷卡手持终端,思路与必备元素剖析 一、终端开发必要性 1.终端携带方便,适合空间小,外出 2.可供电,外带设备比较方便 3.大多数终端可以不需要网络独立使用,适合特殊场景 二、终端软件爱基本功能 1.便捷的终端…

Java重修笔记 第三十天 异常

异常的分类 1. Error(错误):Java虚拟机无法解决的致命问题,例如StackOverflowError[栈溢出] 2. Exception(异常):其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性…

【iOS多线程(四)】线程安全+13种锁

线程安全13种锁 线程安全1. 为什么要线程安全出现线程安全的原理解决方法 2. 自旋锁和互斥锁自旋锁(Spin lock)互斥锁两种锁的加锁原理对比两种锁的应用 3. 13种锁1. OSSpinLock (已弃用)2. os_unfair_lock3.pthread_mutex 4. NSLock5. NSRecursiveLock6. NSConditi…

C++ IOStream

IOStream 类流特性 不可赋值和复制缓冲重载了<< >> 状态位 示例 状态位操作函数coutcin getget(s,n)/get(s,n,d):getline otherif(!fs)/while(cin) operator void*()与 operator!()代码示例 File Stream open 函数 文件打开方式 文件读写 读写接口 一次读一个字符…

SpringBoot学习之EasyExcel解析合并单元格(三十九)

本解析主要采用反射来修改EasyExcel 返回的默认数据结构实现。 一、待解析表格 二、依赖 全部pom.xml文件如下,仅作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

LLM - 使用 HuggingFace + Ollama 部署最新大模型 (GGUF 格式 与 Llama 3.1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141028040 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ollama…

创建一个自己的列表窗口

文章目录 背景&#xff1a;在QT的设计中&#xff0c;对于控件库提供的控件满足不了项目的需求&#xff0c;就像自定义一些控件&#xff0c;本文是自定义一个列表窗口。效果展示 一、创建基本的QT模板&#xff1a;1.创建mainwindow2.创建VerticalTextDelegate 二&#xff1a; 插…

零拷贝的发展历程

零拷贝 零拷贝是指计算机执行 IO 操作时&#xff0c;CPU 不需要将数据从一个存储区域复制到另一个存储区域&#xff0c;从而可以减少上下文切换以及 CPU的拷贝时间。它是一种I/O 操作优化技术。 传统IO的执行流程&#xff1a;传统的 IO 流程&#xff0c;包括 read 读 和 write…

2024.8.08(python)

一、搭建python环境 1、检查是否安装python [rootpython ~]# yum list installed | grep python [rootpython ~]# yum list | grep python3 2、安装python3 [rootpython ~]# yum -y install python3 安装3.12可以使用源码安装 3、查看版本信息 [rootpython ~]# python3 --vers…

C++(类和对象.下)

类型转换 先给出以下代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; class B { private:int _a1; public:B(int a){_a1 a;}void Print() {cout << _a1<< endl;} }; int main() {//实例化对象1B b(1);b.Pri…

video-retalking部署安装,在服务器Ubuntu22.04系统下

video-retalking部署安装&#xff0c;在服务器Ubuntu22.04系统下 一、ubuntu基本环境配置1.更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安装CUDA2.5 环境变量配置 二、安…

基于YOLOv10深度学习的交通信号灯检测识别系统【python源码+Pyqt5界面+数据集+训练代码】红绿灯检测、目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

易语言窗口1以及其它子窗口在任务栏显示的方法以及源代码

大家都知道在启动子程序中载入窗口里&#xff0c;窗口就不在任务栏中显示了 用什么办法可以解决这个问题呢 本例程教源码教你如何解决