想象你走进一家神奇的照相馆,老板老皮话不多,你递给他一张旧照片和一张便条,便条上写着:“把背景从公园换成海边,把我手里的汽水改成冰沙。”老皮点点头,十分钟后递回一张新照片——背景真的变成了海滩,你手里真的捧着一杯冰沙,而你没有用鼠标圈选任何区域。老皮凭什么听懂人话?因为他不是普通修图师,而是一位久经训练的 AI 修图大师。他年轻时反复研究过几十万套《顾客指令—原图—成图》对照手册,练就了“把一句话翻译成亿万像素变化”的功夫。这门功夫在 AI 圈里有个名字:InstructPix2Pix。它属于扩散模型家族——一种先从“雪花噪声”里凿出图像、再在凿的过程中不断参考你的指令的生成式技术。本文就带你拆开这台修图机器,看看它如何收集练习册、如何调配双条件、如何调节“听话程度”,以及怎样与 ControlNet 等工具组成真正的图像编辑流水线。

岗位关联

掌握 InstructPix2Pix,你就掌握了“语言—图像”编辑产品的核心技术路径,能直接用于 AI 修图工具、电商设计和内容创作等场景,是 AIGC 工程师的高性价比进阶技能。

目录
  1. 可视化演示
  2. 1. 扩散模型基础:从雪花电视里凿出照片
  3. 2. 指令数据生成:老皮的十万套对照练习册
  4. 3. 模型架构设计:老皮的双持创作台
  5. 4. 训练策略:老皮的“听话程度”旋钮
  6. 5. 编辑可控性:从微调到重画的连续滑动条
  7. 6. 生态与扩展:老皮的新眼镜(ControlNet)
  8. 7. 零样本落地:见多识广的底气
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示语言指令驱动的零样本图像编辑流程、双条件扩散架构(图像+文本)及Classifier-Free Guidance引导控制,通过扩散去噪与条件注入直观呈现编辑机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

指令驱动编辑 输入图像+自然语言指令,扩散模型逐步去噪生成编辑结果 x_t → x_{t-1} = f(x_t, c_img, c_txt) 零样本编辑无需精细掩码

1. 扩散模型基础:从雪花电视里凿出照片

老皮修图师工作室的角落里放着一台老式电视机,开机时满屏雪花。他说自己每次动手前,都会先盯着那团雪花发呆——因为所有图像都从“混沌”里诞生。这台“雪花电视”正是扩散模型的缩影:训练时,真实图像被反复加入高斯噪声,直到沦为一片乱码;推理时,模型从纯噪声出发,一步步“倒放加噪过程”,把画面从混沌里捞出来。InstructPix2Pix 的特别之处在于,捞画面时手里攥着两张纸条:一张是原图,一张是顾客的指令。每一步去噪,它都参考这两张纸条,最终凿出的画面既保留原图骨架,又响应用户描述。

这个“从噪声倒放”的过程叫条件扩散生成。普通扩散模型只学“图像长什么样”,而 InstructPix2Pix 要学“在原图和指令的共同约束下,图像应该变成什么样”。训练时,模型被丢进大量三元组里,学习预测噪声(或干净图像),目标函数是最朴素的均方误差:

所以说,老皮的“雪花电视”不是普通的电视——它是一个时刻参照施工图纸与口头要求的神奇雕刻台,每一帧雪花消融都在向“原图+指令”共同指定的终点靠近。

L=Et,ε[∥ε−εθ(xt,cI,cT)∥2]\displaystyle L = \mathbb{E}_{t,\varepsilon}\left[ \left\| \varepsilon - \varepsilon_\theta(x_t, c_I, c_T) \right\|^2 \right]
这个公式说的是:让网络面对“被噪声污染的编辑结果图”时,能准确指出刚才混进去的噪声是什么。能指认噪声,就意味着它看懂了图像的结构与语义。
  1. 损失函数 $L$整个公式是均方误差的数学期望,衡量“标准答案噪声”与“模型预测噪声”之间的距离,距离越小说明模型越懂图像。
    L=E[⋅]\displaystyle L = \mathbb{E}\left[ \cdot \right]
  2. 随机时间步 $t$训练时会随机抽一个加噪强度,让模型见过“轻度模糊”到“完全雪花”的各个阶段,保证它在推理时任何一步都能上手。
    t∼Uniform(0,T)\displaystyle t \sim \text{Uniform}(0, T)
  3. 真实噪声 $\varepsilon$加噪时注入的高斯噪声,是模型要模仿的标准答案。
    ε∼N(0,I)\displaystyle \varepsilon \sim \mathcal{N}(0, I)
  4. 模型预测 $\varepsilon_\theta(x_t, c_I, c_T)$网络同时读到带噪图 $x_t$、原图条件 $c_I$ 和文本条件 $c_T$ 后,估计出的噪声分量。
    εθ:(xt,cI,cT)↦ε^\displaystyle \varepsilon_\theta: (x_t, c_I, c_T) \mapsto \hat{\varepsilon}
  5. 双条件 $c_I$ 与 $c_T$$c_I$ 是输入图像条件,告诉模型“从哪改”;$c_T$ 是文本指令条件,告诉模型“改成什么”。
    条件={cI,cT}\displaystyle \text{条件} = \{ c_I, c_T \}

