举例绘画
举例绘画:基于示例的扩散模型图像编辑 由杨斌鑫、顾书阳、张波、张婷、陈雪津、孙晓燕、陈栋、温芳撰写。
论文摘要如下
近年来,语言引导的图像编辑取得了巨大的成功。在本文中,我们首次研究了示例引导的图像编辑,以实现更精确的控制。我们通过利用自监督训练来解耦和重组源图像和示例图像来实现这一目标。然而,这种朴素的方法会导致明显的融合伪影。我们仔细分析了这个问题,并提出了一个信息瓶颈和强大的增强方法,以避免直接复制粘贴示例图像的平凡解。同时,为了确保编辑过程的可控性,我们为示例图像设计了一个任意形状的掩码,并利用无分类器引导来提高与示例图像的相似度。整个框架只涉及扩散模型的一次前向传播,无需任何迭代优化。我们证明了我们的方法取得了令人印象深刻的性能,并能够对野外图像进行高保真度的可控编辑。
原始代码库可以在 Fantasy-Studio/Paint-by-Example 找到,您可以在 演示 中试用它。
提示
“按示例绘画”由官方的 Fantasy-Studio/Paint-by-Example 检查点支持。该检查点从 CompVis/stable-diffusion-v1-4 预热启动,以根据示例图像和参考图像对部分遮罩的图像进行修复。
PaintByExamplePipeline
类 diffusers.PaintByExamplePipeline
< 源代码 >( vae: AutoencoderKL image_encoder: PaintByExampleImageEncoder unet: UNet2DConditionModel scheduler: Union safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor requires_safety_checker: bool = False )
参数
- vae (AutoencoderKL) — 变分自动编码器 (VAE) 模型,用于将图像编码和解码到潜在表示中,以及从潜在表示中编码和解码图像。
- image_encoder (
PaintByExampleImageEncoder
) — 编码示例输入图像。unet
以示例图像而不是文本提示为条件。 - tokenizer (CLIPTokenizer) — 用于标记文本的
CLIPTokenizer
。 - unet (UNet2DConditionModel) — 用于对编码图像潜在表示进行去噪的
UNet2DConditionModel
。 - scheduler (SchedulerMixin) — 用于结合
unet
对编码图像潜在表示进行去噪的调度器。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 中的一个。 - safety_checker (
StableDiffusionSafetyChecker
) — 用于估计生成图像是否可能被视为冒犯性或有害的分类模块。有关模型潜在危害的更多详细信息,请参阅 模型卡片。 - 特征提取器 (CLIPImageProcessor) — 用于从生成图像中提取特征的
CLIPImageProcessor
;用作安全检查器
的输入。
🧪 这是一个实验性功能!
使用 Stable Diffusion 进行图像引导图像修复的管道。
此模型继承自 DiffusionPipeline。查看超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
__call__
< 源代码 >( 示例图像: Union 图像: Union 遮罩图像: Union 高度: Optional = None 宽度: Optional = None 推理步数: int = 50 引导尺度: float = 5.0 负面提示: Union = None 每个提示的图像数量: Optional = 1 eta: float = 0.0 生成器: Union = None 潜在变量: Optional = None 输出类型: Optional = 'pil' 返回字典: bool = True 回调函数: Optional = None 回调步数: int = 1 ) → StableDiffusionPipelineOutput 或 元组
参数
- 示例图像 (
torch.Tensor
或PIL.Image.Image
或List[PIL.Image.Image]
) — 用于引导图像生成的示例图像。 - 图像 (
torch.Tensor
或PIL.Image.Image
或List[PIL.Image.Image]
) — 表示要进行修复的图像批次的图像
或张量(图像的某些部分使用遮罩图像
遮蔽并根据提示
重新绘制)。 - 遮罩图像 (
torch.Tensor
或PIL.Image.Image
或List[PIL.Image.Image]
) — 用于遮蔽图像
的图像
或张量。遮罩中的白色像素将被重新绘制,而黑色像素将被保留。如果遮罩图像
是 PIL 图像,则在使用前将其转换为单通道(亮度)。如果它是张量,则应包含一个颜色通道 (L) 而不是 3,因此预期形状将为(B, H, W, 1)
。 - 高度 (
int
, 可选, 默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成图像的高度(以像素为单位)。 - 宽度 (
int
, 可选, 默认为self.unet.config.sample_size * self.vae_scale_factor
) — 生成图像的宽度(以像素为单位)。 - 推理步数 (
int
, 可选, 默认为 50) — 降噪步骤的数量。更多的降噪步骤通常会导致更高的图像质量,但会以更慢的推理为代价。 - num_images_per_prompt (
int
, 可选,默认为 1) — 每个提示生成图像的数量。 - eta (
float
, 可选,默认为 0.0) — 对应于来自 DDIM 论文的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。 - generator (
torch.Generator
或List[torch.Generator]
, 可选) — 用于使生成确定性的torch.Generator
。 - latents (
torch.Tensor
, 可选) — 从高斯分布采样的预生成的噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - output_type (
str
, 可选,默认为"pil"
) — 生成的图像的输出格式。在PIL.Image
或np.array
之间选择。 - return_dict (
bool
, 可选,默认为True
) — 是否返回 StableDiffusionPipelineOutput 而不是普通元组。 - callback (
Callable
, 可选) — 在推理过程中每隔callback_steps
步调用一次的函数。该函数使用以下参数调用:callback(step: int, timestep: int, latents: torch.Tensor)
。 - callback_steps (
int
, 可选,默认为 1) — 调用callback
函数的频率。如果未指定,则在每个步骤中调用回调。
返回值
StableDiffusionPipelineOutput 或 tuple
如果 return_dict
为 True
,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple
,其中第一个元素是包含生成图像的列表,第二个元素是 bool
值的列表,指示相应的生成图像是否包含“不适合工作场所”(nsfw)内容。
管道生成调用的函数。
示例
>>> import PIL
>>> import requests
>>> import torch
>>> from io import BytesIO
>>> from diffusers import PaintByExamplePipeline
>>> def download_image(url):
... response = requests.get(url)
... return PIL.Image.open(BytesIO(response.content)).convert("RGB")
>>> img_url = (
... "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/image/example_1.png"
... )
>>> mask_url = (
... "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/mask/example_1.png"
... )
>>> example_url = "https://raw.githubusercontent.com/Fantasy-Studio/Paint-by-Example/main/examples/reference/example_1.jpg"
>>> init_image = download_image(img_url).resize((512, 512))
>>> mask_image = download_image(mask_url).resize((512, 512))
>>> example_image = download_image(example_url).resize((512, 512))
>>> pipe = PaintByExamplePipeline.from_pretrained(
... "Fantasy-Studio/Paint-by-Example",
... torch_dtype=torch.float16,
... )
>>> pipe = pipe.to("cuda")
>>> image = pipe(image=init_image, mask_image=mask_image, example_image=example_image).images[0]
>>> image
StableDiffusionPipelineOutput
类 diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput
< 源代码 >( images: Union nsfw_content_detected: Optional )
Stable Diffusion 管道的输出类。