想象你手里有一幅传了四代的山水古画,画心的云山被虫蛀出一个拳头大的洞:山脊断在半空,溪流截成两段。丢掉可惜,于是你请来一位经验丰富的补画师。他先绕着画转三圈,用红笔轻轻圈出破损处;再凑近研究旁边山石的皴法和墨色浓淡;最后屏息凝神、一笔一笔把断掉的山脊续上,让新墨与旧墨浑然一体。AI 图像修复(Inpainting)干的就是这桩“补画”的活儿:照片上的划痕、水印、反光、霉斑就是那个虫洞,深度学习模型就是那位补画师。本篇我们就沿着“圈破损—读全局—补纹理—验效果—上手用”这条补画路线,把 AI Inpainting 的原理和操作一次讲透。

岗位关联

掌握 Inpainting 是 AI 视觉从业者的基础功:老照片翻新、电商去水印、影视擦穿帮都靠它,也是设计师与算法工程师最常用的图像后处理利器。

目录
  1. 可视化演示
  2. 基础原理:一张残画,两个输入
  3. 蒙版绘制技巧:圈得准,才补得精
  4. 上下文推理:先读全局,再下笔
  5. 生成网络架构:一笔一笔补全画面
  6. 损失函数优化:三个评委打分
  7. 提示词引导:让修复师听懂你的要求
  8. 实战工作流程:从残图到完美出片
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示AI图像修复Inpainti的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

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

AI图像修复Inpainti:AI图像 AI图像修复Inpaintin 蒙版绘制与修复区域控制 核心机制可视化 AI图像修复Inpainti整体架构与关键组件

基础原理:一张残画,两个输入

补画师上门后并不急着动笔。他戴上老花镜,对着虫洞看了又看,用红笔在纸上圈出“要补的位置”,又在心里盘算“这里原来应该是一道山脊,不是一片空白”。圈位置、想内容,这两步决定了后面所有工作。AI 修复师也一样,它拿到手的只有两样东西:残图本身,和一张标出破损位置的“蒙版”。

换句术语说,图像修复就是学习一个映射 F:输入破损图片和蒙版,输出修复结果。蒙版是一张和原图同样大小的黑白图,白的地方表示“这里有洞,请修补”,黑的地方表示“这里是完好的,别乱动”。修复目标不是简单把洞涂平,而是让补出的内容和周围纹理、光照、语义高度一致。最早的一类经典算法(如 Telea 扩散法)会从洞边缘像水波一样一层层向内卷,把周围颜色慢慢填进去;现代深度学习方法则直接学习图像的全局规律,效果更自然。

所以你看,修复师的第一步永远是“圈位置、懂目标”,AI 也一样。位置没圈准,再好的手艺也无处施展;目标理解错了,补出来山不像山、水不像水。理解了这两个输入,后面所有技巧都是为了让 F 这本“修复秘籍”更厉害。

I修复=F(I破损, M)\displaystyle I_{\text{修复}} = F\big(I_{\text{破损}},\ M\big)
  1. I_破损(残画输入)受损原始图片的像素矩阵,类似补画师手里的古画,像素还在但部分区域已缺失或损坏。
    I破损∈Rh×w×3I_{\text{破损}} \in \mathbb{R}^{h \times w \times 3}
  2. M(蒙版矩阵)与图像同尺寸的黑白二值矩阵,白色标记“此处缺失需修复”,黑色标记“此处完好不要动”,相当于红笔圈出的破损范围。
    M∈{0,1}h×wM \in \{0, 1\}^{h \times w}
  3. F(修复模型)从“残图加蒙版”到修复结果的映射,可以是最朴素的插值算法,也可以是深度神经网络,对应补画师的一身手艺。
    F:(I破损,M)↦I修复F: (I_{\text{破损}}, M) \mapsto I_{\text{修复}}
  4. I_修复(修复结果)模型输出的补全图像,目标是让新补内容与周围纹理自然融合,如同新墨与旧墨浑然一体。
    I修复∈Rh×w×3I_{\text{修复}} \in \mathbb{R}^{h \times w \times 3}