2. 指令数据生成:老皮的十万套对照练习册

老皮年轻时并不是天才。他出名前,每天把自己关在阁楼里,翻阅成堆的《顾客指令—原图—成图》对照练习册:左边是原图,右边是修好的图,中间一行小字写着顾客的原话。他看了几十万组,才练出“听得懂人话”的本事。InstructPix2Pix 的成长路径如出一辙,但它没有人工一张张修图的闲工夫,而是靠流水线批量制造练习册。

这套流水线的核心是“自动生成三元组”。真实世界里很难找到海量“原图—指令—编辑结果”的标注,于是论文作者想了个巧妙的办法:先让 GPT 这类大语言模型批量编写自然指令(“把它变成冬天”“给沙发加一只猫”“换成水彩风格”),再用 Prompt-to-Prompt、文本驱动扩散模型等现成工具对原图施加轻量编辑,伪造出“编辑后的结果图”。这样,机器只需从互联网抓图,就能自动拼出几十万对训练样本,最终得到约 30 万组高质量三元组。

这种“伪练习册”的质量看起来不如人工精修,但胜在规模与一致性。模型并不需要看到人类修图师的高超手艺,它只需要反复观察到同一个规律:文字描述里出现的语义变化,会对应图像上的某种像素变化。看得多了,它就能归纳出“指令—变化”的翻译规则。用老皮的话说:练习册虽然不是名师手稿,但每本都在演示“按文字说的方向变”,量变引起质变。

数据决定了老皮的上限。为什么偏偏用 GPT 生成指令?因为指令的多样性和自然度至关重要——如果指令永远是“把它变红”这种模板句,模型一遇到“把黄昏染成薄荷色”就懵了。合格的练习册必须覆盖人们真实的表达习惯,这正是语言模型大显身手的地方。

3. 模型架构设计:老皮的双持创作台

老皮工作时有个习惯:左手压着顾客给的原照片,右手举着写着要求的便利贴,两只手都按在创作台上,眼睛在两者间来回扫。InstructPix2Pix 的网络结构,本质就是模拟了这副“双持”姿态。它的主网络是 UNet——扩散模型的标准骨干,负责从噪声图中一步步去噪;而原图与指令则作为两条条件输入,从不同路径“按住”生成过程。

先看文本条件。指令句子不能直接喂给网络,得先经过 CLIP 文本编码器转换成向量。这个向量通过交叉注意力机制注入 UNet 的每一层,相当于老皮把便利贴内容在心里默念了无数遍,每一笔落刀都想着“顾客要的是夏天”。再看图像条件。输入原图不是像文本那样走注意力,而是直接在通道维度上拼接进 UNet 的输入——原本的噪声图可能只有 4 个通道,拼接原图后变成 8 个通道。这种“硬拼接”让模型在每一步去噪时都能看到原始图像的全部细节,像老皮左手始终压着照片不撒手。

双条件的设计各司其职:语言适合表达抽象的“改成什么”,图像适合锚定具体的“从哪里改”。如果只给文本,模型不知道照片里哪块是天空、哪块是人物;如果只给图像,模型又不知道顾客的意图。两者在 UNet 中反复交汇,最终共同生成编辑后的画面。老皮的双持姿势也一样:一手锚定现实,一手指向想象,缺一只都不干活。

4. 训练策略:老皮的“听话程度”旋钮

