除夕年夜饭,满桌热气腾腾的佳肴。奶奶指着桌对面,对小孙子说:“帮我夹最左边那个带红花的碗里的饺子。”这句话里藏着位置(最左边)、外观(红碗)、类别(饺子),小孙子只扫了一眼就伸出筷子,精准夹起目标。这看似平常的两三秒,其实完成了一次复杂的“听描述找东西”——这就是 AI 领域里的 Referring Expression(指代表达)任务。想象一下,如果让 AI 在图片里做同样的事:你说“左边穿红衣服的人”或者“桌上最大的苹果”,它要从海量像素中定位到你描述的那个具体目标。这意味着模型不仅要“看懂”图片,还要“听懂”你这句话,再把两者精确对起来。这就是跨模态对齐——语言和视觉在 AI 大脑里的联姻。这篇文章带你从饭桌出发,看 AI 如何学会“听着描述夹菜”。
指代表达是视觉语言理解的基石,掌握它,你就掌握了让机器听懂“人话指令”并精准行动的核心能力——这是多模态 AI 时代算法工程师的必备技能。
可视化演示
动态对比FCFS、SSTF和SCAN三种磁盘调度算法的磁头移动轨迹、总寻道距离与服务顺序。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SCAN电梯调度算法 磁头沿一个方向移动到底端再反向,类似电梯运行模式 请求按方向分组服务,减少磁头来回移动开销 seek = |pos - target|
任务概念
年夜饭桌上,奶奶一句“帮我夹最左边那个带红花的碗里的饺子”,小孙子目光扫过满桌菜肴,瞬间锁定目标碗,伸出筷子稳稳夹起。这个动作看似简单,却融合了“听懂指令”“看懂画面”“对应匹配”三重能力——而 AI 里的指代表达任务,就是教会机器完成同样的事。
指代表达(Referring Expression)的输入有两样东西:一张图片 \(I\) 和一句自然语言描述 \(R\)。输出是一个边界框,框出描述所指的那个目标。它和常见的目标检测不同:目标检测只能输出预设好的类别(人、车、猫),而指代表达可以处理任何你能说出来的描述,比如“桌上最大但没熟透的苹果”这种开放表达。它和图像描述(看图写话)正好方向相反——一个是“看图说话”,一个是“听描述找图”。
为了让机器能“挑出最像的那一个”,研究者把任务建模成一个概率最大化问题:模型为每个候选区域计算“它是描述目标”的概率,然后选概率最高的输出。
回到饭桌:指代表达的精髓就是“听描述、找目标”。AI 不需要背下所有菜的菜名,只要听懂你的话,就能在画面里把目标找出来。这,就是任务的核心定义。
- 候选区域集合\mathcal{O} 是图像中所有可能的候选框,相当于饭桌上所有“可能被夹到的菜”。
- 条件概率P(o | I, R) 表示在看到了图片 I、听到了描述 R 的前提下,这个候选框 o 正是目标的概率。
- 最大值求解\arg\max 是在所有候选中挑概率最高的那一个,正如小孙子在所有菜里挑最符合奶奶话的那盘。
- 最优目标o^{*} 就是模型最终输出的边界框,对应“最像描述的那个目标”。
三大挑战
如果奶奶只说“帮我夹那个红色的”,饭桌上顿时有三四道红色菜肴,小孙子就得挠头反问:“哪个红色的呀?”——语言天生带着歧义,这是指代表达的第一道坎。
挑战来自三个层面。第一,语言歧义:一个词可能对应多个物体(“红色的”指向多个目标),同一个物体也有无数种叫法(“鱼丸”“丸子”“白色的圆”),模型必须结合上下文猜出意图。第二,视觉复杂:目标可能很小、被遮挡、和背景融为一体,图像里的干扰物永远比目标多。第三,属性组合:单一属性往往不足以消歧,需要把颜色、形状、位置、物体间关系组合起来,像侦探拼线索一样锁定目标。
研究者用一个“匹配分数”来刻画这种综合判断:分数越高,说明这个区域越符合整句描述。形如相似度函数:
就像小孙子要综合“红色但必须是圆形、还得是最左边那个”才能锁定目标,单一线索总是不够的。指代表达的难点,正在于把多模态碎片拼成完整答案。
- 视觉特征向量\mathbf{v}_o 是候选区域 o 的视觉特征,相当于这个菜的“外貌档案”。
- 文本语义向量\mathbf{t}_R 是描述 R 编码后的语义向量,相当于这句话的“意思浓缩”。
- 相似度核心点积 \mathbf{v}_o^{\top} \mathbf{t}_R 衡量两个向量方向是否一致,值越大越“对味”。
- 温度系数\tau 控制概率分布的锐利程度,\tau 越小,概率越集中在分数最高的候选上。
跨模态对齐
小孙子能听懂奶奶的话,关键一步是把“红碗”这个词和眼前图片里那团红色像素对上号。“红碗”是抽象的语音符号,红色像素是具体的视觉信号,大脑必须完成这种“跨模态对齐”。
AI 模型同样如此。它有三个协作模块:文本编码器把描述里的每个词变成向量,相当于把奶奶的话拆成一串“词义标签”;视觉编码器把图片划分成若干区域并提取特征,相当于把饭桌切成一块块“菜品名片”;对齐模块负责让每个词找到它对应的视觉区域——“红色”对应红色碗的区域,“最左边”对应桌角的位置。
这个“找对应”的过程,靠的是注意力机制。对于描述中的每个词,模型计算它与图像每个区域的匹配权重:
这就是跨模态对齐的魔法:每个词就像小孙子脑海里的探照灯,在饭桌上扫过一道道菜,最后汇聚光线,锁定了那个“红色、圆形、最左边”的目标碗。
- 查询与键\mathbf{q}_i 来自描述中的第 i 个词,\mathbf{k}_j 是图像第 j 个区域的键向量,对应“词义标签”与“菜品名片”。
- 缩放点积除以 \sqrt{d} 防止维度过大时内积爆炸,让计算更稳定。
- 指数化\exp 将相似度变成非负权重,越相似的区域权重越大。
- 归一化分母对所有区域求和,让权重总和为 1,变成一个标准的“注意力分布”。
模型演进
从“死记硬背菜谱”到“听懂人话现场找菜”,指代表达模型走了三代。
第一代是“一锅炖”:用 CNN 提取整张图的特征,用 LSTM 把整个句子压成一个向量,然后拼在一起直接回归出边界框。缺点很直观——所有词被混成一锅粥,“红色”和“最左边”谁更重要完全分不清。
第二代引入注意力机制:每个词都能单独和图像区域对齐,再动态融合。代表模型 MAttNet 甚至拆出外观、位置、关系三路注意力,分别捕捉“长什么样”“在哪儿”“和谁挨着”。这就像小孙子慢慢学会先看颜色、再看方位、最后看旁边有什么参照物。
第三代进入 Transformer 时代:用自注意力统一编码语言和视觉,端到端直接输出边界框,不再依赖外部的候选框生成器。整个流程像一个训练有素的管家,听完描述、扫一眼餐桌、直接伸手。
无论哪一代,最终都要把多区域特征融合成一个“裁决特征”:
从一锅炖到精准加权,三代模型的进化,其实是 AI 从“记住所有菜的位置”进步到“听着指令现场找菜”的缩影。
- 候选区域特征\mathbf{v}_i 是第 i 个候选区域的特征向量,代表每个菜“长什么样”。
- 注意力权重\alpha_i 表示第 i 个区域与描述的相关程度,相当于每道菜被提到的“热度”。
- 加权融合把每个区域的特征按热度加权求和,得到综合判断依据。
评测指标
怎么判断小孙子夹得准不准?不能只看“夹没夹到”,还得看“到底夹多准”——夹到碗沿跟夹到碗心,差别可大了。AI 评测也用同样的思路。
最核心的指标叫 IoU(交并比),计算预测框与人工标注的真实框的重叠程度。它等于两个框交集面积除以并集面积:完全重合时 IoU 为 1,完全不搭边时是 0。定位置信度在此基础上定义:IoU 超过 0.5 就算定位成功,常用 Acc@0.5 表示成功率;更严格的任务会用 0.7 作为阈值。
评测时还有更细的分组指标 cIoU——把描述按长短分组统计准确率。因为“红色的”和“最左边带红花的碗里的饺子”难度天差地别,分开统计才公平。就像考核小孙子,既要看平均夹菜水平,也要分“简单题”和“难题”分别打分。
- 预测框B_p 是模型输出的定位框,相当于小孙子下筷子夹的位置范围。
- 真实框B_g 是人工标注的标准答案,相当于家里人公认“应该夹的那道菜”。
- 交集面积|B_p \cap B_g| 是两个框重叠区域的大小,重叠越多越准。
- 并集面积|B_p \cup B_g| 是两个框覆盖的总面积,避免预测框过大“蒙对”。
- 交并比交集除以并集,得到 0 到 1 之间的重合度分数。
应用落地
当年那个在饭桌上听奶奶指令夹菜的小孙子,如今长大了,有了三重身份:智能管家、车间分拣员、图像修图师——这就是指代表达的落地场景。
智能助手场景中,你说“把茶几上那个白色马克杯拿给我”,机器人先听懂名词和位置,再在摄像头画面里定位马克杯,最后驱动机械臂精准抓取。工业场景里,传送带上一堆零件,指令是“抓取第三个红色零件”,指代表达模型在高速运转中实时定位。图像编辑软件里,“选中这张照片里穿红色连衣裙的女士”就能一键抠出目标,不用手动圈选。
在实际系统中,模型不会盲目执行指令,而是带一道“安全闸门”:只有当定位置信度超过阈值时才执行动作,否则会反问用户确认。
从年夜饭桌到智能工厂,指代表达把人类“看一眼就懂”的默契,变成了 AI “听懂就做”的能力。这就是多模态理解落地的意义。
- 执行函数\text{Execute}(o) 表示是否对候选目标 o 采取动作,等于“是否伸出筷子”。
- 置信度P(o \mid I, R) 是模型对该候选目标与描述匹配程度的信心。
- 阈值判断超过阈值 \theta 就执行(1),否则不执行(0)。
- 安全机制\theta 可以按场景调节,抓取场景设高阈值避免误抓,效率场景可适当放宽。
AI 应用场景
智能家居语音助手
阶段:多模态指令理解与目标定位
解决的问题:传统智能音箱只能执行“开灯”“播放音乐”这类固定命令,无法处理“那个白色杯子”等指向性表达。指代表达让语音指令中的颜色、位置、形状等属性与摄像头画面中的物体精确对应,把“模糊的人话”变成“精确的坐标”。
具体案例:某智能家居原型中,用户对机器人管家说“把茶几上蓝色花瓶旁边的马克杯拿给我”。系统先做语音识别,再用指代表达模型在摄像头画面中定位马克杯,最后驱动机械臂抓取。引入指代表达后,抓取准确率从固定指令模式的 12% 提升到 83%,用户不再需要背诵“设备 03 号杯”这类机器语言。
工业机器人分拣
阶段:视觉感知与目标选择
解决的问题:流水线上的零件种类繁多且外观相似,传统分拣需要为每种零件单独训练检测器,换产线就要重新标注。指代表达允许工人直接用自然语言下达指令,系统理解描述后在传送带上动态定位目标,大幅降低换线成本。
具体案例:某汽车零部件产线,质检员对着摄像头说“抓取传送带上第三个表面有划痕的红色零件”。指代表达模型结合零件外观与位置关系,在 200ms 内完成定位,机械臂随即分拣。整条产线的零件切换时间从原来的一天缩短到 10 分钟。
图像编辑工具
阶段:交互式视觉编辑
解决的问题:传统抠图工具依赖手动套索和钢笔工具,操作门槛高。指代表达让用户用一句话选中目标,编辑软件自动完成分割与调整,极大降低专业设计门槛。
具体案例:某在线设计平台加入“文字选中”功能,用户输入“选中这张合影里穿蓝色裙子的女生”,系统定位目标人物后一键完成背景替换、色调调整。上线三个月,该功能的日均使用量突破 50 万次,成为平台增长最快的 AI 功能。
Python 演示
# -*- coding: utf-8 -*-"""简易指代表达定位演示:根据自然语言描述在场景中定位目标物体"""import re class SceneObject: def __init__(self, name, color, shape, pos, x, y): self.name = name self.color = color self.shape = shape self.pos = pos self.x = x self.y = y def create_scene(): """模拟一个饭桌场景,包含若干物体""" return [ SceneObject("红圆", "red", "circle", "left", 30, 40), SceneObject("蓝方", "blue", "rect", "center", 120, 30), SceneObject("绿三角", "green", "triangle", "right", 210, 20), SceneObject("红方", "red", "rect", "right", 260, 50), ] def parse_description(desc): """从描述中提取颜色、形状、位置三种属性""" color_map = {"红": "red", "蓝": "blue", "绿": "green"} shape_map = {"圆": "circle", "方": "rect", "三角": "triangle"} pos_map = {"左": "left", "中": "center", "右": "right"} color = next((color_map[k] for k in color_map if k in desc), None) shape = next((shape_map[k] for k in shape_map if k in desc), None) pos = next((pos_map[k] for k in pos_map if k in desc), None) return {"color": color, "shape": shape, "pos": pos} def match_score(obj, attrs): """计算物体与描述的匹配分数,每命中一个属性加一分""" score = 0 if attrs["color"] and obj.color == attrs["color"]: score += 1 if attrs["shape"] and obj.shape == attrs["shape"]: score += 1 if attrs["pos"] and obj.pos == attrs["pos"]: score += 1 return score def find_referent(scene, desc): """核心定位函数:返回得分最高的物体""" attrs = parse_description(desc) scored = [(match_score(o, attrs), o) for o in scene] scored.sort(key=lambda pair: pair[0], reverse=True) best_score, best_obj = scored[0] if best_score == 0: return None return best_obj def main(): scene = create_scene() desc = "最左边红色的圆形" target = find_referent(scene, desc) if target: print("描述:", desc) print("定位到:", target.name, "坐标=(", target.x, ",", target.y, ")") else: print("没有找到匹配的物体") if __name__ == "__main__": main()
color = next((color_map[k] for k in color_map if k in desc), None)在描述里逐个扫描颜色关键词,找到第一个命中的就返回。attrs = parse_description(desc)把一句话拆成“颜色 + 形状 + 位置”三个属性,相当于把奶奶的话拆成可匹配的线索。scored = [(match_score(o, attrs), o) for o in scene]对场景中每个物体逐一打分,看它命中了几条线索。scored.sort(key=lambda pair: pair[0], reverse=True)按匹配分数从高到低排序,最像目标的对象排到最前。if best_score == 0: return None如果一个线索都没命中,说明描述和场景完全对不上,返回空。
常见误区
误区指代表达和目标检测都是“在图片里框出物体”,一直以为指代表达就是给检测框加个语言标签而已。
正解两者本质不同。目标检测只能识别预定义类别(人、车、猫),输出“类别 + 框”;指代表达接收的是任意自然语言描述,描述本身就是输入的一部分,必须先理解语义再定位,且描述内容完全不受预设词表限制。就像目标检测是“认出这是饺子”,而指代表达是“听懂'那个带红花的碗里的饺子'并夹起来”。
为何常见:两者最终输出都是边界框,而且目标检测常被用作指代表达的候选框来源,表象相似导致混淆。
误区既然指代表达要理解描述,那给出越多属性(“红色的、圆形的、最左边的、带高光的”)模型一定定位得更准。
正解真实场景中描述通常简短,模型必须学会在少属性下消歧。过度冗余的属性会稀释关键信息的注意力权重,甚至引入噪声,让匹配更困难。训练时依赖过度描述会导致推理时鲁棒性下降。
为何常见:人的直觉是“信息越多越有利”,但模型的注意力资源有限,冗余词会抢占关键线索的权重。
误区模型 IoU 0.8 一定比 0.6 好,所以评测时直接比较 IoU 数值就行。
正解评测常用 IoU > 0.5 判定定位成功的 Acc 作为主指标,IoU 数值本身受标注框粒度、数据集难度影响,跨数据集直接对比没有意义。cIoU 按描述复杂度分组统计,才能反映模型在不同难度下的真实水平。
为何常见:大家习惯了“分数高 = 能力好”,忽视了指标的定义边界和数据集约束。
误区定位主要是“看”的能力,只要目标检测模型够强,语言只是附加条件,稍微处理一下就行。
正解指代表达是多模态任务,语言和视觉缺一不可。同一句“那个红色的”在不同场景指向完全不同,仅靠视觉无法判断该看哪里;离开文本语义理解,模型无法消解歧义,只会“看到一堆红色的东西却不知道选哪个”。
为何常见:目标检测能力的提升容易让人误以为“找到东西”是纯视觉问题,但语言指明了“找哪个东西”——这一步关键在跨模态对齐。
面试题
Q1. 指代表达任务的核心目标是什么?
- A.预测图片中的物体类别
- B.根据文本描述在图中定位目标框← 正确答案
- C.生成图片的自然语言描述
- D.识别图片中的文字内容
答案:B。指代表达的输入是图片 + 描述,输出是边界框。A 是目标检测,C 是图像描述,D 是 OCR。就像小孙子的任务是“听描述夹菜”,而不是“报菜名”。
Q2. 指代表达与目标检测的最大区别是什么?
- A.指代表达需要处理视频数据
- B.目标检测识别预定义类别而指代表达处理任意描述← 正确答案
- C.目标检测不需要输入图像
- D.指代表达不需要理解语言
答案:B。目标检测只能输出预设类别,而指代表达的描述是开放的、作为输入的一部分。就像目标检测只知道“这是饺子”,指代表达能理解“那个带红花的碗里的饺子”并找到它。
Q3. 指代表达面临的主要挑战包括哪些?
- A.语言歧义,一个词指向多个物体← 正确答案
- B.视觉场景复杂,目标小或被遮挡← 正确答案
- C.需要组合多个属性联合消歧← 正确答案
- D.模型推理速度一定非常慢
答案:ABC。A、B、C 分别是语言、视觉、属性组合三大挑战,都是指代表达特有难题。推理速度取决于模型设计,并非任务的固有挑战。
Q4. 跨模态对齐解决的核心问题是什么?
- A.提高图像的分辨率质量
- B.建立语言词汇与图像区域的对应关系← 正确答案
- C.压缩模型的参数量大小
- D.加速整个模型的训练过程
答案:B。跨模态对齐的核心是让“红碗”这样的词找到图中对应的红色像素区域,建立词与区域间的关联。A、C、D 是工程问题,与模态对齐无关。
Q5. 注意力机制在指代表达模型中的作用是什么?
- A.过滤掉全部背景信息
- B.动态计算每个词与图像区域的相关度← 正确答案
- C.替代图像编码器的全部功能
- D.仅用于文本数据预处理
答案:B。注意力机制让每个词作为“探照灯”扫描所有图像区域,计算相关度权重。它不替代编码器,也不只处理文本,更不是简单过滤背景,而是动态融合多区域信息。
Q6. 评估指代表达模型常用的指标有哪些?
- A.IoU 交并比← 正确答案
- B.Acc@0.5 定位准确率← 正确答案
- C.困惑度 Perplexity
- D.cIoU 分组准确率← 正确答案
答案:ABD。IoU 衡量预测框与真实框的重合度,Acc@0.5 是 IoU 超过阈值的成功率,cIoU 按描述复杂度分组统计。Perplexity 是语言模型的指标,与定位任务无关。
Q7. 某模型预测框与真实框交集面积为 30,并集面积为 60,IoU 值是多少?
- A.交并比数值等于 0.3
- B.交并比数值等于 0.5← 正确答案
- C.交并比数值等于 0.6
- D.交并比数值等于 2.0
答案:B。IoU = 交集面积 ÷ 并集面积 = 30 ÷ 60 = 0.5。注意 IoU 范围在 0 到 1 之间,2.0 不可能出现。就像夹菜时预测范围与目标菜重叠了一半。
Q8. 注意力公式中除以 \sqrt{d} 的目的是什么?
- A.降低模型的计算复杂度
- B.防止点积过大导致 softmax 梯度饱和← 正确答案
- C.增加模型的参数量规模
- D.将输出数值强制变为整数
答案:B。当向量维度 d 很大时,点积数值会随维度增大而膨胀,经过 softmax 后梯度趋近于 0,难以训练。除以 \sqrt{d} 把数值拉回合理范围。它与计算复杂度、参数量无关,更不会取整。
Q9. 指代表达常见的应用场景有哪些?
- A.智能助手按语音指令指点物体← 正确答案
- B.工业机器人按自然语言抓取零件← 正确答案
- C.图像编辑中按描述选中目标← 正确答案
- D.机器翻译中消除跨语言歧义
答案:ABC。A、B、C 分别对应智能家居、工业分拣、图像编辑三大落地场景。D 是纯语言任务,不涉及图像定位,不属于指代表达。
Q10. “把桌上最左边带红花的碗里的饺子夹一个”这句话包含哪些消歧属性?
- A.仅包含颜色一种属性
- B.位置、外观、类别多种属性← 正确答案
- C.仅包含位置一种属性
- D.仅包含类别一种属性
答案:B。这句话里有位置(最左边)、外观(带红花)、类别(碗、饺子),是典型的多属性组合描述。模型需要联合这些线索,像小孙子一样综合判断才能精准定位。