当前位置:   article > 正文

【深度学习】IP-Adapter-FaceID,IP-Adapter,代码实践

ip-adapter-faceid

之前介绍了一下论文:
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工程


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

二、模型转换

将 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")


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

三、再次尝试

在上次尝试中,效果不是很好,再次用Jupyter尝试一下原git仓库的代码。

pip install jupyter
pip install jupyterlab
  • 1
  • 2

执行:

jupyter notebook --ip=0.0.0.0 --port=7877 --allow-root

  • 1
  • 2

四、test_sdxl_Portrait

五、几个模型的异同点

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最初我们没有对人脸进行分割,但后来我们发现分割人脸(去除背景)会降低对背景的依赖。

在训练过程中,我们只使用了水平翻转,但在后续版本中我们使用了更强的数据增强(例如颜色转换等)。

图像编码器

我们主要考虑了两种图像编码器:

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
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/742369
推荐阅读
相关标签
  

闽ICP备14008679号