Python - PhotoMaker 初体验 - 快来 DIY 你的图像

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第1张图片

目录

一.引言

二.PhotoMaker 简介

1.算法流程

- 模型架构

- 数据生成

2.仿真生成

3.风格化生成

4.身份混合

三.PhotoMaker 初体验

1.环境搭建

- Conda Activate

- Pip Install

2.模型下载

- PhotoMaker CK

- SDXL RealVisXL_V3.0

3.测试流程

- Load Model

- Input Image

- Generation 

4.模型参数

- Total Args

- More Photos

- Realistic

- Fast Speed

5.模型实测

- 代码修改

- 运行日志

- 生成结果

- 显卡需求

四.总结


一.引言

上传一张照片,环游世界经典,穿梭赛博朋克,上述研究便是来自南开大学、腾讯等机构提出 PhotoMaker,这是一种高效的个性化文本到图像生成方法。

论文地址: PhotoMaker: Customizing Realistic Human Photos via Stacked ID Embedding

项目地址:https://github.com/TencentARC/PhotoMaker

论文于去年 12 月放出,前不久项目正式登陆 Github,PhotoMaker 除了生成逼真的人像,还能进行其他风格的生成,如草图、漫画、动画等。下面快来尝试下吧 !

二.PhotoMaker 简介

1.算法流程

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第2张图片

- 模型架构

◆ Image Encoder & Text Encoder

首先从文本编码器与图像编码器获取文本 Embedding 嵌入与图像的 Embedding 嵌入。

图像 Emb: imgae = "一个男士的图像" 结合训练集的男士头像融合生成

文本 Emb: text = "男士带着蓝色帽子",结合训练语料 text = "穿着西装,打着领带,翻领上有徽章" 融合生成

◆ MLPs & Stacked

接下来,我们沿着长度维度连接所有融合的嵌入,以形成堆叠的ID嵌入。类似于直接使用 Concat 融合特征。

◆ Diffusion Model

最后,我们将堆叠的 ID 嵌入提供给所有交叉关注层,以自适应地合并扩散模型中的 ID 内容。注意,尽管我们在训练过程中使用具有掩蔽背景的相同 ID 的图像,但我们可以在没有背景失真的情况下直接输入不同 ID 的图像来在推理过程中创建新的 ID。即 Photo 具备结合背景独立创新图像的能力。

- 数据生成

ImageDownloading - 下载相关人脸图像

FaceDetect And Filter - 人脸识别与过滤

ID Verification - 人脸核验,将相同人脸的图像 group by 为统一 ID

Cropping & Segmentation - 图像裁剪与分割,这一步同样基于 group by 的统一 ID

Captioning & Marking - 图像内容标识

2.仿真生成

Realistic generation,基于我们给定的参考图像中的 Face 以及描述,实现角色的穿梭。

3.风格化生成

Stylization generation,根据给定的参考人脸,生成不同风格的图像。

4.身份混合

Identity mixing 我们能够使用新的ID生成图像,同时保留输入身份特征。

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第3张图片

三.PhotoMaker 初体验

1.环境搭建

- Conda Activate

构建 Python 3.8 的环境:

conda create --name PhotoMaker python=3.8
conda activate PhotoMaker

- Pip Install

 安装项目所需依赖:

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

Tips:

安装 pytorch-cuda == 11.8 时会显示如下报错,这里可以查看本机 cuda 版本,满足则忽略:

nvcc --version

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第4张图片

2.模型下载

- PhotoMaker CK

from huggingface_hub import hf_hub_download
photomaker_path = hf_hub_download(repo_id="TencentARC/PhotoMaker", filename="photomaker-v1.bin", repo_type="model")

可以通过命令行或者 URL 下载: https://huggingface.co/TencentARC/PhotoMaker

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第5张图片

直接拿下:

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第6张图片

这里 photomaker-v1.bin 模型文件博主放到 ./models 文件夹下,需要先 mkdir:

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第7张图片

- SDXL RealVisXL_V3.0

除此之外还需下载图像生成的原始模型,这里下载 ReallVisXL_V3.0:

链接: https://huggingface.co/SG161222/RealVisXL_V3.0

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第8张图片

这个 Base 模型全部大小 20G,挂着慢慢拿下了,这里放置到 ./RealVisXL_V3.0 目录下:

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第9张图片

3.测试流程

- Load Model

import torch
import os
from diffusers.utils import load_image
from diffusers import EulerDiscreteScheduler
from photomaker.pipeline import PhotoMakerStableDiffusionXLPipeline

### Load base model
pipe = PhotoMakerStableDiffusionXLPipeline.from_pretrained(
    base_model_path,  # can change to any base model based on SDXL
    torch_dtype=torch.bfloat16, 
    use_safetensors=True, 
    variant="fp16"
).to(device)

