InstructPix2Pix(CVPR2023)-图像编辑论文解读

本文介绍了一种基于InstructPix2Pix的方法,利用GPT-3和StableDiffusion生成训练数据,训练模型跟随编辑指令编辑图像。模型能进行多种编辑,且在无需额外样本或finetuning的情况下快速响应。实验结果显示其在图像一致性上有优势,但仍需解决空间推理等挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


论文: 《InstructPix2Pix: Learning to Follow Image Editing Instructions》
github: https://github.com/timothybrooks/instruct-pix2pix

1.摘要

本文提出一种根据人类引导编辑图像的方法InstructPix2Pix:输入一张图片及告诉模型做什么的引导语,我们的模型将会跟随引导语编辑图像。为获得解决该问题的训练集,作者结合两个大预训练模型的知识:GPT-3、Stable Diffusion,用于生成图像编辑数据集。InstructPix2Pix在生成数据集上训练,但是可泛化到真实数据并且实现用户引导。因为该方案在前向过程进行编辑,无需finetune或转换,可在秒级完成图像编辑。作者展示了令人信服的编辑结果。

2.背景

GPT捕获关于语言的知识,Stable Diffusion捕获关于图像的知识,两者结合用于生成跨越两模态的成对训练集。
InstructPix2Pix在前向过程直接进行图像编辑,无需额外样例图、对输入/输出图的描述或逐样本finetune。
尽管InstructPix2Pix利用生成数据进行训练,但可零样本泛化到真实图片中。可进行各种编辑任务:替换目标、改变图片风格、改变背景、艺术风格等等,如图1所示。
在这里插入图片描述

3.算法

作者将基于引导的图像编辑任务看作有监督学习问题:
1. 生成成对训练集,包括图像编辑指令及编辑前后的图像;图2a-c
2. 在生成数据集训练图像编辑扩散模型;图2-d

在这里插入图片描述

3.1 生成多模态训练集

3.1.1生成指令及成对caption

一个LLM可利用输入图caption生成编辑指令及编辑后图片caption。如图2a所示,输入caption:“photograph ofa girl riding a horse”,LLM可生成编辑指令“have her ride a dragon”及编辑后输出caption:“photograph ofa girl riding a dragon”。
上述过程用到的语言模型通过在小批量人工编写的数据集上finetune GPT-3获得的。该finetune数据集,作者通过在LAION-Aesthetics V2 6.5+中采样700条输入caption获得。如表1所示。受益于GPT-3广博的知识和概括能力,我们finetune的模型能够生成合理instruction及caption。
在这里插入图片描述

3.1.2 依据成对的caption生成成对的图像

将一对caption转换为对应图像的挑战在于当prompt发生变化时,不能保证图像一致性。比如:“a picture ofa cat”及“a picture ofa black cat”可能会生成非常不同的猫,不利于训练模型进行图像编辑。因此作者使用Prompt-to-Prompt,使得生成图像尽量相似,如图3展示使用Prompt-to-Prompt前后结果。Prompt-to-Prompt中参数p可控制两张图相似性,作者对每个caption对生成100个样本对,随机参数 p ∼ U ( 0.1 , 0.9 ) p ∼ U(0.1, 0.9) pU(0.1,0.9),通过CLIP进行过滤样本
在这里插入图片描述

3.2 InstructPix2Pix

为了支持图像作为条件输入,作者在第一个卷积层增加channel,将 z t z_t zt ϵ ( c I ) \epsilon(c_I) ϵ(cI) concat
Classifier-free扩散引导用于平衡生成样本质量及多样性,联合训练扩散模型用于有条件及无条件去噪,推理时将两估计得分结合,通过参数 s s s控制,如式2所示
在这里插入图片描述
对于本任务,得分网络 e θ ( z t , c I , c T ) e_θ(z_t, c_I, c_T) eθ(zt,cI,cT) 有两个条件,作者引入两个引导参数 S I 、 S T S_I、S_T SIST,更改后的得分估计如式3,图4展示两参数影响。
在这里插入图片描述
在这里插入图片描述