老皮的店里有一个神秘旋钮,顾客可以要求“随便改改”或者“必须严格按我说的改”。这个旋钮不是凭空来的,为了练出它,老皮在训练时经常故意“装聋”。明明看到了指令纸条,他却强迫自己忽略它;明明看到了原图,他也偶尔假装没见过。这样练下来,他既学会了忠实原图,也学会了服从指令,还能在两者之间自由调节。InstructPix2Pix 把这套方法称为 Classifier-Free Guidance,无分类器引导。

训练时,模型以一定概率把文本条件或图像条件随机置空(记作 $\varnothing$)。这样同一个网络就能同时扮演“完全听话版”和“置空基线版”。推理时不再只取一次预测,而是同时进行多次预测,把“有条件预测”与“无条件预测”的差作为引导增量,用两个强度系数拉向目标方向:

老皮的旋钮不是玄学,而是用“装聋作哑”练出来的可调节引导。$\lambda_I$ 通常在 1.5 附近,负责“别改得亲妈都不认识”;$\lambda_T$ 通常在 7.5 附近,负责“别把顾客的话当耳边风”。两个旋钮搭配,编辑结果才又像原图又听话。

ε^=εθ(xt,cI,cT)+λI(εθ(xt,cI,cT)−εθ(xt,∅,cT))+λT(εθ(xt,cI,cT)−εθ(xt,cI,∅))\displaystyle \hat{\varepsilon} = \varepsilon_\theta(x_t, c_I, c_T) + \lambda_I \big( \varepsilon_\theta(x_t, c_I, c_T) - \varepsilon_\theta(x_t, \varnothing, c_T) \big) + \lambda_T \big( \varepsilon_\theta(x_t, c_I, c_T) - \varepsilon_\theta(x_t, c_I, \varnothing) \big)
这个公式描述的是老皮最终落笔的方向:在“完全听话”的基础上,向“更像原图”拉一点,再向“更服指令”拉一点。两个拉力的大小就是旋钮刻度。
  1. 最终方向 $\hat{\varepsilon}$采样时实际使用的噪声预测方向,相当于老皮每一笔落刀的最终力度向量。
    ε^=最终编辑方向\displaystyle \hat{\varepsilon} = \text{最终编辑方向}
  2. 完全听话预测 $\varepsilon_\theta(x_t, c_I, c_T)$同时看到原图和指令时的预测,是整条公式的基准项。
    εθ(xt,cI,cT)\displaystyle \varepsilon_\theta(x_t, c_I, c_T)
  3. 原图引导增量 $\lambda_I(\cdot)$用“有原图预测”减去“没原图预测”,得到朝向输入图的修正方向,$\lambda_I$ 控制图像保真度。
    λI(εθ(xt,cI,cT)−εθ(xt,∅,cT))\displaystyle \lambda_I \big( \varepsilon_\theta(x_t, c_I, c_T) - \varepsilon_\theta(x_t, \varnothing, c_T) \big)
  4. 指令引导增量 $\lambda_T(\cdot)$用“有指令预测”减去“没指令预测”,得到朝向文本要求的修正方向,$\lambda_T$ 控制指令遵守度。
    λT(εθ(xt,cI,cT)−εθ(xt,cI,∅))\displaystyle \lambda_T \big( \varepsilon_\theta(x_t, c_I, c_T) - \varepsilon_\theta(x_t, c_I, \varnothing) \big)
  5. 置空符号 $\varnothing$表示该条件在训练时被随机丢弃,采样时作为“没听见/没看见”的基线。
    ∅=条件缺失状态\displaystyle \varnothing = \text{条件缺失状态}

5. 编辑可控性:从微调到重画的连续滑动条

老皮的店里有一根滑动条,上面标注着“保守微调”到“彻底重画”两端的刻度。顾客推得靠左,他就只调个色调;推得靠右,他就敢把整张照片改头换面。这根滑动条的实质,就是上一节那两个 $\lambda$ 权重。InstructPix2Pix 的可控性正体现在:它不只是一个“输入指令出结果”的黑盒,而是一台允许用户精细调节编辑力度的机器。

调节方式非常直观。把 $\lambda_T$ 调低、$\lambda_I$ 调高,模型会倾向于“照着原图重新画一遍”,适合只做轻度色彩迁移或局部微调;反过来,把 $\lambda_T$ 调高、$\lambda_I$ 调低,模型会更大胆地改变语义内容,比如把小狗变成小猫、把白天的街道变成赛博朋克夜景。这种连续可调能力来自训练阶段的随机条件丢弃——因为没有条件被硬编码为“必须完全参考”或“必须完全忽略”,模型天然学会了在两个极端之间插值。