蒙版绘制技巧:圈得准,才补得精

补画师最忌讳“宁大勿小”——把洞外完好的山石也圈进去重画,墨色一新一旧,反而穿帮。圈破损范围(蒙版)是一门讲究分寸的学问。它直接决定了修复师“能在哪里动笔”,是整个修复精度的一半。

绘制蒙版有手动和自动两条路线。手动就是在 Photoshop 或修复工具里用画笔把破损处涂白,适合划痕、折痕这种形状不规则的瑕疵;自动则是先用分割模型(如 SAM)把“水印、路人、玻璃反光”等物体一键选中,再转成蒙版,适合边界清晰的物体移除。关键经验有三条:第一,区域选择宁可略大于破损,也不要小于破损,蒙版漏掉一点残留,修复时就“补不干净”;第二,别圈得太大,给模型自由发挥的区域越多,越容易出现与上下文无关的“发明内容”;第三,边缘羽化,给蒙版边缘加一点模糊过渡,修复结果更容易与旧像素无缝衔接。

修复师下笔前会在破损边缘外扩几毫米做旧色过渡,蒙版羽化就是这个“外扩过渡”。圈太紧像剃头剃破皮,圈太松像把半张脸都剃了——尺度全在经验里。新手最容易犯的错是把蒙版当橡皮擦用,越涂越大,结果 AI 补出满屏“自由创作”,这就是“圈得不准,补得再快也白搭”。