### Load PhotoMaker checkpoint
pipe.load_photomaker_adapter(
    os.path.dirname(photomaker_path),
    subfolder="",
    weight_name=os.path.basename(photomaker_path),
    trigger_word="img"  # define the trigger word
)     

pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config)

### Also can cooperate with other LoRA modules
# pipe.load_lora_weights(os.path.dirname(lora_path), weight_name=lora_model_name, adapter_name="xl_more_art-full")
# pipe.set_adapters(["photomaker", "xl_more_art-full"], adapter_weights=[1.0, 0.5])

pipe.fuse_lora()

第一部分代码负责加载图像生成模型,这里我们使用 RealVisXL_V3.0,接着为模型挂在 Adapter 也就是论问题提到的 PhotoMaker 的 bin 文件,同时注意修改 device 变量,相当于要修改:

- bass_model_path、- photomaker_path 以及 device

- Input Image

### define the input ID images
input_folder_name = './examples/newton_man'
image_basename_list = os.listdir(input_folder_name)
image_path_list = sorted([os.path.join(input_folder_name, basename) for basename in image_basename_list])

input_id_images = []
for image_path in image_path_list:
    input_id_images.append(load_image(image_path))

这里使用 Git 仓库提供的 newton_man 的示例图像,可以看到其基于 list 读取,根据 README 的介绍,一个角色的图像越多,生成的会越精准或者和你的图像越像。下面看下示例的图像:

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第10张图片

一共四张,按照 0-3 排序,代码的策略也是基于 file_name sort: 

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第11张图片

- Generation 

# Note that the trigger word `img` must follow the class word for personalization
prompt = "a half-body portrait of a man img wearing the sunglasses in Iron man suit, best quality"
negative_prompt = "(asymmetry, worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), open mouth, grayscale"
generator = torch.Generator(device=device).manual_seed(42)
images = pipe(
    prompt=prompt,
    input_id_images=input_id_images,
    negative_prompt=negative_prompt,
    num_images_per_prompt=1,
    num_inference_steps=num_steps,
    start_merge_step=10,
    generator=generator,
).images[0]
gen_images.save('out_photomaker.png')

# 请注意,触发器单词 "img" 必须跟在类别单词后面才能进行个性化设置:

一个男人的半身像 img 戴着钢铁侠套装的太阳镜,质量最好

这里 Class Word 类别单词就是 a half-body portrait of a man 即一个男人半身像,img trigger 会基于这个类别 + img 后的个性化描述,结合你的 Input Image 的人脸,得到最终的任务效果:

4.模型参数

- Total Args

参数信息在 ./photomaker/pipeline.py 的文件里:

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第12张图片

- More Photos

Input Images 读取多张图片,通过上传更多定制角色的照片,可以提高身份的可信度。同时增加 Prompt 信息优化亚洲人脸,可以考虑在 Class Info 处添加 "Asian",例如 Asian Women img。

- Realistic

设置样式时,生成的脸看起来是否过于逼真,将样式强度调整为 30-50,数字越大,ID可信度越低,但样式化能力会更好。不过在参数列表中未找到该参数,只有一个 start_merge_step 提到了 Style strength。

- Fast Speed

为了获得更快的速度,请减少生成图像的数量 images 和采样步骤 sampling steps。但是,请注意,减少采样步骤可能会影响 ID 保真度。

5.模型实测

- 代码修改

vi run.py

把上面三部分的代码粘贴至 run.py 中,并 activate 激活我们的环境。 

device - 指定到对应设备,需自己添加该参数

base_model_path - 下载的生成模型地址

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第13张图片

photomaker_path - photomaker bin 文件地址

Python - PhotoMaker 初体验 - 快来 DIY 你的图像_第14张图片

num_steps - 生成步数

修改了这几处代码后,就可以进行测试了。

- 运行日志

python run.py

主要是读取两个模型,以及最终根据 num_steps 生成图像。

- 生成结果

这里我们修改 postive prompt,把半身男修改为全身:

prompt = "a man img wearing the sunglasses in Iron man suit, best quality"

左边是添加 half-body 修饰的,后面是未添加该修饰的,可以看到模型整体比较稳定: 

- 显卡需求

博主这里采用 Tesla V100-32 G,推理阶段显存占用约为 9G,理论上 4090 即可运行。

四.总结

上文整理了最新开源的 PhotoMaker 项目,整体来说还是非常友好,开箱即用,后续也可以再仔细钻研下不同的参数,修改 Prompt,构建更多个性化的 DIY 图像。

你可能感兴趣的:(深度学习,Python,PhotoMaker,Python,人工智能)