不过滑动条推得太猛会出问题:$\lambda_T$ 过大会导致过饱和、伪影横行,画面像被油漆泼过;$\lambda_I$ 过大会让编辑效果趋近于零,顾客以为你没干活。实际调参时,通常会在“语义变化足够明显”和“图像自然不崩坏”之间寻找平衡点。老皮的经验是:先固定一个方向,再慢慢推滑条,推到画面刚要“糊”的那一刻回拨一点,就是最佳位置。

可控性让一个模型能服务无数种需求。同样是“把房子变成城堡”,轻度用户可能只是想给屋顶加个尖,重度用户则想要整个中世纪要塞。而 InstructPix2Pix 用两根连续的旋钮,把这两种极端需求统一在了一条滑动条上。

6. 生态与扩展:老皮的新眼镜(ControlNet)

有一天,老皮接到一单挑剔的活:顾客要求“只把人物衣服换成西装,但绝不能动姿势、构图和背景”。老皮光凭语言指令有点心虚——万一模型觉得“换西装”顺便把人脸也改了怎么办?这时候,顾客递给他一副“结构眼镜”。戴上后,老皮眼前出现了原图的骨架线、边缘线和深度图,他瞬间知道哪里能动、哪里不能碰。这副眼镜,就是 ControlNet。

ControlNet 是另一种条件控制技术,它把边缘图、深度图、姿态骨架、分割图等结构化信息作为额外约束,注入生成模型。InstructPix2Pix 与 ControlNet 结合后,形成了“语言管语义、结构管几何”的分工:InstructPix2Pix 负责理解“改成什么风格、换什么内容”,ControlNet 负责锁住“哪块区域绝对不能动”。两者不是竞争关系,而是上下游配合。

典型的组合管线长这样:先对输入图跑姿态估计或边缘检测,拿到骨架图;然后把骨架图作为 ControlNet 条件,把指令文本作为 InstructPix2Pix 条件;模型生成时,每一步去噪都要同时满足两个条件的约束。比如人像编辑中,用户输入“把背景换成东京街头”,ControlNet 锁定人体骨架不变,InstructPix2Pix 则自由重绘光照和背景;再比如建筑设计中,用户输入“改成哥特风格”,ControlNet 锁定建筑轮廓,语言模型负责变换装饰纹理。

老皮戴上这副“结构眼镜”后,再也没出现过“改个颜色把楼改歪了”的惨案。生态工具的意义正在于此:单一模型也许不够完美,但把语言指令、结构约束、图像条件组合成一条可装配的流水线,就能在真实产品中兼顾想象力与稳定性。

7. 零样本落地:见多识广的底气

现在,老皮已经成名了。他从不挑活:你没给他看过的照片、从没听过的表述,他都敢当场试一试。这份底气不是因为他记住了某张特定的图,而是因为几十万套练习册让他练出了“听得懂话、看得出结构、改得动像素”的通识能力。在技术术语里,这叫零样本编辑——面对全新的图像和全新的指令,不需要重新训练或微调模型,直接推理就能出结果。

InstructPix2Pix 的零样本能力,正是它区别于传统图像编辑方案的最大卖点。传统方案要么需要人工画掩码,要么一个任务训练一个模型;而 InstructPix2Pix 建立的是“指令—图像变化”的通用翻译规则。你输入“把照片里的狗换成戴帽子的猫”,它直接输出结果;你输入“把白天的街道变成下雨天”,它也照办。产品形态因此变得极其轻量:一个文本输入框加上一个生成按钮,就是一款 AI 修图工具。

落地场景已经相当丰富。在图像编辑工具里,用户用一句话完成背景替换、物体增减、风格迁移;在设计辅助中,设计师快速生成多方案概念图,用指令迭代想法:“主色调改成蒂芙尼蓝”“字体旁边加个星球元素”;在电商场景里,商品图可以一键换背景、换季节氛围,无需重拍。当然,零样本不等于万能——复杂指令可能打折,精细的局部控制仍需借助 ControlNet 或掩码工具兜底,但这不妨碍它成为 AIGC 时代最实用的图像编辑底座之一。

老皮的故事讲完了。从一个翻练习册的少年,到戴上结构眼镜的资深大师,他的成长轨迹正是 InstructPix2Pix 的技术路线:用数据练理解力,用双条件练锚定力,用引导旋钮练分寸感,最后用生态组合补齐短板。下次你对着照片输入一句“帮我把天空变成极光”时,心里可以默念一句:老皮又开始工作了。

