平行宇宙中的某某某

81 阅读5分钟

本文所涉及所有资源均在    传知代码平台可获取。

概述

本项目复现了CVPR2024中的一篇题为CapHuman: Capture Your Moments in Parallel Universes的文章。该文章旨在实现从单一的面部照片,生成在多样化头部位置、姿势、表情和光照条件等不同场景下的个性化图像。

整个pipeline是基于预训练好的stable diffusion,在此基础上添加了一个新的框架CapHuman,用于实现:

  1. 个性化 (Generalizable Identity Preservation) : 编码个体的身份特征,并将其对齐到latent space, 用以保持身份的一致性

  2. 面部细节控制 (Flexible and Fine-grained Head Control) : 引入三维面部先验,使得可以灵活且三维一致地控制头部细节生成。

接下来我会详细谈一谈自己对于该模型的理解以及复现过程中遇到的一些问题及解决方式。

模型结构

a) 采用“编码特征然后对齐”的方式来实现可泛化的身份保持;

b) 引入三维参数化面部模型,实现灵活且细致的头部控制;

以人类为中心的图像生成往往偏好于对人类头部的灵活、细粒度和精确控制。 然而,现在功能强大的预训练文本到图像的扩散模型缺乏这种控制能力。人们认为,这些预训练模型已经学习到了有关不同头部位置、姿态、面部表情和光照条件的多样化人类图像的内部结构先验。我们的目标是通过引入适当的控制信号作为触发器来解锁其能力。

我们使用预训练好的面部特征提取模型可以获取头部条件HH,

根据HH来预测面部掩码MM,来帮助接下来的CapFace模块 π更多的作用于面部区域。

c) 设计了一个CapFace模块 π,以赋予文生图扩散模型上述能力。

CapFace 模块 π 与 Stable Diffusion 编码器具有类似的结构。特征图在每一层都与 Stable Diffusion 解码器部分逐元素对齐。

这是原paper里的公式,我认为这里的fidfid省略了角标t,此外这里的ztz t是noise_t

将Ft⊙MF tM注入到stable diffusion中,采用类似于controlnet的边网络设计

关于更多的细节,感兴趣的读者可参考原文CapHuman: Capture Your Moments in Parallel Universes

演示效果

复现过程(重要)

0. 原项目的github链接CapHuman
1. git clone 或 手动下载zip文件,并导入vscode;

推荐直接导入附件中的代码文件

2. 下载数据集及权重文件,分别放在data和ckpts目录下;

数据集和权重文件我已下载好,放在了附件文件里的网盘链接里。

3. 如果遇到的网络连接问题,通通改为手动下载

① 如从hugging face下载clip模型或及其权重时

原项目 CapHuman/ldm/modules/encoders/modules.py 95-100 从openai/clip-vit-large-patch14下载模型

def __init__(self, version="ckpts/clip-vit-large-patch14", device="cuda", max_length=77,freeze=True, layer="last", layer_idx=None):  # clip-vit-base-patch32
        super().__init__()
        assert layer in self.LAYERS
        self.processor = CLIPProcessor.from_pretrained(version)
        self.transformer = CLIPVisionModel.from_pretrained(version)

可以改为手动下载,本地读取

一个个点击下载,放到local_model_path下

def __init__(self, version="ckpts/clip-vit-large-patch14", device="cuda", max_length=77, freeze=True, layer="last", layer_idx=None):  # clip-vit-base-patch32
        super().__init__()
        assert layer in self.LAYERS
        local_model_path =" " # 本地放置模型文件的路径 
        self.processor = CLIPProcessor.from_pretrained(local_model_path)
        self.transformer = CLIPVisionModel.from_pretrained(local_model_path)

② FlAME、dlib、mtcnn等

FLAME: 是一个用于生成三维人脸形状和表情的统计模型。其基于大规模的三维人脸扫描,能够捕捉到人脸的广泛变化,包括身份、面部表情(如微笑或皱眉)、和头部姿势(转动、倾斜)等。

dlib: 是一个包含机器学习算法的现代C++工具箱,广泛用于工业和学术领域。在计算机视觉领域,其也提供了很多功能,尤其在人脸检测和识别技术方面表现突出。这些功能包括但不限于:人脸检测、人脸特征点检测、人脸识别等。

mtcnn: 是一个流行的用于人脸检测和对齐的深度学习模型,特别适用于在图像中同时检测人脸位置和识别人脸关键点(如眼睛、鼻子、嘴角等)

代码文件中提供了对三种人脸识别方式的选择,由于FLAME和dlib的安装我遇到了一些问题,因此我采用的是mtcnn.

个人认为如果有条件的话可以试一试FLAME,对pose image中姿势特征的提取效果应该比mtcnn要好。

使用方式(推理过程)

# start
python inference.py --ckpt ckpts/caphuman.ckpt 
                    --vae_ckpt ckpts/vae-ft-mse-840000-ema-pruned.ckpt 
                    --model models/cldm_v15.yaml 
                    --sd_ckpt ckpts/Realistic_Vision_V3.0.ckpt 
                    --input_image examples/input_images/196251.png 
                    --pose_image examples/pose_images/pose1.png 
                    --prompt "a photo of a man wearing a suit in front of Space Needle"

可以替换这里的input_image和pose_image为你想用的图片

使用gradios

python -m gradios.gradio_visualization 
       --ckpt ckpts/caphuman.ckpt 
       --vae_ckpt ckpts/vae-ft-mse-840000-ema-pruned.ckpt 
       --model models/cldm_v15.yaml 
       --sd_ckpt ckpts/Realistic_Vision_V3.0.ckpt

部署方式

1. 基本环境
conda create -n caphuman python=3.7
pip install -r requirements.txt

注意:要根据自己的GPU和驱动版本安装相应的python及torch版本,不一定严格按照这里的环境配置要求。

我跑该项目时的环境如下:

操作系统: Ubuntu 20.04

GPU: NVIDIA A800 80GB PCIe

CUDA Driver: 12.1

python: 3.9

torch: 2.2.2+cu121 2. pytorch3d

根据INSTALL安装pytorch3d

注意:推荐pip install -e. 源码安装, 安装遇到问题时可以参考以下文档kane’s Blog安装pytorch3d最简单方法原创

感觉不错,点击我,立即使用