过年拍一张全家福,一百多号人挤在一起。小姨指着照片问:“站第三排、穿红裙子的那位阿姨是谁?”你几乎不用想,目光顺着描述扫过去,手指在照片上画了个圈。这个看似简单的动作,正是本文的主角——视觉Grounding(视觉定位):让机器听懂一句自然语言,然后在图像里找到对应的那个人,框出那片区域。 十年前的AI就像一本“脸盲的通讯录”:先把所有人认出来,再拿着描述一个个对号,两步走,又慢又容易出错。今天的统一框架把“认人”和“对号”合并成一次端到端的手势:用一个模型同时理解“图里有什么”和“话里指什么”。更神奇的是,模型面对从没见过的新物种、新款式,也能凭着语言描述在图中圈出来,这就是开放词汇检测。而Grounding DINO,正是这条路上最耀眼的“金牌管家”。从一张全家福出发,我们一起看看这套本领是怎么炼成的。
掌握视觉Grounding与统一框架,你就能设计图文检索、零样本检测与跨模态系统——这是多模态AI落地最抢手的工程师能力。
目录
可视化演示
展示跨模态融合架构、开放词汇零样本检测能力及检测与指代统一框架,理解视觉Grounding核心技术。
本节配有交互动效(进入视口后自动加载,约 3KB)。
跨模态融合架构 图像特征与文本特征经跨模态融合模块交互 融合后同时输出检测结果和定位区域 Image + Text → Cross-modal Fusion → DET + REC 跨模态融合是视觉Grounding的核心架构
任务定义:一句话,圈出照片里的那个人
回到全家福。小姨那句话里藏着两个关键信息:位置(第三排)和外观(红裙子)。你能听懂,是因为语言和画面在你脑子里共享同一套“人物档案”。AI 要做的事完全相同:输入一张图片和一句指代表达(referring expression),输出一个边界框,把目标精确圈起来。这个任务在学术圈名叫指代表达理解,英文缩写 REC。
注意,“指代表达”不一定是完整句子,也可以是一个短语,比如“左边那只戴蓝帽子的企鹅”。它和普通目标检测最大的区别是:检测永远面对固定的类别清单(人、车、猫……),而指代表达是开放的、可以任意组合的一句话。模型必须把语言中的每个词都和画面里的区域对上,才能定位准确。
那怎么判断模型圈得准不准?我们把模型输出的框和人工标注的真实框的重叠程度量化,最常用的指标叫 IoU(交并比,Intersection over Union)。IoU 越高说明框得越准,一般超过 0.5 就算命中。常用数据集有 RefCOCO、RefCOCO+ 和 RefCOCOg,它们给 COCO 图片中的物体配了大量口语化描述,是训练和评测 Grounding 模型的“标准考场”。
回到小姨的画圈动作:她其实也在心里算了一个"IoU"——她圈的圈和真实的人重叠得越满,我们就越确定她找对了人。机器不过是把这个直觉变成了可计算的公式,再用成千上万张全家福把它练成肌肉记忆。
- 交集面积模型预测框与真实框重叠的部分,重叠越大,说明框的位置越贴合。
- 并集面积两个框覆盖的总面积,重复部分只算一次,等于两个框的面积之和减去交集。
- 比值交集占并集的比例就是 IoU,范围在 0 到 1 之间;越接近 1,定位越精准。
统一建模:把两步跑腿合成一步
以前家里要找人,管家会分两步:先翻完整本相册,把每个人都认出来(这就是目标检测);再拿着小姨的描述,挨个对号入座(这就是文本匹配)。两步各有一个专职小组,中间还要交接,效率低,还容易传错话——检测漏了人,匹配再准也白搭。这就是传统两阶段 Grounding 的痛点:错误会累积。
统一框架的思路是:撕掉那本“通讯录”,让同一个模型一边看图、一边听描述,直接输出框。检测分支和指代分支共享同一个视觉骨干(比如 Swin Transformer),训练时把检测数据和指代数据混在一起喂给模型,让两条任务彼此借力。检测数据教会模型“什么是物体”,指代数据教会模型“怎么听人话”,互不冲突,反而互相增强。
在实现上,统一框架把两个任务的损失合在一起:检测损失管“框得准”,指代损失管“指的是对”。训练时用一个权重 λ 平衡两者。因为共享特征,模型不需要为每个任务单独存一套参数,推理时也只需一次前向计算,速度和精度都得到提升。
就像管家把“认人册”和“描述卡”订成一本合订本,翻一页就能同时看到两边信息。统一建模的本质,就是把物理上分开的两趟跑腿,合并成一次同行。
- 检测损失负责让模型输出的框和类别逼近真实标注,衡量“有没有找准物体”。
- 指代损失负责让文本线索与对应区域的对齐分数最高,衡量“有没有听懂描述”。
- 平衡系数λ 控制两项损失谁更重要,通常靠验证集调参决定。
跨模态对齐:给线索和照片办“认亲会”
管家要完成“找红裙阿姨”这个任务,得先做两件准备:把“红裙”这个词翻译成一张特征卡片(颜色偏红、在腰以下),再把照片里的每个人也做成卡片(位置、颜色、形状)。然后他拿着线索卡片,在人群里挨个比对,谁最像就选谁。这个“做卡片”和“做比对”的过程,就是跨模态对齐。
具体来说,文本一侧用 BERT 或 CLIP 的文本编码器,把句子变成一串向量(token embedding);图像一侧用 Swin、ResNet 这样的视觉编码器,把图片变成一张特征图,每个位置对应原图一个区域。两种特征最初在完全不同的“语言”里,没法直接比较。于是模型用对比学习拉近它们:匹配的图文对在向量空间里靠近,不匹配的推远。这就是 CLIP 那套“图文配对”训练的底层逻辑。
训练时,模型会看到大量“图片—描述”配对样本。每张图配一句正确描述(正样本),再随机配几句错误描述(负样本)。InfoNCE 损失让正样本的相似度尽可能高、负样本尽可能低。训练完成后,“红裙阿姨”这个文本向量,会自动落在照片里红色区域特征向量的附近——语言和视觉从此在同一个语义空间里“说同一种方言”。
办完这场“认亲会”,照片和语言不再是两个世界的陌生人。之后不管是检测、检索还是 Grounding,都在这套对齐好的语义空间里进行,找人也就不必再“鸡同鸭讲”了。
- 相似度函数sim 常用余弦相似度,度量图像特征 v 和文本特征 t 的方向一致性。
- 温度系数τ 控制相似度分布的尖锐程度,τ 越小,模型对“像不像”越敏感。
- 归一化分母分子是正样本得分,分母是正样本加 N−1 个负样本的得分总和,整个式子就是一个“认出正样本”的概率。
端到端检测:不要中介的 DETR 范式
传统检测很像请中介找房:先在海量位置里生成一堆候选框,再用后处理规则(NMS 非极大值抑制)把重复的、重叠的框删掉,折腾一圈才敢交付。中介多了,流程就长,错误也容易在“交接”中产生。端到端检测器 DETR 决定不请中介了:整个模型就是一套 Transformer,输入图片,直接输出一个“框的集合”。
DETR 的做法叫集合预测(set prediction):模型一次预测 N 个框及其类别,N 远大于图中物体数量,多余的框会被预测成“背景”。训练时,预测的 N 个框要和真实框做最优配对,这个配对问题用匈牙利算法(二分图匹配)解决:让总匹配代价最小。代价包含类别是否匹配、框的 L1 距离和 IoU 惩罚。整套流程完全可微,不需要 NMS、不需要锚框、不需要手工设计候选生成。
这个范式对 Grounding 的统一框架至关重要:因为预测的是“一个集合”,模型天然能同时处理“检测所有物体”和“定位某个被描述的物体”两种任务。只要把类别条件换成文本条件,集合预测就变成了指代定位。Grounding DINO 正是站在 DETR 的肩膀上,把文本信号融进这套无中介的流程里。
去掉中介后的检测器,就像一位直接和房东对接的管家:没有层层转包,指令从“找红裙阿姨”到“框住她”一气呵成。错位、漏传、重复劳动这些老毛病,都在端到端的设计里被顺手治好了。
- 预测集合模型输出的 N 个预测结果,每个包含类别概率和框坐标,记作一组。
- 排列 σ一个排列表示“哪个预测框配给哪个真实框”,共有 N! 种配法。
- 最小化总代价匈牙利算法在 N! 种排列中找到总匹配代价最小的一种,让每个真实框都有唯一且最合适的预测框。
开放词汇:没见过的人也能找到
全家福里每年都会出现新面孔——新女婿、新媳妇、刚满月的宝宝。管家从没在名单上见过他们,但只要你说“戴圆帽、拄拐杖的老奶奶”,他依旧能在一百多号人里把你指认出来。因为他不是靠背名单找人的,而是靠“特征描述”理解一个人。这就是开放词汇检测(open-vocabulary detection)的直觉。
传统检测器的最后一个分类层,是一个固定长度的向量:训练时定好 80 类,它就永远只能识别这 80 类,遇到新类别只能干瞪眼。开放词汇检测把“类别”本身也变成文本:把类别名(比如“老奶奶”)用文本编码器变成向量,再和图像区域特征算相似度。区域和谁最像,就把它识别成谁。这个“谁”不是训练时写死的,而是推理时临时由你提供的词汇表决定的。
这种能力来自视觉—语言预训练:模型在数亿对图文数据上学会把“词的意思”和“画面的样子”对齐。于是哪怕“反光背心”“青花瓷瓶”这类冷门词在检测训练中从未出现,只要文本编码器认识这个词,模型就能根据语义把它从图中找出来。Grounding DINO、GLIP 等模型都具备这种能力,它们把检测从“背答案”升级成了“按描述解题”。
于是管家手里的名单册升级成了一本“特征词典”:不需要认识每个人的名字,只要听得懂描述,新面孔也能一秒锁定。开放词汇,就是把“认人”这件事从记忆题变成了理解题。
- 区域特征f_v(x) 是图像区域 x 经过视觉编码器后的特征向量,代表“这片长什么样”。
- 类别文本特征f_t(c) 是类别名 c 经过文本编码器后的向量,代表“这个词什么意思”。
- 任意词典求和分母对当前任务任意给定的类别集合 C 求和,类别数不固定,所以叫“开放词汇”。
Grounding DINO:金牌管家登场
前面几节像是金牌管家的采购清单:需要统一框架、跨模态对齐、端到端检测、开放词汇。Grounding DINO 把它们全部装进了一个模型,成为视觉 Grounding 领域最著名的“金牌管家”之一。它的名字就很直白:Grounding(做定位)+ DINO(一个强大的端到端检测器)。
Grounding DINO 在 DINO 检测器骨架上增加了文本分支。句子先经过 BERT 编码成文本特征;图像经过 Swin 编码成多尺度特征图;两者进入跨模态融合模块,你中有我、我中有你地互相“对表”。最巧妙的是文本引导查询(text-promoted queries):原本 DETR 的 object queries 是随机初始化的“找什么”探针,Grounding DINO 用文本特征给这些探针“点名”,让它们一开始就重点找“描述提到的东西”。
在解码器里,每个 query 通过交叉注意力不断从图像特征里抽取信息,同时与文本 token 做对齐,最终输出框和“该框对应哪个词”的对应关系。训练时使用对比损失:让每个框的特征和它对应的词 token 相似度高,和其他词低。这让 Grounding DINO 不仅能框出目标,还能做到框—词一一对应,在 RefCOCO 系列和开放词汇检测基准 LVIS 上都取得了领先成绩。
如果说统一框架是“合订本”,Grounding DINO 就是把合订本翻烂了的金牌管家:文本引导查询让他一进门就直奔目标,跨模态融合让他每看一层照片都重新对照一遍线索。找得快、认得准,还能认出新面孔,难怪它成了多模态检索和零样本检测落地时最常用的起跑线。
- 查询 Q来自文本增强的 object queries,每个 query 代表“我要找什么”。
- 键与值 K、V来自图像特征(融合了文本信息),K 决定“哪里像”,V 提供“具体内容”。
- 缩放点积除以 √d 防止点积过大导致 softmax 梯度消失,让注意力权重更稳定。
前沿与挑战:全家福越拍越大
全家福的规模在变大:从单张照片变成一段家庭录像,从“找出红裙阿姨”升级成“红裙阿姨旁边是谁”“她刚才在做什么”。新一代多模态大模型(如 GPT-4V、Qwen-VL、Ferret、Shikra)开始把 Grounding 变成一种对话能力:模型把坐标当作特殊 token,一边生成语言一边输出框,回答“图中第几排第几个”这类问题。这种模型叫 MLLM(多模态大语言模型)。
更大的模型需要更大的“全家福相册”。真实指代标注非常昂贵,于是研究者用程序合成描述、用现成检测器做伪标注、用大模型生成多样化表达,把训练数据扩大了几个数量级。评测方面,RefCOCO 家族依然是指代理解的基准考场,Flickr30K Entities 侧重短语定位,LVIS 则考验开放词汇下的长尾类别。
挑战也很明显:指代表达里的关系与推理(“站在红裙阿姨左边的戴帽者”)常常让模型犯晕;长尾描述在评测中占比高但训练数据稀少;大模型虽然能说会道,输出坐标的精度却往往不如专用检测器。未来方向是把大模型的“理解力”和专用模型的“定位精度”结合起来——这恰恰是统一框架继续演进的舞台。
从一张静止的全家福,到能对话的动态相册,Grounding 的边界正在被一点点推宽。对工程师来说,好消息是:无论技术怎么演进,“把语言和画面对齐”这一核心命题始终不变。掌握统一框架的思路,你就拿到了打开多模态未来的那把钥匙。
- 条件输入模型的输出不仅依赖前面的词 w<t,还依赖图像特征 v 和用户指令 x。
- 自回归生成每步只预测下一个 token,坐标也被写成 token 序列,一路生成到结束符。
- 累乘取负对数所有 token 的条件概率连乘再取负对数,就是标准的语言模型训练损失,鼓励模型把坐标说得更准。
AI 应用场景
电商图文检索与精准定位
阶段:跨模态检索 / 多模态特征对齐
解决的问题:用户想买“模特图里最左边那件红色连衣裙”,传统关键词搜索只能匹配整条标题,无法定位到具体商品区域,检索结果常常张冠李戴。Grounding 模型直接把描述映射到图像中的对应商品框,让“指哪买哪”成为可能。
具体案例:某服饰电商平台接入 Grounding 能力后,用户在详情页输入“第二排衣架上那件格纹衬衫”,系统即时圈出目标并跳转商品卡片。背后的模型以统一框架在商品图文对上做对比学习,再配合开放词汇,让新上架款式无需重新训练就能被检索。
机器人抓取与指令跟随
阶段:视觉定位 / 具身智能指令解析
解决的问题:仓储机器人只认固定货架编号,听不懂“蓝色马克杯旁边那个不锈钢碗”这类自然语言。统一框架让机器人把语言指令和视觉特征对齐,一步输出目标坐标,省去先检测全部物体再匹配的繁琐流程。
具体案例:某智能仓库试点中,机器人接到语音指令“抓取托盘左上角的黄色零件盒”,通过 Grounding 模型在相机画面中直接框出目标,再交给机械臂完成抓取。开放词汇能力让机器人面对从未录入系统的新零件也能定位。
零样本安防巡检
阶段:开放词汇检测 / 零样本识别
解决的问题:传统安防模型只能识别训练时写死的类别,遇到“穿反光背心的人”“提红色灭火器的人”这种组合式描述就失效。开放词汇检测把类别名当作文本输入,任何新目标只要描述得出来,就能被定位。
具体案例:某变电站部署巡检系统,运维人员通过平台输入任意描述:“第二根电杆旁穿黄色工装的人员”,系统立即在监控画面中圈出目标。新出现的异常场景无需重新训练模型,真正做到了“边说边找”。
Python 演示
import numpy as np class SimpleGrounding: """Minimal unified framework: align region features with text.""" def __init__(self, dim=64): self.dim = dim self.rng = np.random.default_rng(7) # simulate the linear projection learned by vision-language pretraining self.proj = self.rng.normal(size=(dim, dim)) def text_feat(self, words): # bag-of-words style text encoding (real systems use BERT/CLIP) vec = np.zeros(self.dim) for word in words: seed = sum(ord(ch) for ch in word) % 97 vec = vec + np.sin(np.arange(self.dim) * seed) return self.norm(vec) def vis_feat(self, raw): return self.norm(np.dot(raw, self.proj)) def norm(self, v): return v / (np.linalg.norm(v) + 1e-9) def match(self, region_feats, words): # unified scoring: detection candidate vs text clue similarity t = self.text_feat(words) scores = [float(np.dot(self.vis_feat(f), t)) for f in region_feats] return int(np.argmax(scores)), scores @staticmethod def iou(a, b): ix = max(0, min(a[2], b[2]) - max(a[0], b[0])) iy = max(0, min(a[3], b[3]) - max(a[1], b[1])) inter = ix * iy union = (a[2] - a[0]) * (a[3] - a[1]) + (b[2] - b[0]) * (b[3] - b[1]) - inter return inter / union if union > 0 else 0.0 def main(): model = SimpleGrounding() rng = np.random.default_rng(42) regions = [rng.normal(size=model.dim) for _ in range(4)] clues = [["red", "dress"], ["back", "row", "uncle"]] for words in clues: idx, scores = model.match(regions, words) print("clue [%s] -> best region %d, score %.3f" % (" ".join(words), idx + 1, max(scores))) gt = [0.10, 0.10, 0.50, 0.50] pred = [0.12, 0.09, 0.48, 0.52] print("IoU between pred and gt: %.3f" % model.iou(gt, pred)) if __name__ == "__main__": main()
self.proj = self.rng.normal(size=(dim, dim))模拟图文预训练学到的“翻译矩阵”,把图像特征映射到与文本对齐的空间。def text_feat(self, words)把文本线索编码成向量,真实系统由 BERT/CLIP 完成。vec = vec + np.sin(np.arange(self.dim) * seed)词袋式叠加:每个词贡献一个正弦基向量,简单但可复现。def vis_feat(self, raw)对图像区域特征做投影并归一化。scores = [float(np.dot(self.vis_feat(f), t)) for f in region_feats]统一打分:候选区域与文本线索的相似度。idx = int(np.argmax(scores))相似度最高的区域就是模型锁定的目标。inter / union if union > 0 else 0.0用 IoU 量化预测框与真实框的重叠质量。
常见误区
误区很多人以为只要在检测模型后面接一个文本分类头,让它输出"match/no match"就算 Grounding 了,反正都是框。
正解真正指代理解需要细粒度对齐:模型要能把“红裙”这个 token 对应到图像里的红色区域,把“第三排”对应到空间位置;统一框架也正是因为共享骨干加跨模态融合才能做到。仅靠分类头的“拼装车”在复杂指代上会大幅掉点。
为何常见:两类任务输入输出长得像(图加文本变框),初学者容易只看到形式而忽略对齐机制。
误区认为开放词汇检测就是把训练集扩大,把能想到的类别都标上,模型见过了自然能识别。
正解训练集永远不可能覆盖开放世界。开放词汇的核心是“词汇表无关”:类别名在推理时由文本编码器动态提供,模型靠语义相似度识别从未见过的类。扩大数据有帮助,但不是本质。
为何常见:“见过才能认出”是传统监督学习的直觉,容易迁移到新任务上。
误区觉得 DETR 这类端到端检测器取消了 NMS,肯定全面碾压两阶段。
正解端到端省去了手工后处理和候选生成,但训练收敛慢,通常需要更多轮次和更大的 batch;在小数据集或训练不充分时,两阶段可能更稳。DETR 类模型的优势在于简洁和统一,而非无条件的“又快又准”。
为何常见:“新方法等于更好”的思维惯性,忽略了训练成本与数据规模等前提。
误区评测时 IoU 大于 0.5 就算命中,于是觉得框差不多就行,不用太精细。
正解0.5 只是“及格线”,实际应用(机器人抓取、自动驾驶)对框的精度要求高得多。RefCOCO 评测常报告 IoU 0.5/0.7 等多个阈值,好的模型在 0.75 以上仍然保持领先。框偏一点,抓取就失败。
为何常见:只看了基准测试的单一指标,忽略了真实场景对精度的苛刻需求。
误区听说 Grounding DINO 很厉害,以为它能回答“图里的人在做什么”这样的开放问题。
正解Grounding DINO 是定位专用模型:输入描述,输出框,不做自由对话、不做事件理解。要“边聊边框”,需要的是多模态大模型(如 Ferret、Qwen-VL)或两者组合。
为何常见:对技术边界不清晰,被“能理解语言”的宣传语误导。
面试题
Q1. 视觉Grounding(REC)任务的核心目标是?
- A.给整张图片打上分类标签
- B.框出文本所指的目标区域← 正确答案
- C.为图片自动生成一句描述
- D.检测图中的所有已知物体
答案:B。REC 的输入是“图片 + 指代表达”,输出是目标边界框,所以核心目标是“框出文本所指区域”。A 是图像分类,C 是图像描述,D 是目标检测,都不是“按描述定位”。
Q2. 评判定位框准确度的常用指标是?
- A.IoU 交并比重叠程度← 正确答案
- B.BLEU 文本重合程度
- C.FID 图像分布距离
- D.Perplexity 语言困惑度
答案:A。IoU 衡量预测框与真实框的交集占并集比例,是定位任务的记分牌。BLEU 和 Perplexity 用于文本生成,FID 用于生成图像质量评估,与框的几何准确度无关。
Q3. 传统两阶段 Grounding 的流程是?
- A.先检测出候选框再匹配文本← 正确答案
- B.直接用文本回归出目标坐标
- C.先分割前景再识别物体类别
- D.只靠语言模型预测框位置
答案:A。两阶段范式先由检测器生成候选框,再计算每个候选框与文本描述的相似度并排序。B 是端到端做法,C 是分割流程,D 完全忽略了图像证据。
Q4. DETR 集合预测采用什么方式配对?
- A.匈牙利算法求最优二分图匹配← 正确答案
- B.贪心算法逐个就近分配配对
- C.聚类算法按特征自动分组
- D.随机打乱顺序后一一配对
答案:A。DETR 用匈牙利算法在 N! 种排列中找总匹配代价最小的方案,让每个真实框都有唯一且最优的预测框。贪心、聚类、随机都无法保证全局最优配对。
Q5. 开放词汇检测的关键思想是?
- A.用语义空间相似度识别任意类别← 正确答案
- B.扩大训练数据集中的类别数量
- C.靠更大模型记住更多类别标签
- D.在预训练阶段见过所有新类别
答案:A。开放词汇把类别名编码成文本向量,与区域特征算相似度,类别集合推理时动态给定。扩大数据、加大模型只是辅助,核心是“词汇表无关”的语义对齐。
Q6. Grounding DINO 中文本特征的用途是?
- A.增强查询并引导跨模态解码过程← 正确答案
- B.仅作为输出框的分类标签使用
- C.只用于训练阶段的数据增强
- D.仅用于生成模型评测的报告
答案:A。Grounding DINO 用文本特征初始化并增强 object queries,让解码器从一开始就偏重描述提到的目标。文本信号贯穿融合与解码全程,而不只是分类标签或辅助工具。
Q7. 端到端检测器相比传统方法的特点是?
- A.免除 NMS 等手工设计的后处理← 正确答案
- B.完全不需要提取图像的视觉特征
- C.不需要任何损失函数即可训练
- D.不支持文本引导的任意输入
答案:A。DETR 通过集合预测 + 匈牙利匹配直接输出最终框集合,天然避免重复框,因此免去 NMS。它仍然需要视觉特征和损失函数,D 选项也不符合统一框架的能力。
Q8. 视觉Grounding 的典型应用场景包括哪些?
- A.电商按描述检索并定位商品← 正确答案
- B.机器人按指令抓取指定物品← 正确答案
- C.语音信号进行降噪和增强处理
- D.自动驾驶定位语言所指目标← 正确答案
答案:ABD。电商检索、机器人抓取、自动驾驶指路都需要“根据语言定位图像目标”,是 Grounding 的典型落地。语音降噪属于音频信号处理,与视觉 Grounding 无关。
Q9. 跨模态对比学习在统一框架中的作用是?
- A.拉近匹配图文对的向量距离← 正确答案
- B.推远不匹配图文对的向量距离← 正确答案
- C.直接计算边界框的 IoU 数值
- D.把图片转换成像素级文本
答案:AB。对比学习的目标就是让匹配的图文特征靠近、不匹配的远离,从而把语言和视觉放进同一语义空间。IoU 是评测指标而非学习目标,D 描述的也不是对比学习。
Q10. 关于统一框架的优势,下列说法正确的是?
- A.检测与指代可以共享特征骨干← 正确答案
- B.检测与指代可以联合训练互益← 正确答案
- C.必须依赖两阶段检测的中间产物
- D.一次前向可同时完成两类任务← 正确答案
答案:ABD。统一框架共享骨干、联合优化,推理时一次前向即可输出检测框或指代框,训练数据还能互补。它恰恰摆脱了对两阶段中间产物的依赖,因此 C 错误。