AI 应用场景

AI 图像编辑工具

阶段:条件扩散推理 + 零样本指令编辑

解决的问题:传统修图工具(Photoshop、美图秀秀)需要用户掌握选区、蒙版、图层等专业技能,改一张图的成本极高。AI 图像编辑工具把交互简化为“输入一句话”,让零基础用户也能完成专业级编辑。InstructPix2Pix 的核心价值在于不需要掩码,原图+文本即可驱动,产品交互层只需一个文本框和一个画布。

具体案例:某移动端修图 App 集成“指令改图”功能,用户上传照片后输入“把背景换成樱花大道”,系统在 2 秒内返回编辑结果。后端调用 InstructPix2Pix 推理,并对 λ_I、λ_T 做产品化预设:默认 λ_I=1.5、λ_T=7.5,同时在高级模式暴露“保留原图程度”滑动条,供用户微调。

电商与设计辅助

阶段:数据预处理 + 与 ControlNet 组合管线 + 批量生成

解决的问题:电商商品图需要频繁更换背景、调整风格、适配不同营销主题。传统流程要重拍或精修,成本高、周期长。InstructPix2Pix 结合 ControlNet 后,可以在锁定商品主体轮廓的前提下,用指令批量改变场景氛围,实现“一条指令生成一整套营销素材”。

具体案例:某电商平台为服装类商家提供“模特图换装”服务:商家上传白底商品图,输入“生成一个穿这件衣服在咖啡馆喝咖啡的模特”,系统先用姿态估计生成骨架图(ControlNet 条件),再结合指令文本由 InstructPix2Pix 完成语义编辑,自动输出多套风格素材供商家选用。

Python 演示

python69 行
import numpy as np CHARS = " .:*#%@" def make_base(rows=16, cols=16):    img = np.zeros((rows, cols, 3), dtype=np.float32)    sky = int(rows * 0.6)    img[:sky, :, :] = (0.5, 0.7, 1.0)    img[sky:, :, :] = (0.2, 0.5, 0.2)    img[5:11, 3:13, :] = (0.9, 0.8, 0.4)    img[2:5, 5:11, :] = (0.8, 0.3, 0.3)    img[8:11, 7:9, :] = (0.3, 0.2, 0.1)    return img def edit(img, instruction):    out = img.copy()    if instruction == "make it a snowy night":        out[:, :, 0] = 0.1        out[:, :, 1] = 0.1        out[:, :, 2] = 0.25        snow = np.random.rand(img.shape[0], img.shape[1]) > 0.8        out[snow] = (1.0, 1.0, 1.0)        out[2:5, 5:11] = (1.0, 1.0, 1.0)    elif instruction == "turn it into sunset":        out[:, :, 0] = 1.0        out[:, :, 1] = 0.4        out[:, :, 2] = 0.1        ground = int(img.shape[0] * 0.6)        out[ground:, :, 1] = 0.3    else:        raise ValueError("unknown instruction: " + instruction)    return out def diffuse_edit(original, instruction, steps=8):    target = edit(original, instruction)    for s in range(steps + 1):        alpha = s / steps        noise = np.random.randn(*original.shape) * 0.3 * (1 - alpha)        mixed = alpha * target + (1 - alpha) * original + noise        mixed = np.clip(mixed, 0.0, 1.0)        yield mixed def ascii_preview(img):    rows, cols = img.shape[:2]    gray = img.mean(axis=2)    lines = []    for y in range(rows):        line = ""        for x in range(cols):            idx = int(gray[y, x] * (len(CHARS) - 1) + 0.5)            line += CHARS[min(idx, len(CHARS) - 1)]        lines.append(line)    return "\n".join(lines) def main():    original = make_base()    instruction = "make it a snowy night"    print("instruction:", instruction)    print("original:")    print(ascii_preview(original))    for step, frame in enumerate(diffuse_edit(original, instruction, steps=6)):        print("step", step, "mean brightness:", round(float(frame.mean()), 3))        if step % 2 == 0:            print(ascii_preview(frame))    print("final edited image:")    print(ascii_preview(edit(original, instruction))) if __name__ == "__main__":    main()
目的:用一个 16×16 的像素小图演示“指令编辑 + 扩散式重绘”的过程——原图是一幅简笔房子,指令"make it a snowy night"把它变成雪夜,并逐步输出从噪声到结果的中间帧,直观复现 InstructPix2Pix 的编辑直觉。
  1. img[:sky, :, :] = (0.5, 0.7, 1.0)给原图填充上半部分蓝天,模拟真实照片的底色
  2. img[5:11, 3:13, :] = (0.9, 0.8, 0.4)用数组切片绘制房子墙体,对应图像像素级的几何操作
  3. snow = np.random.rand(img.shape[0], img.shape[1]) > 0.8生成一个随机布尔矩阵,8 成概率为假,用来模拟雪花随机落点
  4. out[snow] = (1.0, 1.0, 1.0)把布尔矩阵选中的像素涂成白色,对应“下雪”指令的像素效果
  5. noise = np.random.randn(*original.shape) * 0.3 * (1 - alpha)产生随重绘进度减弱的高斯噪声,模拟扩散过程早期的不确定
  6. mixed = alpha * target + (1 - alpha) * original + noise按比例混合原图与编辑目标,再叠加噪声,等价于 CFG 引导中“向原图拉一点、向指令拉一点”的直觉
  7. np.clip(mixed, 0.0, 1.0)把混合后像素值拉回合法范围,防止超出颜色区间