4.实验结果

4.1基线比较

如图9,作者与Text2Live、SDEdit进行定性比较。尽管SDEdit能够保证内容一致,同时风格变化,但是它需要目标图的description而不是instruction。
在这里插入图片描述
与SDEdit定量比较如图8,纵轴表示CLIP图像相似性,通过计算CLIP image embedding余弦相似性实现,用于表示编辑后的图像与编辑前图像一致性;横轴表示CLIP图文相似性,用于表示编辑后图像与caption一致性。与SDEdit相比,作者所提方法在相同图文一致性时,具有更高的图像一致性。
在这里插入图片描述

4.2消融实验

图10展示消融实验量化结果,降低数据集大小将导致降低更大图像编辑能力,仅保证图像一致性,但无法保证图文一致性;移除数据集CLIP过滤,导致与输入图的一致性降低
在这里插入图片描述
图4展示两个引导参数 S I 、 S T S_I、S_T SIST影响,增大 S T S_T ST使得与instruction更加一致,增大 S I S_I SI使得与输入图更加一致

5.结论

作者证明大语言模型与文生图模型结合生成数据集,用于根据instruction训练扩撒模型。虽然能够进行令人信服的图像编辑,但是仍存在一些限制

  1. 受限于生成数据集图像质量
  2. 受限于模型泛化到新编辑instruction的能力
  3. 视觉变化与instruction做出正确关联度受限于finetune GPT-3人工编写的instruction、GPT-3的能力、Prompt-to-Prompt能力
  4. 在目标数量计数及空间推理方面存在问题。如图13
    在这里插入图片描述
  5. 在数据及预训练模型的偏置有可能继承至InstructPix2Pix中,如图14。
    在这里插入图片描述
    作者同时提出一些问题:如何根据instruction进行空间推理;如何将instruction与其他条件模态结合;如何评估基于instruction的图像编辑;强化学习策略可能用于改进模型与人类意图之间一致性。
### InstructPix2Pix 使用教程 #### 安装环境 为了使用InstructPix2Pix,需先安装依赖库。确保Python版本不低于3.8,并按照官方文档说明设置虚拟环境。 ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 pip install diffusers transformers accelerate bitsandbytes gradio ``` 上述命令用于安装PyTorch及相关扩展包[^1]。 #### 加载预训练模型 加载InstructPix2Pix预训练权重文件: ```python from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler model_id = "timbrooks/instruct-pix2pix" pipe = StableDiffusionPipeline.from_pretrained(model_id, safety_checker=None) pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config) # 将管道移动到GPU上运行(如果可用) import torch device = 'cuda' if torch.cuda.is_available() else 'cpu' pipe.to(device) ``` 这段代码展示了如何初始化一个基于CUDA加速的推理管线实例。 ### 工作原理概述 InstructPix2Pix采用了一种改进版的稳定扩散架构,在给定源图片的基础上接受自然语言描述作为输入条件来指导图像变换过程。具体来说,该算法接收一对原始图象及其对应的修改指示语句,经过编码器处理后得到潜在空间表示;再由解码器依据这些信息重建目标图像。这种机制允许用户仅通过简单的文字提示就能实现复杂的视觉效果调整。 ### 应用案例展示 假设有一张风景照片想要去除其中多余的电线杆物体,可以这样操作: ```python prompt = "remove the power lines from this image" image_url = "https://raw.githubusercontent.com/timothybrooks/instruct-pix2pix/main/assets/input_images/sf.jpg" input_image = load_image(image_url).convert("RGB") output_image = pipe(prompt=prompt, image=input_image).images[0] output_image.show() ``` 此脚本会读取指定URL中的JPEG格式图片数据流,调用`load_image()`函数将其转换成PIL.Image对象形式传入pipeline接口完成去线任务并显示最终结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值