赞
踩
之前介绍了一下论文:
https://qq742971636.blog.csdn.net/article/details/137224151
代码仓库:
https://github.com/tencent-ailab/IP-Adapter.git
模型文件仓库:
https://huggingface.co/h94/IP-Adapter-FaceID
模型文件仓库:
https://huggingface.co/h94/IP-Adapter
python3.10环境:
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
pip install diffusers --upgrade
pip install -U controlnet_aux==0.0.7 # for conditioning models and detectors
pip install transformers accelerate safetensors
pip install insightface==0.7.3
pip install onnxruntime einops peft
pip install jupyter
git clone https://huggingface.co/h94/IP-Adapter-FaceID
git clone https://github.com/tencent-ailab/IP-Adapter.git
# 然后把IP-Adapter-FaceID里面的文件全部弄到IP-Adapter文件夹中去
cd IP-Adapter
vim __init__.py # 创建一个这个文件,空的即可
cd IP-Adapter
git clone https://huggingface.co/h94/IP-Adapter
# 然后把模型文件全给到IP-Adapter工程
将 majicmixRealistic_v7 转为diffusers文件:
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com" # 设置 HF 镜像源(国内用户使用)
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 设置 GPU 所使用的节点
import torch
from diffusers import StableDiffusionXLPipeline, StableDiffusionPipeline
def convert_sdxl_to_diffusers(pretrained_ckpt_path, output_diffusers_path):
pipe = StableDiffusionXLPipeline.from_single_file(pretrained_ckpt_path, torch_dtype=torch.float16).to("cuda")
pipe.save_pretrained(output_diffusers_path)
# pipe = StableDiffusionPipeline.from_single_file(pretrained_ckpt_path, torch_dtype=torch.float16).to("cuda")
# pipe.save_pretrained(output_diffusers_path)
if __name__ == '__main__':
convert_sdxl_to_diffusers("/ssd/xiedong/sdmodels/sd_xl_base_1.0_0.9vae.safetensors",
"/ssd/xiedong/sdmodels/sd_xl_base_1.0_0.9vae.safetensors_diffusers")
在上次尝试中,效果不是很好,再次用Jupyter尝试一下原git仓库的代码。
pip install jupyter
pip install jupyterlab
执行:
jupyter notebook --ip=0.0.0.0 --port=7877 --allow-root
https://github.com/tencent-ailab/IP-Adapter/wiki/IP%E2%80%90Adapter%E2%80%90Face
我们使用一些公开数据集(例如LAION)来获取训练数据集,特别是,我们还使用了一些人工智能合成的图像。具体来说,我们使用insightface库中的人脸检测模型来过滤掉仅包含1张脸的图像。为了确保图像质量,我们只使用分辨率高于1024的图像,同时过滤掉一些脸部较小的图像(在这里使用人脸质量评分模型进行过滤可能更好,但我们尚未这样做)。我们还进行了一些数据增强,最重要的是裁剪具有不同脸部比例的图像,以便模型可以生成具有各种脸部比例的图像,例如全身或半身照片。在训练之前,我们首先裁剪出脸部,我们使用的代码如下:
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image
from insightface.utils import face_align
app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = cv2.imread("person.png")
faces = app.get(img)
norm_face = face_align.norm_crop(img, landmark=faces[0].kps, image_size=224)
最初我们没有对人脸进行分割,但后来我们发现分割人脸(去除背景)会降低对背景的依赖。
在训练过程中,我们只使用了水平翻转,但在后续版本中我们使用了更强的数据增强(例如颜色转换等)。
我们主要考虑了两种图像编码器:
CLIP图像编码器:这里我们使用OpenCLIP ViT-H,CLIP图像嵌入对于面部结构很好;
人脸识别模型:这里我们使用insightface的arcface模型,标准化的ID嵌入对于ID相似性很好。(请注意,这里需要标准化嵌入。在我们最早的实验中,我们做了一些错误的实验。这也是为什么FaceID模型相对较晚推出的原因。)
此外,我们还尝试使用了DINO。我们的初步实验比CLIP好,但我们没有发布具体的模型。
我们使用了与IP-Adapter相同的训练策略:
SD 1.5:512x512,批量大小=8*8,lr=1e-4(使用8xV100,32GB)
SDXL:(1)512x512,批量大小=88,lr=1e-4;(2)1024x1024(或多尺度),批量大小=48,lr=1e-5(还使用噪声偏移)(使用8xA100,40GB)
IP-Adapter-Plus-Face
该模型与ip-adapter-plus模型相同,但使用裁剪的人脸图像作为条件。在这里,我们使用一个Q-Former(16个令牌)从CLIP图像嵌入中提取面部特征。
IP-Adapter-Full-Face
我们发现16个令牌不足以学习面部结构,因此在这个版本中,我们直接使用MLP将CLIP图像嵌入映射到新特征,作为IP-Adapter的输入。因此,这个模型比plus-face稍好一些。
IP-Adapter-FaceID
我们使用来自人脸识别模型的人脸ID嵌入,此外,我们使用LoRA来提高ID一致性。因此,IP-Adapter-FaceID = 一个IP-Adapter模型 + 一个LoRA。为什么使用LoRA?因为我们发现ID嵌入不像CLIP嵌入那样容易学习,添加LoRA可以提高学习效果。
如果只使用肖像照片进行训练,ID嵌入相对容易学习,因此我们得到了IP-Adapter-FaceID-Portrait。这也表明,如果采用适当的策略,如ID损失或GAN损失,ID嵌入可以学得更好(训练数据的数量也是关键)。
IP-Adapter-FaceID-Plus
我们发现仅使用ID嵌入,模型生成结果不稳定,例如,它们受提示的影响很大,因此我们将ID嵌入和CLIP嵌入结合起来。具体来说,我们将ID嵌入用作Q-Former的查询。
IP-Adapter-FaceID-Plus-V2
如前所述,CLIP嵌入比ID嵌入更容易学习,因此IP-Adapter-FaceID-Plus更倾向于CLIP嵌入,这使得模型不太可编辑。因此,在V2版本中,我们稍微修改了结构,并将其转换为一种快捷结构:ID嵌入 + CLIP嵌入(使用Q-Former)。同时,在训练过程中,我们舍弃了50%的CLIP嵌入。具体来说,我们使用了丢弃路径训练策略。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。