常见误区

误区我之前用 Photoshop 时都要用选区工具圈出要改的地方,所以以为 InstructPix2Pix 也得先画个掩码,才能再输入文字指令。

正解InstructPix2Pix 的核心卖点恰恰是“无需掩码”。它的输入只有原图和文本指令,被修改的区域由模型根据语义自动推断。至于“不该动的地方别乱动”,靠的是原图条件 + CFG 图像保真项,而非人工选区。若想精确锁定区域,可以外接 ControlNet 或分割掩码,但那是组合工具,不是模型自身的必需输入。

为何常见:因为传统图像编辑流程长期依赖选区、蒙版、图层遮罩,“不用掩码也能精准编辑”违背了人们的使用惯性,所以第一反应总是“它一定偷偷用了掩码”。

误区零样本编辑听起来太强了,我以为随便给一张极其离谱的图、写一句极其复杂的指令,它都能输出完美结果。

正解零样本指的是“模型没见过这张特定图片、没听过这条特定指令,也不需要重新训练就能推理”,但这不等于万能。编辑质量受训练数据分布、图像分辨率、指令复杂度等多重限制。复杂指令经常打折,比如“把第三个路人变成戴帽子的邮差并让背景起雾”可能只完成一半;此时需要调 CFG 权重,或与 ControlNet、分割工具配合。

为何常见:“零样本”这个词本身就暗示“不用学就会”,再加上宣传材料喜欢强调神奇效果,容易让人误解为无限能力。

误区想让模型更听指令,就把指令强度 λ_T 一直往大调,比如调到 50,结果画面出现一堆怪异的色块和伪影。

正解无分类器引导的本质是有条件预测与无条件预测的差分放大,放大倍数过高会让画面过饱和、结构畸变、出现“塑料感”。论文经验值一般在 λ_T=7.5 附近,实际使用要配合 λ_I 一起调,找到“指令效果明显且图像自然”的平衡区间。

为何常见:人的直觉是“越服从越好”,看不到引导机制背后的数学本质——引导项是差分的放大器,放大过度必然失真。

误区图像编辑任务的数据集肯定像早期的图像标注一样,请一群人手工修图、手工写指令,成本高得吓人。

正解InstructPix2Pix 的核心创新之一就是全自动数据管道:GPT 批量生成多样化指令,现成的文本驱动模型生成“伪编辑对”,再从互联网抓取图像自动拼成三元组,最终得到约 30 万对训练数据。人工只在质量筛选阶段介入,而不是手动修图。

为何常见:图像配对数据在传统 CV 中确实依赖人工标注,自动合成训练数据是近几年 AIGC 兴起后才被广泛接受的新思路,人们容易沿用旧经验。

面试题

Q1. InstructPix2Pix 的标准输入是什么?

单选题 · easy

  • A.原图与文本指令← 正确答案
  • B.掩码与文本指令
  • C.仅文本指令输入
  • D.原图与参考风格图

答案:A。InstructPix2Pix 采用双条件输入,即原图条件 $c_I$ 和文本指令条件 $c_T$。掩码不是必需输入;仅文本会失去“从哪改”的锚点;参考风格图也不是标准输入格式。