M(x,y)={1,若 (x,y)∈Ω0,若 (x,y)∉Ω\displaystyle M(x,y) = \begin{cases} 1, & \text{若 } (x,y) \in \Omega \\ 0, & \text{若 } (x,y) \notin \Omega \end{cases}
  1. M(x,y)(蒙版函数)对图像中每个像素位置给定取值,标记它是否属于破损待修复区域,像一张逐格打钩的施工表。
    M:(x,y)↦{0,1}M: (x, y) \mapsto \{0, 1\}
  2. 破损区域集合 Ω所有需要修补的像素位置构成的集合,就是补画师红笔圈中的那一块。
    Ω={(x,y)∣该位置破损}\Omega = \{(x,y) \mid \text{该位置破损}\}
  3. 洞内取 1当像素属于破损区域时蒙版取 1,等于向模型下指令“此处请动笔”。
    M(x,y)=1((x,y)∈Ω)M(x,y) = 1 \quad ((x,y) \in \Omega)
  4. 洞外取 0完好区域蒙版取 0,相当于告诉模型“此处保持原样,别碰”。
    M(x,y)=0((x,y)∉Ω)M(x,y) = 0 \quad ((x,y) \notin \Omega)

上下文推理:先读全局,再下笔

真正的补画大师不会对着洞直接画——他会先退后三步,把整幅画从头到尾看一遍,记住近处山的皴法、远处树的姿态,然后才动手。这个“先读全局再下笔”的过程,在 AI 里就叫上下文推理,它是让补全结果“融得进去”的灵魂。

技术上的第一步由编码器完成:它把可见区域的像素逐层压缩成紧凑的特征,相当于把画面信息浓缩成一份摘要。接着,模型在可见区域里寻找与破损处最相似的特征块——比如洞的位置原本是草地,它就在周围的草地纹理里找最像的部分,把这块纹理“搬”过来。这个“找相似”的数学工具叫特征匹配:把破损处的特征 q 与可见区域每个候选特征 k_i 做相似度计算,最像的候选块被加权融合进生成过程。再配合语义理解——识别出这里该是草地、天空还是人脸皮肤——模型才能补对“这一块到底该长什么样”。

就像修复师判断“这洞在溪流处,溪水应从上游流下来,方向不能反”,AI 的理解也是全局的。只盯局部,补出来的纹理可能一模一样,但方向、透视、语义全拧了。上下文推理的意义,就是让 AI 在动笔之前先“看懂整幅画”。

sim⁡(q,ki)=q⋅ki∥q∥⋅∥ki∥\displaystyle \operatorname{sim}(q, k_i) = \frac{q \cdot k_i}{\|q\| \cdot \|k_i\|}
  1. q(查询特征)破损区域中心位置的特征向量,代表“我需要找什么样的纹理来补”,类似修复师心里对缺失山石的预期轮廓。
    q∈Rdq \in \mathbb{R}^{d}
  2. k_i(候选特征)可见区域中某个位置的特征向量,是“候选的纹理素材”,类似修复师在画作其他部分看到的山石笔法。
    ki∈Rdk_i \in \mathbb{R}^{d}
  3. 点积(方向一致性)计算两个特征向量的方向一致性,值越大说明二者越“对味”。
    q⋅ki=∑j=1dqjki,jq \cdot k_i = \sum_{j=1}^{d} q_j k_{i,j}
  4. 模长归一化把点积除以两个向量长度,消除亮度和尺度的干扰,只看方向不看大小,像比较笔法时先忽略浓淡。
    ∥q∥=∑j=1dqj2\|q\| = \sqrt{\sum_{j=1}^{d} q_j^2}
  5. 余弦相似度最终得分落在 -1 到 1 之间,越接近 1 说明破损处与候选处越像,模型就越倾向用这块纹理补全。
    sim⁡(q,ki)→1 表示高度相似\operatorname{sim}(q, k_i) \to 1 \text{ 表示高度相似}

生成网络架构:一笔一笔补全画面

修复师下笔不是一涂了之:先起形、再铺色、后勾纹理,层层推进。深度 Inpainting 的生成网络也是这种“分层画笔”,它决定了一块空洞最终被“画”成什么样。骨架是编码器—解码器结构:编码器把图压成紧凑特征,解码器再把特征展开成完整修复图。这中间有个关键改进叫部分卷积(Partial Convolution)。

普通卷积会把蒙版里无意义的空像素也卷进来一起计算,导致结果发灰发糊,就像修复师拿沾了脏水的笔去补画,越补越脏。部分卷积只让有效像素参与计算,每修一层,有效区域就向外扩张一圈,像水波一样从边缘向中心收拢。复杂场景还会加注意力模块,让模型能跨过很远的距离借用相似纹理;边缘感知则先把边缘轮廓补出来,再上色填纹理,保证结构线条不断裂——好比修复师先勾出山脊线,确认结构连贯后再层层皴染。

结构不顺,纹理再细也是废笔;生成网络里先补边缘、再补纹理,正是同一个道理。部分卷积挡住“脏水”、注意力借来“远方的笔法”、边缘感知先立骨架,这三板斧合起来,就是现代 Inpainting 模型的“补画三绝”。

I^=G(I⊙(1−M), M)\displaystyle \hat{I} = G\big(I \odot (1 - M),\ M\big)
  1. 反向蒙版 (1−M)把蒙版翻转,白色变 0、黑色变 1,标出“哪些可见像素可以读取”,像施工图上只在完好处打勾。
    1−M∈{0,1}h×w1 - M \in \{0, 1\}^{h \times w}
  2. 逐元素相乘将原图中破损区域的像素清零,只保留完好像素作为输入,防止模型“偷看答案”。
    I⊙(1−M)I \odot (1 - M)
  3. 破损位置提示 M把蒙版原样送入网络,告诉生成器“空白处就是需要补的地方”,相当于给修复师一张圈好洞的施工图。
    M 作为第二路输入M \text{ 作为第二路输入}
  4. 生成网络 G编码器—解码器构成的映射函数,负责把可见信息和位置提示一步步翻译成修复结果。
    I^=G(⋅)\hat{I} = G(\cdot)

损失函数优化:三个评委打分

修复师学艺要经师父把关:补完的线条若不连贯,师父会打回去重来。AI 的“师父”就是损失函数,它给每次修复打分,指出哪里不像。最基础的分数是像素重建损失——把修复结果和真实原图逐像素对比,差多少扣多少。

但只看像素就像只检查“颜色深浅”,看不出质感。于是有了感知损失(Perceptual Loss):拿一个预训练神经网络提取特征,在高维语义空间里比较,更贴近人眼对结构的感受;对抗损失(Adversarial Loss)则让一个判别器当“验画师”,专门挑修复结果的破绽,逼着生成器补出足以乱真的纹理。三项按权重相加,就是模型的最终学习目标。

像素损失负责“颜色对得上”,感知损失负责“结构让人信”,对抗损失负责“细节足以乱真”。三个评委各管一摊,加在一起才能把修复师的手艺调教到位。如果只靠一个评委打分,就像只听美术老师夸“颜色好看”却不管形准不准,迟早补出“远看像画、近看吓人”的怪东西。

L=λ1L像素+λ2L感知+λ3L对抗\displaystyle L = \lambda_1 L_{\text{像素}} + \lambda_2 L_{\text{感知}} + \lambda_3 L_{\text{对抗}}
  1. L(总损失)修复模型的总学习目标,数值越低代表修复结果越接近真实,相当于三位评委给出的综合分。
    L∈R≥0L \in \mathbb{R}_{\geq 0}
  2. L_像素(像素重建损失)逐像素比较修复图与原图的差异,管“颜色和明暗对不对”,是基础分。
    L像素=1N∑i=1N(y^i−yi)2L_{\text{像素}} = \frac{1}{N}\textstyle\sum_{i=1}^{N}(\hat{y}_i - y_i)^2
  3. L_感知(感知损失)在预训练网络的高维特征空间比较差异,管“结构和质感像不像”,是专业评委分。
    L感知=∥ϕ(I^)−ϕ(I)∥2L_{\text{感知}} = \|\phi(\hat{I}) - \phi(I)\|^2
  4. L_对抗(对抗损失)由判别器给出的损失,管“能不能骗过验画师的眼睛”,是真实感加分项。
    L对抗=E[log⁡D(I)]+E[log⁡(1−D(I^))]L_{\text{对抗}} = \mathbb{E}\big[\log D(I)\big] + \mathbb{E}\big[\log(1 - D(\hat{I}))\big]
  5. 权重系数三个评委的发言权,比如 λ1=1、λ2=0.1、λ3=0.01,表示以像素损失为主,另两项作微调。
    λ1,λ2,λ3>0\lambda_1, \lambda_2, \lambda_3 > 0

提示词引导:让修复师听懂你的要求

有时主人不看原样,只提要求:“洞补上就行,但把这片留白改成几株淡墨竹。”修复师不但要补缺,还要照主人的意思创作。AI Inpainting 的提示词(Prompt)就是这个“主人的要求”,它让修复从“还原旧貌”升级成“按需创作”。

早期的 Inpainting 只会顺着周边上下文“补回原样”,本质是一种推断。加入文本编码器后,模型可以把提示词(如“蓝天白云下的一片草地”)转化成条件向量,和图像特征合并,共同引导生成方向。提示词能控制的不只是内容,还有风格——“水墨风”“胶片质感”“科幻金属”都会改变补出来的质感。还有工具支持参考图引导:你不描述内容,直接给一张“我希望洞里长这样”的参考图,模型会对着参考图去补。

提示词不是越细越好,就像对修复师交代一句“补成文人画的路子”比把每一笔都规定死更有效——留一点发挥空间,AI 反而能把上下文用得更自然。记住:提示词是“方向”,不是“施工图”;方向对了,手艺才能发挥出来。

I^=G(I⊙(1−M), M, Enc(T))\displaystyle \hat{I} = G\big(I \odot (1 - M),\ M,\ \text{Enc}(T)\big)
  1. T(提示词文本)用户输入的自然语言描述,如“补一片傍晚的湖面”,是主人的口头要求。
    T="补一片傍晚的湖面"T = \text{"补一片傍晚的湖面"}
  2. Enc(T)(文本编码)把文字转成向量,让“语义”变成模型能理解的“数值语言”,类似修复师把主人的心思翻译成构图稿。
    Enc:文本↦Rdtext\text{Enc}: \text{文本} \mapsto \mathbb{R}^{d_{\text{text}}}
  3. 生成网络输入文本向量和蒙版、可见像素一起进入生成网络,相当于在施工图上额外附了一张“设计意向图”。
    (I⊙(1−M), M, Enc(T))\big(I \odot (1 - M),\ M,\ \text{Enc}(T)\big)
  4. 语义引导输出最终补全内容同时服从“周边纹理”和“提示词意图”,两边意见一致时画面最自然。
    I^=G(⋯ )\hat{I} = G(\cdots)

实战工作流程:从残图到完美出片

补画不是一蹴而就:除尘、揭裱、圈洞、补笔、做旧、装裱,每一步都有章法。AI 修复的实战流程同样有条不紊,照着走就能少踩坑。第一步是预处理:把图片裁剪到合适尺寸、降噪、校正色偏,相当于给古画除尘压平,让模型在干净的画面上干活。

第二步是绘制蒙版:用手动画笔或自动分割圈出划痕、水印、穿帮物,这是决定成败的关键一步。第三步进入修复:选择修复模型,必要时加上提示词,调节修复强度、迭代步数等参数。参数调试讲究“小步迭代”——先用低强度跑一版看效果,再逐步加大,别一上来就拉满。修完记得放大检查边缘,看有没有新出现的伪影或模糊。客观指标常用 PSNR(峰值信噪比),数值越高代表修复结果与真实原图的像素差异越小,但最终评判标准还是人眼。

修复师最后一步是“做旧”,让新墨的亮度、色相与旧画统一。你也一样:修复完成后常常要加一点轻微噪点或调色,让 AI 补的区域和原图气息一致,才算真正“出片”。流程走顺之后,你会发现 Inpainting 就像请了一位随叫随到的补画大师——只要你会圈洞、会提要求,它就能还你一幅完整的画。

PSNR=10log⁡10MAX2MSE\displaystyle \text{PSNR} = 10 \log_{10} \frac{MAX^2}{\text{MSE}}
  1. MSE(均方误差)修复图与真实图逐像素误差的平方均值,误差越小说明补得越接近,像检查每笔颜色偏差的平均值。
    MSE=1N∑i=1N(y^i−yi)2\text{MSE} = \frac{1}{N}\textstyle\sum_{i=1}^{N}(\hat{y}_i - y_i)^2
  2. MAX(像素最大值)图像像素可取的最大值,8 位图是 255,即最亮的白色。
    MAX=255MAX = 255
  3. 信号噪声比画面“信号”与“修复误差”的比值,比值越大说明主体信息远大于误差。
    MAX2MSE\frac{MAX^2}{\text{MSE}}
  4. 分贝换算把比值取以 10 为底的对数再乘 10,压缩数值范围,PSNR 通常 20~40dB,30dB 以上肉眼差异已不明显。
    PSNR=10log⁡10(⋅)\text{PSNR} = 10\log_{10}(\cdot)

AI 应用场景

老照片翻新修复

阶段:图像后处理

解决的问题:老照片常有划痕、霉斑、折痕和局部破损,手动用 Photoshop 修补一张需要数小时且要求美术功底。AI Inpainting 只需圈出破损处,几十秒生成自然修复结果,像补画师快速续上断掉的线条。

具体案例:一位家庭摄影师接到“修复奶奶 1978 年结婚照”的需求,照片中缝折痕贯穿人脸。摄影师在修复工具中把折痕涂成蒙版,输入提示词“保留面部特征,延续周围背景纹理”,模型自动补全,最后只需微调肤色就交付了。

电商去水印与去杂物

阶段:图像素材预处理

解决的问题:商品图常有窗外杂物、地面影子、Logo 水印,影响主图质感。人工修掉一个杂物约 10 到 20 分钟;用分割模型自动选中杂物再转蒙版,Inpainting 用周边背景补全,单张只需几十秒。

具体案例:某家居电商要把商品图背景里的路人和电线杆清掉,设计师用 SAM 自动框选障碍物、转成蒙版后批量修复,200 张主图的清理时间从一整天压缩到 40 分钟,还顺带统一了背景质感。

影视后期穿帮擦除

阶段:后期特效合成

解决的问题:拍摄现场常有威亚、话筒杆、现代物件入镜,一帧帧手工擦除工作量巨大。Inpainting 配合追踪技术圈出穿帮物,自动补全真实背景,像修复师把画面里不该有的“墨渍”一点点洗掉。

具体案例:一个短片剧组在街景拍摄中让电线杆和吊杆入了画。后期合成师用蒙版圈出吊杆,配合提示词“原街道墙面纹理”,Inpainting 数秒完成一帧的补全,替代了过去逐帧手绘擦除的低效流程。

Python 演示

python70 行
# -*- coding: utf-8 -*-"""AI图像修复 Inpainting 最小演示合成带破损洞的风景图 用蒙版标出破损优先用 OpenCV Telea 算法 无 OpenCV 退化为平均色补全"""import sysimport numpy as npfrom PIL import Image  def make_damaged_image(size=(320, 240)):    w, h = size    img = np.zeros((h, w, 3), dtype=np.uint8)    img[: int(h * 0.6)] = [135, 176, 250]    img[int(h * 0.35): int(h * 0.65), int(w * 0.1): int(w * 0.45)] = [129, 140, 248]    img[int(h * 0.6):] = [16, 185, 129]    img[int(h * 0.2): int(h * 0.45), int(w * 0.68): int(w * 0.9)] = [244, 63, 94]    hole = (slice(int(h * 0.35), int(h * 0.8)), slice(int(w * 0.5), int(w * 0.75)))    img[hole] = 0    return img  def make_mask(img):    h, w = img.shape[:2]    mask = np.zeros((h, w), dtype=np.uint8)    mask[int(h * 0.35): int(h * 0.8), int(w * 0.5): int(w * 0.75)] = 255    return mask  def load_or_synth(path=None):    if path:        return np.array(Image.open(path).convert("RGB"))    return make_damaged_image()  def inpaint_naive(img, mask, rng_seed=7):    res = img.copy()    visible = mask == 0    avg = img[visible].mean(axis=0)    ys, xs = np.where(mask > 0)    rng = np.random.default_rng(rng_seed)    noise = rng.normal(0, 6, (ys.size, 3))    res[ys, xs] = np.clip(avg + noise, 0, 255).astype(np.uint8)    return res  def inpaint_with_cv2(img, mask, radius=3):    import cv2    return cv2.inpaint(img, mask, radius, cv2.INPAINT_TELEA)  def main():    path = sys.argv[1] if len(sys.argv) > 1 else None    img = load_or_synth(path)    mask = make_mask(img)    try:        repaired = inpaint_with_cv2(img, mask)        method = "OpenCV Telea 扩散修复"    except ImportError:        repaired = inpaint_naive(img, mask)        method = "朴素平均色补全(兜底)"    Image.fromarray(img).save("damaged.png")    Image.fromarray(mask).save("mask.png")    Image.fromarray(repaired).save("repaired.png")    print("修复方式:", method)    print("已生成 damaged.png mask.png repaired.png")  if __name__ == "__main__":    main()
目的:用一张合成风景图模拟“破损图片 + 蒙版”的完整修复流程,优先调用 OpenCV 的 Telea 扩散算法,没装 OpenCV 时退化为四周平均色补全。
  1. img[hole] = 0用切片把洞区域全部涂黑,模拟图片信息缺失,相当于把画上虫蛀的部分挖掉。
  2. mask[int(h*0.35):...] = 255用相同坐标生成白色蒙版,标出“这里需要修复”,对应补画师红笔圈的破损范围。
  3. img[visible].mean(axis=0)统计可见区域的平均颜色,作为兜底修复的“颜料基调”。
  4. inpaint_with_cv2(img, mask, 3)调用 OpenCV 的 Telea 算法,从洞边缘向外扩散补全,是经典基线方法。
  5. except ImportError捕获缺库异常自动降级,保证任何环境都能运行演示。
  6. Image.fromarray(...).save(...)分别保存破损图、蒙版、修复图三张结果,方便肉眼对比效果。

常见误区

误区破损周围有一圈旧痕,我把蒙版涂得大一点,让 AI 把旧痕一起修掉,效果肯定更干净。

正解蒙版不是“橡皮擦范围”,而是“允许 AI 自由发挥的授权区”。圈得太大,模型在大片无信息约束的区域容易发明与原图无关的细节,比如多出一根树枝、一条变形的裂缝。正确做法是蒙版只覆盖破损本身;要连旧痕一起处理,应另做一层轻微羽化的蒙版,或用提示词描述,而不是一把圈大。

为何常见:初学者把蒙版理解成橡皮擦,误以为擦得越干净越好,忽略了蒙版同时是“无中生有”的授权区域。

误区AI 修复老照片,就是把当年被撕掉、被划掉的部分原样找回来,所以五官、文字都应该和原来一模一样。

正解Inpainting 的本质是“合理推测”而非“录像回放”。模型只能根据可见上下文推断“这里原本最可能是什么”,无法保证和真实原图一致。修复人脸破损只能保证“看起来自然、像这个人”,不是像素级还原。期望值设错了,就会觉得“AI 在乱画”。

为何常见:宣传片里“AI 还原名画”的效果太震撼,让人误以为模型存有原图的隐藏高分辨率版本。

误区我把提示词写成“一片带十朵白云的蓝天,草地上有三棵松树、两只羊”,AI 肯定会把洞补得比我描述还精确。

正解提示词是“内容与风格倾向”,不是像素级施工图。Inpainting 的补全主要依赖周边上下文,过于琐碎的提示词会与上下文冲突,导致生成的物体不符合画面透视和光照。建议只描述“类别 + 风格”,例如“延续右侧草地的自然草地”,像对修复师说一句“走文人画路子”就够了。

为何常见:扩散模型(如 Stable Diffusion)里长提示词确实能控制更多细节,初学者把同样的习惯迁移到 Inpainting 上,却没注意两者的生成机制不同。

误区同一张图同一个蒙版,我连点十次重试,总会碰到一次完美结果吧?

正解重试只是在同一随机分布里重新采样。若蒙版不准或提示词与上下文矛盾,采一万次也是在错误方向上抖动。正确流程是:先检查蒙版是否覆盖完整破损、边缘是否羽化,再调修复强度与迭代步数,必要时改提示词。小步迭代比盲目重试高效得多。

为何常见:“多抽几次总能出好图”是自由生成工具的习惯,被无脑迁移到 Inpainting,忽略了它是“约束补全”而非“自由生成”。

误区修复完以后,补出来的区域边缘总有一圈白边,肯定是这个 AI 模型太差了,换个贵的模型才行。

正解边缘白边往往不是模型能力问题,而是蒙版边缘没有做羽化,或蒙版没有向外扩展一到两像素,导致修复区与旧像素之间缺少过渡。专业工具会自动对蒙版做膨胀加羽化,手动绘制时也应把“边缘过渡”当成蒙版的一部分来对待。

为何常见:人们习惯把“看到的结果问题”直接归因于“模型能力不足”,却忽略了蒙版质量这个输入侧的变量。

面试题

Q1. Inpainting 修复图像时需要哪两个核心输入?

单选题 · easy

  • A.破损图片加蒙版← 正确答案
  • B.破损图片加标签
  • C.蒙版加提示词
  • D.提示词加标签

答案:A。破损图片提供可见上下文,蒙版标出“哪里需要补”,二者缺一不可。标签是分类任务的监督信号,提示词只是可选的辅助条件,不能替代破损图片或蒙版。

Q2. 蒙版中的白色区域代表什么含义?

单选题 · easy

  • A.需要修复的缺失位置← 正确答案
  • B.完全完好的原始像素
  • C.已修复完成的最终区域
  • D.被放大的图像细节区域

答案:A。蒙版是一张黑白施工图,白色像素标记“此处有洞请修补”,黑色像素标记“此处完好别乱动”,白色区域就是补画师红笔圈出的待修复范围。

Q3. 老照片修复中 Inpainting 最适合处理哪类问题?

单选题 · easy

  • A.划痕霉斑折痕破损← 正确答案
  • B.图片分辨率过低
  • C.照片颜色严重偏色
  • D.文件体积过于庞大

答案:A。Inpainting 擅长补全缺失区域,划痕、霉斑、折痕都属于局部破损。分辨率低是超分任务,颜色偏色是校色任务,文件体积是压缩任务,都超出 Inpainting 的职责范围。

Q4. 蒙版边缘做羽化(feather)的主要目的是?

单选题 · mid

  • A.让补全区域边缘过渡自然← 正确答案
  • B.让模型训练速度更快
  • C.减小蒙版文件的体积
  • D.让破损处颜色更鲜艳

答案:A。羽化相当于给蒙版边缘加一层渐变过渡,让新补的内容和旧像素之间不是一刀切的硬边界,而是像修复师在破损边缘外扩做旧色过渡一样,无缝衔接。

Q5. 部分卷积(Partial Convolution)解决的核心问题是?

单选题 · mid

  • A.蒙版内空洞像素污染卷积结果← 正确答案
  • B.卷积核尺寸过大显存不足
  • C.图片分辨率低导致纹理丢失
  • D.训练数据太少导致过拟合

答案:A。普通卷积会把蒙版里无意义的空洞像素也卷进计算,导致结果发灰发糊。部分卷积只让有效像素参与,像修复师不用脏水笔补画一样,避免空洞像素“污染”修复纹理。

Q6. 上下文推理阶段模型通常会做哪些事情?

多选题 · mid

  • A.提取可见区域特征← 正确答案
  • B.匹配相似纹理候选块← 正确答案
  • C.理解画面整体语义← 正确答案
  • D.对图片执行 JPEG 压缩

答案:ABC。上下文推理的目标是“先读全局再下笔”:编码器提取可见特征,在可见区域匹配相似纹理,并理解画面语义以判断补什么。JPEG 压缩是存储技术,与推理无关。

Q7. 对抗损失(Adversarial Loss)的主要作用是?

单选题 · mid

  • A.逼修复结果更加逼真自然← 正确答案
  • B.加速蒙版自动生成过程
  • C.降低模型推理时显存占用
  • D.提高修复图片的分辨率

答案:A。对抗损失让一个判别器当“验画师”,专门挑修复结果的破绽,生成器被迫补出足以乱真的纹理细节,从而提升真实感,而不是提升速度或分辨率。

Q8. 感知损失(Perceptual Loss)与像素损失(Pixel Loss)的主要区别在于?

单选题 · hard

  • A.前者在高维特征空间比较← 正确答案
  • B.前者逐像素比较颜色值
  • C.前者只统计灰度亮度差
  • D.前者直接计算文件大小差

答案:A。像素损失逐像素比颜色,感知损失用预训练网络提取特征,在高维语义空间比结构质感,更贴近人眼感受。B 描述的是像素损失,C 和 D 与感知损失无关。

Q9. 修复大范围缺失区域时,以下哪些做法能改善效果?

多选题 · hard

  • A.扩大模型的感受野范围← 正确答案
  • B.用注意力跨区借用纹理← 正确答案
  • C.提示词描述补全内容← 正确答案
  • D.把蒙版面积画得更大

答案:ABC。大空洞需要更大感受野和注意力机制跨距离借用纹理,提示词也能引导补全方向。而把蒙版面积画更大只会增加“自由发挥”区域,反而让补全内容更容易与原图脱节。

Q10. 现有 Inpainting 模型在“物体移除”场景下已知的局限有哪些?

多选题 · extreme

  • A.大空洞需多次迭代修复← 正确答案
  • B.复杂反射倒影难处理← 正确答案
  • C.蒙版边缘过渡易留伪影← 正确答案
  • D.任何场景都能无损还原

答案:ABC。大空洞信息量不足,常需多次迭代;玻璃反光、水面倒影等复杂上下文极难推断;蒙版边缘羽化不到位会出现白边伪影。D 是错误认知,修复是“合理推测”而非“无损还原”,与正文结论一致。