paper | AnyDoor: Zero-shot Object-level Image Customization |
---|---|
code | https://github.com/damo-vilab/AnyDoor |
Org | 香港大学,Alibaba Group |
date | 2023-07 |
1 Motivation
过去我们用dreambooth,LORA,textual inversion等方法做定制目标生成。但这个方法每次定制新的目标都需要重新训练模型。这篇文章的核心目的是用一种zero-shot的方法做定制目标的定制场景图片生成。简单来说就是:给定目标图片和场景图片就能生成在该目标在该场景不同姿态(角度、光照)的图片。
2 Method
2.1 模型架构
架构组成 | 功能 | 是否更新参数 |
---|---|---|
Segmentor | 用于去背景 | ❄️ |
Detail Extractor | 类似ControlNet,用于特征注入 | 🔥 |
Unet | stable diffusion | ❄️ |
ID Extractor | 提取图片特征,注入unet | ❄️DINOV2 + 🔥投影层 |
pipeline如下:
输入:
- 给定场景图片+生成位置
- 需要定制的目标图片
STEP1:目标图片送入到segmentor
中进行去背景。然后兵分两路,记作分枝1和分枝2
- STEP2-分枝1:
- STEP2-1-1: 提取去除背景的图片的高频信号HF_MAP (下节有实现细节)
- STEP2-1-2: 将提取的高频信号和场景图片在生成位置进行融合
- STEP2-1-3: 将融合的结果送入到
Detail Extractor
中提取Detail map。(此处的网络结构类似controlnet
)
- STEP2-分枝2:
- STEP2-2-1: 将去除背景的图片送入到
ID Extractor
中提取ID-Token。
- STEP2-2-1: 将去除背景的图片送入到
STEP3: 将ID-Token和Detail map一起送入到Unet
中,用diffusion model的生成方式进行图片生成。
2.2 实现细节
2.2.1 图中的HF-MAP是什么,有什么用
HF-MAP的计算公式如下
I h = ( I ⊗ K h + I ⊗ K v ) ⊙ I ⊙ M e r o d e , \mathbf {I} _ { h } = ( \mathbf {I} \otimes \mathbf {K} _ { h } + \mathbf {I} \otimes \mathbf {K} _ { v } ) \odot \mathbf {I} \odot \mathbf{M} _ { e r o d e } , Ih=(I⊗Kh+I⊗Kv)⊙I⊙Merode,
其中:
- I h \mathbf {I} _ { h } Ih为HF-MAP
- I \mathbf {I} I为输入的原图
- K h \mathbf {K} _ { h } Kh为水平方向的Sobel kernel
- ⊗ \otimes ⊗表示卷积操作
- K v \mathbf {K} _ { v } Kv表示垂直方向的Sobel kernel
- M e r o d e \mathbf{M} _ { e r o d e } Merode为经过腐蚀后的物体mask
- ⊙ \odot ⊙ 为逐元素相乘。即Hadamard product
该公式的核心就是,提取图片中object的高频信息,随后将其与scene图片拼接。
作者之所以用高频信号进行拼接是因为:直接将物体 I ⊙ M e r o d e \mathbf {I} \odot \mathbf{M} _ { e r o d e } I⊙Merode和scene拼接训练后生成的结果都非常单一,缺乏多样性。
作者也对HF-MAP的必要性进行了消融实验
2.2.2 如何构建训练的图片pair
从上面的描述中我们知道anydoor的训练目标是给定目标图片和场景生成该目标在该场景下不同姿态的图片。因此容易知道训练集是三元组组成的集合,即(输入目标图片,场景图片+位置,输出图片)。如何用一种cheap的方法得到同个目标在同场景不同姿态(视角、光照等)的图片对是一难点。
作者利用video数据集来构造图片对。整体的pipeline如下,简而言之就是利用同一个object在不同帧的图片来构造图片对。
训练的数据集如下:
2.2.3 各组件必要性消融实验
ATS为自适应时间步采样策略(adaptive timestep sampling)
ID extractor的消融实验。
3 Result
从论文给出的结果看,生成的效果都很不错。
Thinking
作者给出了该技术的两个使用场景。感觉用来合成数据也很不错,后续尝试一下。
- 虚拟试衣(virtual try-on)
- 交互式图像编辑