在舞蹈教室里,经验丰富的舞蹈老师观察一位舞者的动作,先在白板上标出肩膀、手肘、手腕、胯、膝盖、脚踝的位置,再用粉笔把这些点连成一根根“骨头”,最后画出一个由线条组成的火柴人动作图。把这张动作图贴在墙上,一位新学员必须严格照着它摆出姿势——身体姿态分毫不能差,但衣服怎么穿、表情怎么做、灯光怎么打,都可以自由发挥。OpenPose 就是那位“舞蹈老师”,负责从一张普通照片中提取姿态骨架;ControlNet 则像一位“严格的形体教练”,拿着骨架动作图,全程督促扩散模型:姿势必须照图做,其余细节由你自由创作。这篇文章,就是把这位“老师”和“教练”的工作流程,一步步讲给你听——从人体关节的识别,到骨骼如何连接,再到 AI 如何照着“火柴人”画出活生生的人物。
掌握姿态控制,等于掌握了 AI 图像生成中最实用的人体操纵术——无论是角色设计、动作迁移还是视觉叙事,你都能让模型精确还原每一个指定姿势,这正是 AIGC 从业者的核心竞争力。
目录
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
姿态估计基础:先看懂“关节地图”
在舞蹈教室里,老师看一个舞者摆出动作,第一步绝不是画衣服、画表情,而是先找“关节”。肩膀、手肘、手腕、胯、膝盖、脚踝,这些能让肢体发生弯折的关键连接点,决定了一个人整体的形态。老师在白板上快速点出这些位置,再用粉笔连出“骨头”,一张动作火柴人就诞生了。对 AI 而言,第一步也是这样:先在图片中找到这些关节点的像素位置,第二步再用标准规则把它们连起来。
在计算机视觉术语里,这些关节点叫“人体关键点”(Keypoint)。姿态估计的任务,就是让算法输出一串坐标——“鼻子在 (x₁,y₁),左肩在 (x₂,y₂)……”。注意,模型并不理解“手肘”这个概念本身,它只是在大量图片中学会了“哪个像素位置看起来像手肘”。这就像老师凭多年经验,一眼就能在人影中认出肘部的位置一样,是一种统计直觉。
为了让所有算法共享同一套“关节命名”,业界广泛采用 COCO 规范:固定 18 个关键点,包括鼻子、双眼、双耳、双肩、双肘、双腕、双胯、双膝、双踝。每个点有固定序号,且按固定拓扑连接——左肩接左肘、左肘接左腕、左胯接左膝、左膝接左踝,左右对称。最终输出到黑色背景上,用白点画关键点、白线画骨骼,就得到一张标准的“姿态图”。用数学语言说,一张姿态图就是一组关键点坐标的集合:
有了这张标准动作图,舞蹈老师就可以把它当成“动作卡”递给任何人。但真正的难点在下一章:当教室里挤着十几个舞者时,老师怎么知道这个手肘属于前面那个人,还是后面那个人?这个“人体装配”问题,正是 OpenPose 的成名绝技。
- 关键点集合K 表示整张姿态图中所有关键点组成的一个集合,就像白板上那串粉笔点
- 坐标对每个关键点用一对像素坐标表示,括号里的两个数字分别对应横向和纵向位置
- 下标遍历下标 i 从 1 取到 N,逐个列出全部关键点,一个都不能漏
- 关键点总数在 COCO 规范中取 N = 18,也就是 18 个标准关节
OpenPose 原理:老师如何分清谁是谁
老师面对一群舞者时,会先用眼睛快速锁定所有“可能的关节”——每个人伸出的手肘、抬起的膝盖,都会在视野里形成一个“候选点”。OpenPose 的第一步同样如此:对每个关键点类型,网络会输出一张“热图”(Heatmap),热图上越亮的位置,越可能是该关键点所在的位置。热图上的每个局部峰值,就是一个候选关节。
但候选点再多,关键问题是“谁和谁属于同一个人”。老师靠什么判断?靠的是“骨骼走向”的直觉:从肩膀出发,朝某个方向延伸一小段距离,那里应该出现一只手肘。这种“骨头经过的地方、骨头朝向的方向”的直觉,在 OpenPose 中对应一个核心概念——PAF(Part Affinity Field,部位亲和场)。
PAF 是一个二维向量场:对每一块骨骼(例如左上臂),模型预测一张与输入图同尺寸的图,图中每个像素存储一个二维向量,指示“如果这块骨骼经过该像素,它的方向应该朝向哪里”。判定两个候选关键点是否应该相连时,算法沿候选点连线均匀采样 PAF 向量,与连线自身的单位方向向量做点积、求平均。得分高,说明这条连线与网络“认为”的骨骼方向高度一致:
最后,用贪心或二分图匹配算法把每对得分最高的候选点连起来,得到完整骨架。这就像老师逐个确认“这根骨头连那边、那根连这边”,最终把每个人完整拼出来。这套“热图找点 + PAF 连线”的两步机制,让 OpenPose 在拥挤舞台上也能把人拆得清清楚楚——姿态估计从此不再只是实验室玩具,而是可控生成的可靠前置工具。
- 候选关节d₁ 和 d₂ 分别是两个待匹配的关键点坐标,比如一个候选肩膀和一个候选手肘
- 采样位置把 d₁ 到 d₂ 的连线均匀分成 L 段,在第 u 个采样点处查看 PAF 向量
- 骨骼方向ê₁₂ 是连线方向的单位向量,代表“如果这是一根骨头,它应有的朝向”
- 点积与平均每个采样点用 PAF 向量与方向向量做点积,再对所有采样点求平均;点积响应越高,说明每个位置都在“确认”这就是骨骼
ControlNet 架构:严格的形体教练
老师的动作图有了,但真正执行动作的是学生——扩散模型。学生很有才华,能凭空画出逼真的服装、皮肤、光影,但如果你只给它一句“画一个站姿的女孩”,它画出来的姿势总是东倒西歪。这时候需要一位“形体教练”站在旁边,这位教练就是 ControlNet。它的任务只有一个:把姿态图变成必须遵守的纪律。
ControlNet 做的事情是:把姿态图作为“条件”,在扩散模型每一步去噪时都“耳提面命”。具体架构上,它复制了 UNet 的编码器部分,做成一个“可训练副本”,专门学习理解姿态图;与此同时,原模型的权重完全冻结——就像教练不会去改写学生的肌肉记忆和基本功,只在旁边纠正动作。这样既利用了预训练模型强大的生成能力,又让新条件不干扰原有本领。
连接副本与原模型的关键部件叫“零卷积”(Zero Convolution)——一个权重初始化为 0 的 1×1 卷积层。训练一开始,零卷积输出全为 0,相当于教练完全不发声,学生按原样发挥;随着训练推进,它逐渐学会“把姿态条件融入原特征”。每一层的融合方式,是让条件特征与原特征逐元素相加,形成新的输出特征:
这种“冻结原模型 + 零卷积起步”的设计,让 ControlNet 既学得快,又不会把原模型带偏。教练一开始完全沉默,后来嗓门越来越大,但始终只在关键处提醒——这正是它能精确控制姿势、却不破坏画质的根本原因。
- 原始特征F_orig 是原 UNet 某一层输出的特征,承载了模型原有的图像理解能力
- 条件特征F_cond 是姿态图经过编码后得到的条件特征,相当于动作卡上的信息
- 零卷积𝒵 是权重初始化为零的 1×1 卷积,让条件特征从“零影响”开始逐步生效
- 逐层融合把条件特征与原特征逐元素相加,得到这一层最终输出
姿态图预处理:把指令写成标准格式
教练手里的“动作卡”不能是随手画的草稿,必须是一张统一格式的标准卡纸。同理,OpenPose 输出的骨架信息在送入 ControlNet 之前,也要经过一系列预处理,让模型读起来“毫不费力”。如果直接拿格式混乱的图喂给模型,就像把写满潦草字迹的便条递给学生,学生只会一头雾水。
首先是骨架绘制:把 OpenPose 输出的关键点和骨骼画到一张黑色背景图上。线条粗细、颜色、点的半径都有约定——通常白点白线、深黑背景。这样做是为了与 ControlNet 训练时的数据分布保持一致,就像动作卡纸上的火柴人永远是同一套笔画规范,模型才能稳定识别。
然后是条件编码与尺寸对齐:图片要被缩放到模型要求的输入分辨率(例如 512×512),缩放比例对整张图统一,防止骨架被拉伸变形。最后做归一化处理:把 0~255 的像素值线性映射到 -1~1 区间,让数值尺度与扩散模型的潜空间匹配。这一步就像把动作卡上的文字统一翻译成标准术语,保证教练和学生之间没有“方言”障碍:
经过这些处理,动作卡就变成了模型“一看就懂”的标准指令。教练把卡纸递给学生时,不用多解释一个字——因为格式早已约定好,学生扫一眼就知道该怎么摆。
- 像素值归一把 0~255 的原始像素值除以 255,缩放到 0~1 区间
- 范围平移乘以 2 再减 1,把 0~1 映射到 -1~1
- 结果范围归一化后,黑色背景对应 -1,白色骨架线接近 +1,中间值对应灰色过渡
可控生成流程:照图施工的舞蹈课
上课铃响了。学生(扩散模型)从一张纯噪声图开始,一步一步“洗”出画面。每一轮去噪,教练都会把动作卡递到眼前:当前的带噪图像、时间步、姿态图、文字描述,一起送入噪声预测网络。姿态图在整条生成链路中持续生效,而不是只在开头看一眼就作罢。
在去噪的每个时间步 t,模型需要预测当前噪声;姿态条件通过 ControlNet 注入后,预测出的噪声轨迹会被“掰”向与动作卡一致的分布。于是,画面中的人体轮廓逐渐朝指定姿势收敛——腿的位置、手臂的角度、躯干的朝向,都严格贴合动作卡。这就是“姿态输入”与“扩散模型融合”两个环节的协同效果。
但 ControlNet 并没有规定衣服款式、发色、背景光影,这些“自由发挥”的空间全部交给扩散模型和文字提示词。最终生成的图中,人物姿势骨架误差可以很小,而外观细节千变万化。在质量优化方面,生成时通常还会调节分类器自由引导强度(CFG Scale)、采样步数,必要时加入负面提示词,让姿势更稳、画质更高。整个生成过程可以概括为噪声预测网络在双重条件下的逐轮去噪:
这堂舞蹈课的本质,就是“姿势照卡、风格自由”。教练只负责姿态这一个维度,学生负责其余所有想象力。两者配合,就能在几秒钟内得到一张既符合指定姿势、又充满个人风格的作品。
- 噪声预测网络ε_θ 是扩散模型中负责预测噪声的神经网络,θ 是它的参数
- 带噪潜变量z_t 是第 t 步的潜在表示,相当于正在“显影”中的照片底片
- 时间步t 是当前去噪步数,从噪声较多的早期逐步走向清晰后期
- 双重条件c_pose 是姿态条件(来自 ControlNet),c_text 是文字提示条件
应用场景:舞蹈教室的多种用法
这套“老师提取动作 + 教练监督姿势”的方法,在舞蹈教室之外有大量用武之地。游戏原画师想要“一个角色摆出战斗姿势”,不需要用文字反复描述,而是直接从参考照片提取骨架图,再让模型批量生成不同服装、不同种族、不同武器下的同一姿势角色。这就是角色设计场景下的典型工作流。
动作迁移是另一个高频场景:把真实人物的动作姿势迁移到虚拟角色身上,保持姿势不变、身份与风格改变。姿态编辑则更灵活——你可以在骨架图上直接拖动关节位置,生成的人物姿势就随之变化,像在给火柴人拗造型。在视觉叙事中,漫画作者用骨架图锁定每一格的人物动作,再统一生成风格,保证分镜之间的姿态连贯。
质量评估时,可以拿生成图像重新跑一遍姿态估计,再将检测到的关键点与目标骨架对比,计算平均关键点误差。误差越小,说明“姿势还原”越成功。这个误差度量的数学表达很简洁:
从角色设计到故事分镜,OpenPose 与 ControlNet 的配合,让“姿势”从一句含糊的自然语言,变成可精确编辑、可批量复用、可量化评估的工程参数。那位舞蹈老师和形体教练的搭档,正在成为 AI 内容创作流水线上最可靠的一环。
- 预测与目标p_i 是目标骨架的关键点,p̂_i 是生成图像重新检测出的关键点
- 欧氏距离竖线加下标 2 表示两点间的直线距离,用来量化“差多远”
- 平均误差对全部 N 个关键点的距离求平均,得到整体姿势偏差
AI 应用场景
游戏角色姿态批量生成
阶段:条件生成(Conditional Generation)
解决的问题:原画师想用文字描述一个精确姿势非常困难,“站立、右手叉腰、左脚前伸”这类描述充满了歧义,扩散模型经常“自由发挥”导致姿势走样。姿态控制直接用骨架图锁定姿势,画师拖拽关节即可快速迭代不同姿态,彻底告别“姿势猜谜”。
具体案例:某独立游戏团队需要 100 张不同角色的战斗姿态草图。画师先用 OpenPose 从真人参考照片中提取骨架,再用 ControlNet 批量生成不同服装、种族、武器下的同一姿势角色,一周的工作量压缩到一天完成。
电商模特动作迁移
阶段:图像编辑 / 动作迁移
解决的问题:同一套衣服要在多个模特身上展示同一组标准动作,传统方法需要真人重拍,成本高且动作难以统一。用 OpenPose 提取标准动作骨架,再配合 ControlNet 将动作迁移到任意体型上,姿势完全一致、服装细节自由变换。
具体案例:某服装公司的产品图由一位模特拍摄完成,需要把她的招牌动作复用到其他体型的虚拟试衣图上。团队通过骨架图 + ControlNet 生成不同身材、不同肤色的同姿势模特图,再进行人工精修,大幅降低了拍摄成本。
漫画分镜与视觉叙事
阶段:创意内容生产
解决的问题:漫画和动画分镜要求人物动作连贯、叙事清晰,纯文本生成难以控制每格的动作一致性。姿态控制让创作者用简单骨架锁定每个分镜的动作,再统一生成风格,保证跨格的姿态连贯与角色统一。
具体案例:一位漫画作者用 OpenPose 从自己摆拍的照片中提取动作骨架,再通过 ControlNet 生成多角色、同姿势的插画,用于短篇动态漫画的分镜制作,省去了大量传统绘画起草时间。
Python 演示
"""OpenPose 部位亲和场(PAF)简化演示: 用亲和分数匹配关节并组装骨骼"""import math import numpy as np class PAFMatcher: def __init__(self, paf_maps): self.paf_maps = paf_maps # {"骨骼名": (H, W, 2) 向量场} def affinity(self, kp_a, kp_b, bone_name): """沿关节连线采样 PAF 向量, 与骨骼方向点积求平均""" x1, y1 = kp_a x2, y2 = kp_b dx, dy = x2 - x1, y2 - y1 length = math.hypot(dx, dy) if length < 1e-6: return 0.0 ux, uy = dx / length, dy / length total = 0.0 samples = 10 for s in range(1, samples + 1): px = int(x1 + dx * s / samples) py = int(y1 + dy * s / samples) vec = self.paf_maps[bone_name][py, px] total += ux * vec[0] + uy * vec[1] return total / samples def match(self, our_kps, their_kps, bone_name, threshold=0.2): """贪心匹配: 为每个左侧关节找亲和分最高的右侧关节""" matched = [] used = set() for idx, kp_a in our_kps.items(): best_score, best_jdx = threshold, None for jdx, kp_b in their_kps.items(): if jdx in used: continue score = self.affinity(kp_a, kp_b, bone_name) if score > best_score: best_score, best_jdx = score, jdx if best_jdx is not None: matched.append((idx, best_jdx, best_score)) used.add(best_jdx) return matched def build_bone_paf(height, width, start, end, radius=4): """在线段附近生成指向 end 方向的合成 PAF 向量场""" x1, y1 = start x2, y2 = end dx, dy = x2 - x1, y2 - y1 length = math.hypot(dx, dy) if length < 1e-6: return np.zeros((height, width, 2), dtype=np.float32) ux, uy = dx / length, dy / length yy, xx = np.mgrid[0:height, 0:width] t_step = np.clip(((xx - x1) * dx + (yy - y1) * dy) / (length * length), 0, 1) px = x1 + t_step * dx py = y1 + t_step * dy dist = np.sqrt((xx - px) ** 2 + (yy - py) ** 2) paf = np.zeros((height, width, 2), dtype=np.float32) paf[..., 0] = ux paf[..., 1] = uy paf *= (dist < radius)[..., None] return paf def main(): size = 64 # 两个左肩候选与两个左肘候选, 只有一对属于同一个人 shoulder_a = (20, 18) shoulder_b = (44, 20) elbow_a = (18, 32) elbow_b = (46, 34) matcher = PAFMatcher({"左上臂": build_bone_paf(size, size, shoulder_a, elbow_a)}) pairs = matcher.match( {0: shoulder_a, 1: shoulder_b}, {0: elbow_a, 1: elbow_b}, "左上臂", ) print("正向 PAF 匹配结果(左肩 -> 左肘 -> 亲和分):") for s_idx, e_idx, score in pairs: print(f" 左肩{s_idx} -> 左肘{e_idx}, 分数 {score:.2f}") wrong_paf = build_bone_paf(size, size, elbow_a, shoulder_a) wrong_matcher = PAFMatcher({"左上臂": wrong_paf}) wrong_pairs = wrong_matcher.match( {0: shoulder_a, 1: shoulder_b}, {0: elbow_a, 1: elbow_b}, "左上臂", threshold=-1.0, ) print("反向 PAF 对照结果(分数为负说明方向信息关键):") for s_idx, e_idx, score in wrong_pairs: print(f" 左肩{s_idx} -> 左肘{e_idx}, 分数 {score:.2f}") if __name__ == "__main__": main()
vec = self.paf_maps[bone_name][py, px]取出该像素位置的 PAF 关联向量,相当于查询“这里如果有骨头,它朝哪个方向”total += ux * vec[0] + uy * vec[1]用点积衡量 PAF 向量与候选骨骼方向的契合程度,值越大越像同一根骨头for s in range(1, samples + 1)沿两关节连线均匀采样,覆盖整段骨骼区域best_score, best_jdx = threshold, None低于阈值的候选配对直接放弃,避免把不相关的关节硬凑在一起if best_jdx is not None:只有找到超过阈值的配对才记录,防止生成错误的骨骼used.add(best_jdx)一个关节只能属于一个人,匹配过就不再参与其他配对paf *= (dist < radius)[..., None]只在骨骼线段附近生成 PAF 信号,模拟真实网络学到的局部方向场
常见误区
误区反正 ControlNet 只需要一张火柴人图片,OpenPose 检测得不准也没关系,生成时模型会重新画一遍。
正解姿态图是“动作要求单”。如果关键点偏移、骨骼连错,生成模型会忠实执行错误的姿势,出现手腕对到肘部、站姿歪斜、多关节错位等问题。OpenPose 的检测精度直接决定最终生成结果的人体结构是否合理,正如舞蹈老师标错关节位置,学生再努力也摆不对姿势。
为何常见:姿态图看起来只是简单的线条画,不像真实照片那样“信息丰富”,初学者容易低估它对生成质量的约束力。
误区训练 ControlNet 之后,原来的 Stable Diffusion 模型权重会被更新,以后不用 ControlNet 时生成结果也变了。
正解ControlNet 使用“可训练副本 + 零卷积”方案,原模型权重完全冻结。副本负责学习如何把姿态条件融入特征,零卷积保证训练初期条件注入不破坏原模型。推理时只是把条件特征叠加回去,去掉 ControlNet 后原模型行为与训练前完全一致。
为何常见:“训练”这个词天然让人以为所有权重都会被修改,而“可训练副本”这个精妙设计容易被初次接触的人忽略。
误区OpenPose 的原理很简单:先找到所有关节,再把距离近的关节连起来就行。
正解距离近的关节不一定属于同一个人。PAF 是遍布每个像素的二维向量场,描述的是“骨骼经过此处时的方向”。匹配多个候选关节时,要沿连线采样 PAF 并积分,再用二分图匹配找全局最优组合,才能解决多人互相遮挡的场景。
为何常见:看到输出是线条骨架,容易倒推成简单的“连线算法”,而 PAF 这种隐式向量场无法直观看到,所以常被误解。
误区既然 ControlNet 接受图片条件,那我随便给一张人物照片当条件输入不就行了吗?
正解ControlNet 的 OpenPose 专用模型是在“黑底白线骨架图”上训练的。输入分布不一致(比如彩色人像照片)时,条件特征偏移,生成效果会迅速劣化。正确做法是先跑 OpenPose 提取骨架图,再做预处理,最后才送入 ControlNet。
为何常见:ControlNet 的通用接口是“图像到图像”,容易让人忽略每个专用控制模型对输入格式的苛刻要求。
面试题
Q1. OpenPose 中 PAF(部位亲和场)的主要作用是什么?
- A.检测人体的肤色区域位置
- B.预测关键点间的关联向量← 正确答案
- C.对图像进行降噪处理优化
- D.自动生成文字提示词驱动
答案:B。PAF 为每块骨骼预测一个二维向量场,用来描述骨骼经过每个像素时的方向,从而判断候选关节之间是否应该相连。A 是肤色分割、C 是图像去噪、D 是文本生成,都与 PAF 无关。
Q2. COCO 标准中人体姿态估计通常包含多少个关键点?
- A.12 个关键点
- B.14 个关键点
- C.18 个关键点← 正确答案
- D.25 个关键点
答案:C。COCO 规范定义了 18 个关键点:鼻子、双眼、双耳、双肩、双肘、双腕、双胯、双膝、双踝。这个标准保证了不同模型之间的关键点序号和连接拓扑可以互通,就像舞蹈教室里统一规定的关节命名。
Q3. ControlNet 中的“零卷积”是指?
- A.权重初始化为零的卷积层← 正确答案
- B.卷积核尺寸为零的算子
- C.不参与梯度更新的卷积
- D.输出内容全部为零的网络层
答案:A。零卷积是权重初始化为 0 的 1×1 卷积,训练开始时输出为 0,不会破坏原模型,随训练逐步学会注入条件特征。它不是卷积核尺寸为 0,也不是永久输出 0 或冻结不训练。
Q4. 贪心二分匹配中配对分数低于阈值时,通常做法是?
- A.仍然强制执行连接的配对
- B.放弃该候选关节的配对← 正确答案
- C.随机挑选一个点进行连接
- D.无条件提高所有点的分数
答案:B。阈值是一个“信任底线”,分数低于它说明 PAF 不认为这两点有骨骼连接,强制配对会生成错误骨架。放弃该配对比乱连更可靠,这和老师不会硬把相隔很远的两个点说成一根骨头是一个道理。
Q5. 姿态图送入 ControlNet 前通常需要做什么处理?
- A.添加高斯噪声扰动增强
- B.尺寸对齐与数值归一化← 正确答案
- C.转成单一灰色通道输入
- D.进行水平翻转镜像增强
答案:B。姿态图需要统一缩放到模型指定的分辨率(如 512×512),并将像素值归一化到 -1~1,保证输入分布与训练数据一致。加噪声、翻转等属于数据增强手段,不是送入模型前的必要处理。
Q6. 多人场景下,OpenPose 区分“哪个手肘属于哪个人”的关键机制是?
- A.使用颜色聚类分割算法
- B.使用最大池化特征采样
- C.用 PAF 与二分图匹配求解← 正确答案
- D.使用图像轮廓检测器实现
答案:C。OpenPose 用 PAF 关联向量判断候选关节之间的连接强度,再用二分图匹配找到全局最优的关节组合,从而把每个人完整拼出来。颜色聚类和轮廓检测都不能解决关节归属歧义。
Q7. 在 OpenPose 的关联向量计算中,沿候选点连线采样后做什么运算?
- A.计算采样点颜色的平均值
- B.与连线方向做点积再求平均← 正确答案
- C.对采样点做卷积增强边缘
- D.计算采样点的梯度直方图
答案:B。每个采样点的 PAF 向量与连线的单位方向向量做点积,再对所有采样点求平均。点积值高说明 PAF 认为“骨骼方向”和这条连线一致,是可靠的骨架候选;颜色、梯度都与 PAF 机制无关。
Q8. 关于 ControlNet 的可训练副本,下列说法正确的是?
- A.训练后原模型权重会同步更新
- B.副本只复制 UNet 编码器部分← 正确答案
- C.副本数量等于扩散采样步数
- D.副本在推理时仍在进行训练
答案:B。ControlNet 复制 UNet 的编码器(含中间块)作为可训练副本,原模型权重冻结不变。副本数量与采样步数无关,推理时副本只做前向传播、不再训练,这些说法都不成立。
Q9. 关于 ControlNet 条件特征融合,下列说法正确的是?
- A.编码器各层输出与条件特征相加← 正确答案
- B.解码器通过跳跃连接受到条件影响← 正确答案
- C.条件特征只在第一步和末步生效
- D.融合时用全连接替换所有原特征
答案:AB。ControlNet 在编码器每一层把条件特征与原特征逐元素相加,融合后的特征经跳跃连接传到解码器,因此解码器也间接受到条件控制。条件在每一步去噪中都生效,且原特征不会被替换,C、D 是常见误解。
Q10. PAF 计算中采样点数量对匹配结果的影响是?
- A.采样越多越能抵抗局部噪声干扰← 正确答案
- B.采样越少计算快但可能误匹配← 正确答案
- C.采样点需覆盖整条关节连线← 正确答案
- D.采样点数量决定颜色通道数
答案:ABC。采样点覆盖整条连线,多点平均能平滑掉个别像素的噪声;采样过少则可能漏掉骨骼中段的信息,导致误匹配。采样点数量是算法超参数,与图像的颜色通道数无关。