Q2. 训练数据的三元组由哪三部分组成?

单选题 · easy

  • A.原图、掩码、结果图
  • B.原图、指令、结果图← 正确答案
  • C.噪声、指令、结果图
  • D.文本、掩码、噪声图

答案:B。三元组是(输入图 $c_I$、文本指令 $c_T$、编辑结果图),模型学习的是“原图和指令共同决定结果”的映射。掩码和噪声不是训练数据中的独立三元组元素。

Q3. 文本指令在模型架构中通过什么方式编码?

单选题 · mid

  • A.用 UNet 解码器处理
  • B.用 CLIP 文本编码器处理← 正确答案
  • C.用 VAE 编码器处理
  • D.用 GAN 生成器处理

答案:B。InstructPix2Pix 使用预训练 CLIP 的文本编码器把指令转化为语义向量,再通过交叉注意力注入 UNet。UNet 是图像主网络,VAE 和 GAN 生成器都不是文本理解模块。

Q4. 训练时把条件随机置空(设为 ∅)的主要目的是什么?

单选题 · mid

  • A.减少显存占用
  • B.支持无分类器引导← 正确答案
  • C.提高图像分辨率
  • D.加速数据加载过程

答案:B。随机丢弃条件后,模型同时具备“有条件预测”和“无条件预测”的能力,采样时才能用两者之差构造 CFG 引导增量。省显存、提分辨率、加速加载都不是置空条件的直接目的。

Q5. 把图像保真权重 λ_I 调大会出现什么效果?

单选题 · mid

  • A.图像越接近原图← 正确答案
  • B.图像越服从指令
  • C.图像模糊无细节
  • D.图像色彩更鲜艳

答案:A。λ_I 控制“朝向输入图”的引导强度,调得越大,采样方向越被拉回原图,编辑幅度越小。服从指令靠 λ_T;模糊和鲜艳不是该权重的直接效果。

Q6. 在 CFG 采样公式中,符号 ∅ 代表的含义是什么?

单选题 · hard

  • A.空引导条件向量
  • B.被随机丢弃条件← 正确答案
  • C.梯度消失状态量
  • D.噪声图的特征量

答案:B。∅ 表示训练时被随机置空的条件。采样时把“没看原图”或“没听指令”的预测作为基线,与完整条件预测求差,从而得到朝向特定条件的引导方向。其他选项都是对符号的误读。

Q7. ControlNet 与 InstructPix2Pix 结合主要用于解决什么问题?

单选题 · easy

  • A.增强文本编码能力
  • B.提供额外结构约束← 正确答案
  • C.加快模型推理速度
  • D.减少训练数据数量

答案:B。ControlNet 用边缘、深度、姿态等结构化信息约束生成过程,解决“语言指令不够精细”导致的结构走样问题。它不负责文本编码、推理加速或数据缩减。

Q8. 下面哪些属于 InstructPix2Pix 的典型应用能力?

多选题 · mid

  • A.照片背景更换← 正确答案
  • B.物体类别更换← 正确答案
  • C.保持无关区域稳定← 正确答案
  • D.生成高清视频

答案:ABC。背景替换和物体类别替换是语言指令编辑的典型场景;保持无关区域稳定可通过调大 λ_I 或结合 ControlNet 实现。InstructPix2Pix 是静态图像编辑模型,不具备视频生成能力。

Q9. 自动数据生成流水线通常包含哪些环节?

多选题 · hard

  • A.GPT 生成多样指令← 正确答案
  • B.文本驱动模型造伪编辑← 正确答案
  • C.人工标注每张掩码
  • D.大规模配对筛选清洗← 正确答案

答案:ABD。论文用 GPT 批量写指令、用 Prompt-to-Prompt 等文本驱动模型生成伪编辑对、再经过质量筛选得到三元组。人工标注掩码恰恰是这套流水线想要省去的繁琐步骤。

Q10. 关于无分类器引导(CFG)下列说法正确的是哪些?

多选题 · extreme

  • A.同时调用有条件预测与无条件预测← 正确答案
  • B.两个引导项可以独立调节← 正确答案
  • C.引导权重过大会产生伪影← 正确答案
  • D.权重越大效果必然越好

答案:ABC。CFG 公式正是“有条件预测 + 两个差分引导项”;λ_I 与 λ_T 独立控制图像保真和指令遵守;过大的引导权重会造成过饱和与伪影,所以 D 的“必然越好”是错的。