想象一下,周末全家围坐翻看相册,表妹指着照片说:“戴眼镜的叔叔旁边那个红气球在哪儿?”你扫一眼画面,目光先落在叔叔脸上,再顺着他肩膀往旁边一挪,锁定红气球,伸出手指圈出它的位置。这个看似普通的“我说你找”小游戏,恰恰是人工智能里一项硬核任务的原型——指代表达理解(Referring Expression Comprehension,简称 REC)。图像是一张“全家福”,那句描述是“线索”,AI 就是那个负责在画面里圈出答案的玩家,而评测基准则是一本本附有标准答案的“家庭相册题册”。 本文会带你从游戏规则讲起:先认识 REC 到底在做什么,再介绍 RefCOCO 这类“标准题库”长什么样,接着看看玩家们(两阶段、单阶段、Transformer 三类算法)分别用什么策略找东西,拆解他们的“眼睛、耳朵、大脑”(模型架构),搞懂裁判拿什么量尺打分(IoU 与 Acc@0.5),最后聊聊高手如何做专项训练(性能优化)。读完你会发现,让 AI 听懂一句人话并把目光精准投向画面里的某个角落,背后是一整套环环相扣的工程学问。

岗位关联

对 AI 从业者而言,REC 是多模态评测与视觉语言落地的关键一环:读懂它,你就能快速定位模型“为什么找不到目标”,也能在智能助手、图像编辑、机器人等场景中设计出可衡量、可优化的视觉定位方案。

目录
  1. 可视化演示
  2. 认识指代表达
  3. 评测基准
  4. 经典算法
  5. 模型架构
  6. 评估指标
  7. 性能优化
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示REC任务流程:图像+文本指代表达→候选框匹配→目标框定位,IoU交并比评估,以及多目标消歧匹配。

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

REC定位流程 图像+文本表达→候选框打分排序 box=argmax score 输出目标物体边界框(x,y,w,h)。

认识指代表达

家庭聚会上的“我说你找”看似简单,其实暗藏一个关键设定:出题人不会说“请找到那个红色的圆形物体”这种呆板描述,而是说“红气球旁边的叔叔”,甚至“穿蓝衣服小孩身后那个低头看手机的人”。听题的人必须把这句话和画面里的多个物体、人物关系、空间位置一一对照,才能最终圈定唯一目标。AI 里的指代表达理解(REC)就是这个游戏的数字版:给模型一张图像和一句自然语言描述,它要输出一个矩形边界框,把描述所指的物体框出来。

这个任务的输入输出可以形式化成一个“条件决策”问题。图像好比摆在桌上的全家福,描述是耳边的一句话,模型要回答:这句话在图中指向哪个位置?用数学语言写出来就是:

很多初学者会把 REC 和常见的目标检测搞混,因为两者都输出边界框。但目标检测回答的是“画面里有什么”,模型只能从预先定义好的类别表(人、车、猫、杯子……)里选;REC 回答的是“这句话指的是哪一个”,描述是开放且组合无限的——“穿蓝衣服小孩旁边的红书包”这句话里,“蓝衣服小孩旁边的”根本不是一个预设类别。检测器像一名只会报菜名的服务员,REC 玩家则要听懂顾客随心所欲的指路方式。正因为这种开放性,REC 在智能相册搜索、机器人指令抓取、图像编辑抠图等场景中都是核心能力。

b∗=arg⁡max⁡b∈BP(b∣I,R)\displaystyle b^{*} = \arg\max_{b \in \mathcal{B}} P(b \mid I, R)
  1. 候选框集合$\mathcal{B}$ 是所有可能画出的矩形框集合,对应游戏里“所有能圈的位置”。
    B={b1,b2,…,bm}\mathcal{B} = \{ b_1, b_2, \dots, b_m \}
  2. 条件概率$P(b \mid I, R)$ 表示“给定图像 $I$ 和描述 $R$ 时,边框 $b$ 是正确答案的概率”——也就是这句话指向这个框的可能性。
    P(b∣I,R)P(b \mid I, R)
  3. 选取最大$\arg\max_{b \in \mathcal{B}}$ 从所有候选中挑出概率最大的那个框,就像玩家比较一番后最终伸出手指的位置。
    b∗=arg⁡max⁡b∈BP(b∣I,R)b^{*} = \arg\max_{b \in \mathcal{B}} P(b \mid I, R)

评测基准

光有游戏规则还不够,要判断一个玩家水平高低,需要一本有标准答案的题册。评测基准(Benchmark)就是 AI 界的“标准题册”:一批精心标注的图像、描述和真实框,供所有模型统一考试。REC 领域最常用的题册是 RefCOCO 家族:RefCOCO、RefCOCO+ 和 RefCOCOg,它们都基于 MS COCO 的实景照片,但命题风格各有侧重。RefCOCO 由三名标注员轮流描述目标,句子较短;RefCOCO+ 规定描述中不能出现绝对位置词(比如“左边”“右边”),强迫模型靠外观理解;RefCOCOg 则用机器自动生成更长的描述,像“长难句阅读理解”。另一本题册 Flickr30K Entities 从真实图片说明中截取实体短语,句子来自日常语料,更接近真实用户口吻。

题册的公平性取决于“命题”和“组卷”方式。标注时,每张图由多人独立描述同一个目标框,遇到有歧义的描述会被剔除;组卷时,全部样本被严谨地分成三份,确保模型“考前”见不到考题:

拿到一本好题册,玩家才能被准确分级。同理,评测基准的难度分层决定了模型分数的含金量:在 RefCOCO 上拿高分,说明模型擅长短描述;在 RefCOCOg 上拿高分,说明它能处理复杂长句。这也解释了为什么论文里通常同时报告多个基准的成绩——就像学生要同时参加不同难度的竞赛,才能证明自己“是真的会”。

D=Dtrain∪Dval∪Dtest,Dtrain∩Dval=Dval∩Dtest=Dtrain∩Dtest=∅\displaystyle \mathcal{D} = \mathcal{D}_{train} \cup \mathcal{D}_{val} \cup \mathcal{D}_{test}, \quad \mathcal{D}_{train} \cap \mathcal{D}_{val} = \mathcal{D}_{val} \cap \mathcal{D}_{test} = \mathcal{D}_{train} \cap \mathcal{D}_{test} = \varnothing
  1. 总数据集$\mathcal{D}$ 是某个基准(如 RefCOCO)全部样本组成的集合,相当于整本题册。
    D\mathcal{D}
  2. 三个子集$\mathcal{D}_{train}$、$\mathcal{D}_{val}$、$\mathcal{D}_{test}$ 分别是训练、验证、测试用的题目,对应“平时练习册”“考前模拟卷”和“正式考卷”。
    Dtrain, Dval, Dtest\mathcal{D}_{train},\ \mathcal{D}_{val},\ \mathcal{D}_{test}
  3. 互不相交三者交集为空集 $\varnothing$,保证模型训练时绝对看不到测试题,分数才有公信力。
    Dtrain∩Dtest=∅\mathcal{D}_{train} \cap \mathcal{D}_{test} = \varnothing

经典算法

有了题册,接下来看玩家怎么“找”。最早的方法像谨慎的新手:先绕着客厅把可疑的东西全部点一遍(生成候选区域),再逐一对照描述做排除(语言匹配),这叫两阶段算法。它思路清晰,但有个明显的短板——如果第一步漏看了目标,后面再努力也白搭,就像新手把气球认成苹果,后面比对线索全是徒劳。后来出现了单阶段算法,它不再先列清单,而是让视觉特征和语言特征在同一个网络里直接交互,一步到位回归出目标框,像经验丰富的玩家一边听描述一边扫视画面,视线自然落到目标上。再后来,Transformer 方法登场,它把图像切成一堆“视觉碎片”、把句子拆成一个个“词片段”,让两者在注意力机制中自由两两配对,实现真正的“软对齐”。MDETR 就是这类代表的典型:文本里的每个词都能主动去找画面中对应的区域,相当于玩家把耳朵听到的每个线索实时“贴”到眼睛看到的位置上。

无论哪类方法,核心都是给候选内容与描述之间打一个“匹配分”。两阶段方法把这一环显式地做出来:

从两阶段到单阶段再到 Transformer,玩家们的“找法”越来越像人类:不再机械地列清单排除,而是把听和看融为一体。技术演进的核心逻辑始终没变——如何更充分、更高效地让语言线索引导视觉注意力。两阶段简单可控,单阶段效率高,Transformer 表达能力强,各有各的用武之地,评测分数才是检验策略优劣的最终裁判。

c∗=arg⁡max⁡c∈Cs(c,R),s(c,R)=qc⋅kR∥qc∥ ∥kR∥\displaystyle c^{*} = \arg\max_{c \in \mathcal{C}} s(c, R), \quad s(c, R) = \frac{q_c \cdot k_R}{\lVert q_c \rVert \, \lVert k_R \rVert}
  1. 候选列表$\mathcal{C}$ 是检测器或区域提议网络给出的候选区域集合,对应新手玩家先圈出的“可疑物品清单”。
    C={c1,c2,…,cn}\mathcal{C} = \{ c_1, c_2, \dots, c_n \}
  2. 匹配分数$s(c, R)$ 衡量候选区域 $c$ 与描述 $R$ 的契合度,得分越高,说明这个候选越像句子所指的目标。
    s(c,R)s(c, R)
  3. 余弦相似度把候选的视觉特征 $q_c$ 和描述的文本特征 $k_R$ 做归一化点积,两个向量的方向越一致,值越接近 1,表示“越像”。
    qc⋅kR∥qc∥ ∥kR∥\frac{q_c \cdot k_R}{\lVert q_c \rVert \, \lVert k_R \rVert}

模型架构

一个顶尖的“我说你找”玩家,必然拥有三件套:敏锐的眼睛,好使的耳朵,以及能瞬间把两者结合的大脑。REC 模型也是这样搭建的。视觉编码器就是眼睛,通常用 CNN 或 Vision Transformer 把图像变成一组特征向量,每个向量描述画面某个区域的“长相”;文本编码器就是耳朵,常用 BERT 把指代句编码成一组词向量,每个词携带语义信息;跨模态融合模块是大脑,它让视觉特征和文本特征相互“注视”,决定画面中哪些区域与哪些词最相关;最后位置预测头把融合后的信息解码成具体的边界框坐标。

大脑的“相互注视”靠的是注意力机制。可以这样理解:文本里的“绿色”这个词发出一束探照灯,在画面各个区域上扫过,当它扫到绿色三角形所在区域时“灯光最亮”,扫到红色圆形时“灯光暗淡”。这个亮度权重就是注意力分数:

正是这套“眼睛—耳朵—大脑”的协作,让模型既能看懂“红色圆形在哪儿”,也能听懂“左侧”是什么意思。视觉编码器负责“看见”,文本编码器负责“听懂”,跨模态融合负责“对上号”,位置预测头负责“圈出来”。任何一环掉了链子,游戏都会失败——这就像玩家近视、耳背、或者反应慢半拍,都找不准气球。

Sij=softmaxj ⁣(QiKj⊤d)\displaystyle S_{ij} = \mathrm{softmax}_{j}\!\left( \frac{Q_i K_j^{\top}}{\sqrt{d}} \right)
  1. 查询与键$Q_i$ 来自一侧(比如视觉区域 $i$ 的特征),$K_j^{\top}$ 来自另一侧(文本词 $j$ 的特征),两者点积表示“这个画面位置和那个词有多少关系”。
    QiKj⊤Q_i K_j^{\top}
  2. 缩放点积除以 $\sqrt{d}$ 防止点积数值过大导致梯度不稳定,其中 $d$ 是特征维度。
    QiKj⊤d\frac{Q_i K_j^{\top}}{\sqrt{d}}
  3. 归一化$\mathrm{softmax}_j$ 把所有词的得分变成总和为 1 的权重,从而把文本线索按重要程度加权融合进视觉特征。
    softmaxj ⁣(QiKj⊤d)\mathrm{softmax}_{j}\!\left( \frac{Q_i K_j^{\top}}{\sqrt{d}} \right)

评估指标

游戏玩得好不好,不能光靠感觉,裁判手里要有一把透明的“重叠尺”。AI 评测中这把尺子叫 IoU(Intersection over Union,交并比):把预测框和真实标注框叠在同一张图上,计算它们交集面积占并集面积的比例。直觉上,两个框重叠得越多,说明找得越准。想象裁判拿一张画着标准答案圈的透明塑料片盖在你的圈上,两者重合的部分除以两者总共覆盖的部分,就是 IoU。

单看一个框的 IoU 还不够,比赛要看整体命中率。于是有了 Acc@0.5:把 IoU 达到 0.5 以上算作“命中”,统计命中的样本占比。如果要求更高,可以用 Acc@0.9——框得几乎严丝合缝才算对:

指标是裁判的眼睛,但裁判也有偏向:小物体框偏移几个像素,IoU 就可能从 0.8 掉到 0.4;大物体容错率则高得多。因此,专业的模型报告会同时报告 Acc@0.5 和 Acc@0.9,就像体育比赛既看“及格率”也看“优秀率”。读懂指标背后的偏向,你才不会拿着 Acc@0.5 的高分就贸然下结论“模型已经完美了”。

IoU(Bp,Bg)=∣Bp∩Bg∣∣Bp∪Bg∣\displaystyle \mathrm{IoU}(B_{p}, B_{g}) = \frac{\left| B_{p} \cap B_{g} \right|}{\left| B_{p} \cup B_{g} \right|}
  1. 指示函数$\mathbb{1}[\mathrm{IoU}_{n} \geq 0.5]$ 当第 $n$ 个样本的 IoU 不小于 0.5 时取 1,否则取 0,相当于裁判的“对/错”判定。
    1[IoUn≥0.5]\mathbb{1}[\mathrm{IoU}_{n} \geq 0.5]
  2. 平均求和对所有 $N$ 个样本求和再除以 $N$,得到命中的比例,即最终成绩。
    1N∑n=1N1[IoUn≥0.5]\frac{1}{N} \sum_{n=1}^{N} \mathbb{1}[\mathrm{IoU}_{n} \geq 0.5]

性能优化

每个玩家都有弱项:光线暗、描述绕、目标太小……针对弱项做专项训练,是提升成绩的捷径。REC 模型的性能优化同样遵循这个思路。数据增强是最直接的“加练”:对图像做随机裁剪、旋转、颜色扰动,对文本做同义改写、乱序重组,相当于把题册里的每道题变出无数种变体,逼模型见过更多“刁钻问法”。多任务联合则像“体能综合训练”:让模型同时学习 REC、指代分割、视觉问答等任务,共享视觉语言对齐能力——一个会描述物体边界的模型,往往也更会定位物体。对比学习是“正反例对照训练”:把匹配的“图像-文本”对拉近,把不匹配的对推远,让模型学会分辨“像”与“不像”。推理加速则是在比赛现场争取时间:知识蒸馏把大模型的本领教给小模型,量化把浮点数变成低精度整数,让模型跑得更快,适合机器人、手机等实时场景。

这些策略会被组合进一个总损失函数里,训练时一起优化:

优化不是堆砌技巧,而是像教练制定训练计划一样,针对模型的短板分配精力。数据增强提升泛化,多任务联合夯实基础,对比学习强化判别,推理加速缩短响应——四管齐下,玩家才能在各种“歪题怪题”前稳如泰山。评测分数是训练效果的镜子,哪项指标低,就回看哪个环节,继续迭代。

L=Lloc+λalign Lalign+λaux Laux\displaystyle \mathcal{L} = \mathcal{L}_{loc} + \lambda_{align}\, \mathcal{L}_{align} + \lambda_{aux}\, \mathcal{L}_{aux}
  1. 定位主损失$\mathcal{L}_{loc}$ 惩罚边界框位置偏差(比如预测坐标与真实坐标的 L1 距离),是“圈得准不准”的扣分项。
    Lloc\mathcal{L}_{loc}
  2. 对齐损失$\mathcal{L}_{align}$ 作用于视觉与文本特征的匹配程度,拉近正确配对的向量距离,对应“线索和画面是否对得上”。
    λalign Lalign\lambda_{align}\, \mathcal{L}_{align}
  3. 辅助损失$\mathcal{L}_{aux}$ 来自分割、问答等辅助任务的损失,$\lambda_{aux}$ 控制它的权重,像训练计划里额外加的体能课。
    λaux Laux\lambda_{aux}\, \mathcal{L}_{aux}

AI 应用场景

智能相册与视觉助手

阶段:模型评测与产品化部署

解决的问题:传统图库只能按时间、地点或标签检索,用户说“帮我找上周聚会那只红气球”时无从下手。REC 模型把自然语言描述直接映射到图像坐标,用户一句口语就能精确定位照片中的目标。

具体案例:手机相册加入“用文字找照片”功能,输入“去年生日蛋糕旁的小女孩”,系统返回该照片并在人脸旁画出绿色边界框。部署前,算法团队用自建评测集(包含遮挡、暗光、小目标等困难样本)计算 Acc@0.5,确保模型在真实相册的复杂分布下不掉链子。

电商图片编辑与内容生产

阶段:数据标注与模型微调

解决的问题:设计师做广告图时,常需要从海量商品图中抠出“模特左手的白色杯子”,手动圈选一座图就要几分钟。REC 模型能根据一句描述自动输出目标框,再接分割头即可生成精细蒙版,批量处理素材。

具体案例:某电商平台上线“一句话抠图”工具,运营输入“背包右侧的黄色水壶”,模型自动定位并抠出商品,替代原先的人工框选。评测阶段,团队对比了 RefCOCO 预训练模型与微调后模型在内部商品图上的 Acc@0.9,发现微调后小目标命中率提升显著。

机器人抓取与具身智能

阶段:在线推理与实时交互

解决的问题:传统机械臂抓取必须预先指定抓取类别,无法理解“拿起桌上红色马克杯”这种自然指令。REC 让机器人“听懂”指代表达并实时定位目标坐标,再交给运动规划模块执行抓取。

具体案例:仓储机器人接收语音指令“取货架上蓝色包装盒右边的白色箱子”,REC 模型返回目标箱体的边界框,机械臂据此规划抓取路径。这类场景对推理速度敏感,工程上常用知识蒸馏将大模型压缩为轻量版本,在保证 Acc@0.5 不降的前提下把延迟从 300ms 压到 80ms。

Python 演示

python119 行
# -*- coding: utf-8 -*-# 指代表达REC微型演示: 通过颜色/形状/空间关系解析一句指代import re  class ObjectBox:    def __init__(self, name, color, shape, x, y, w, h):        self.name = name        self.color = color        self.shape = shape        self.x = x        self.y = y        self.w = w        self.h = h     def center(self):        return (self.x + self.w / 2.0, self.y + self.h / 2.0)  def compute_iou(pred, gt):    """计算两个边界框的IoU"""    x1 = max(pred.x, gt.x)    y1 = max(pred.y, gt.y)    x2 = min(pred.x + pred.w, gt.x + gt.w)    y2 = min(pred.y + pred.h, gt.y + gt.h)    inter = max(0.0, x2 - x1) * max(0.0, y2 - y1)    area_pred = pred.w * pred.h    area_gt = gt.w * gt.h    union = area_pred + area_gt - inter    if union == 0:        return 0.0    return inter / union  COLOR_MAP = {"红色": "red", "绿色": "green", "蓝色": "blue", "灰色": "gray"}SHAPE_MAP = {"圆形": "circle", "方形": "rect", "三角形": "tri"}REL_DIR = {"左侧": (-1.0, 0.0), "右侧": (1.0, 0.0),           "上方": (0.0, -1.0), "下方": (0.0, 1.0)}  class RecEngine:    def __init__(self, objects):        self.objects = objects     def find_by_attr(self, color, shape):        for obj in self.objects:            if obj.color == color and obj.shape == shape:                return obj        return None     def parse(self, text):        parts = re.split(r"[的\s]+", text)        for i, part in enumerate(parts):            if part in REL_DIR:                return parts[i - 1], part, parts[i + 1]        return None, None, None     def extract_attr(self, text):        color = None        shape = None        for c in COLOR_MAP:            if c in text:                color = COLOR_MAP[c]        for s in SHAPE_MAP:            if s in text:                shape = SHAPE_MAP[s]        return color, shape     def pick_by_direction(self, landmark, dx, dy):        best = None        best_dist = -1.0        lx, ly = landmark.center()        for obj in self.objects:            if obj is landmark:                continue            ox, oy = obj.center()            dist = (ox - lx) * dx + (oy - ly) * dy            if dist > 0 and dist > best_dist:                best_dist = dist                best = obj        return best     def run(self, text):        ref_text, direction, obj_text = self.parse(text)        if ref_text is None:            return None        ref_color, ref_shape = self.extract_attr(ref_text)        obj_color, obj_shape = self.extract_attr(obj_text)        landmark = self.find_by_attr(ref_color, ref_shape)        if landmark is None:            return None        dx, dy = REL_DIR[direction]        target = self.pick_by_direction(landmark, dx, dy)        if target is None:            return None        if (target.color, target.shape) != (obj_color, obj_shape):            return None        return target  if __name__ == "__main__":    red_circle = ObjectBox("red_circle", "red", "circle", 300, 220, 90, 80)    green_tri = ObjectBox("green_tri", "green", "tri", 120, 200, 80, 90)    blue_rect = ObjectBox("blue_rect", "blue", "rect", 60, 60, 100, 70)    gray_rect = ObjectBox("gray_rect", "gray", "rect", 420, 120, 70, 60)    engine = RecEngine([red_circle, green_tri, blue_rect, gray_rect])    expr = "红色圆形左侧的绿色三角形"    pred = engine.run(expr)    print("指代句:", expr)    if pred is not None:        print("预测目标:", pred.name)        gt = ObjectBox("green_tri_gt", "green", "tri", 130, 210, 72, 82)        iou = compute_iou(pred, gt)        print("预测框:", pred.x, pred.y, pred.w, pred.h)        print("真实框:", gt.x, gt.y, gt.w, gt.h)        print("IoU = %.3f" % iou)        print("Acc@0.5:", "通过" if iou >= 0.5 else "未通过")    else:        print("未找到目标")
目的:这是 REC 推理的迷你模拟——解析指代句“红色圆形左侧的绿色三角形”,先找到参照物红色圆形,再按方向筛选出绿色三角形,最后用 IoU 模拟评测判定。
  1. inter = max(0.0, x2 - x1) * max(0.0, y2 - y1)计算两个框交集的宽高乘积,即重叠面积,这是 IoU 的分子。
  2. union = area_pred + area_gt - inter并集面积等于两框面积之和减去交集,防止重叠部分被重复计算。
  3. parts = re.split(r"[的\s]+", text)用“的”和空格把指代句切成“参照物、方向词、目标物”三段。
  4. dist = (ox - lx) * dx + (oy - ly) * dy用方向向量点积判断目标是否真的在参照物的左侧或右侧,相当于空间关系打分。
  5. landmark = self.find_by_attr(ref_color, ref_shape)先定位参照物(红色圆形),这对应 REC 中“先理解参照关系再找目标”的推理逻辑。
  6. if (target.color, target.shape) != (obj_color, obj_shape)验证按方向找到的物体属性是否与描述中的目标属性一致,防止误选。
  7. iou = compute_iou(pred, gt)用预测框和真实框计算 IoU,再判断是否达到 Acc@0.5 的命中线。

常见误区

误区我刚学的时候以为 REC 就是目标检测,都是“在图片里画框框”,那直接把检测模型拿过来改改不就行了?

正解目标检测是从固定类别表(人、车、猫)里回答“画面里有什么”;REC 回答的是“这句话指的是哪一个”。描述是开放、组合无限的,比如“穿蓝衣服小孩旁边的红书包”里没有一个词是预设类别。检测器没有文本入口,必须先检测出候选再匹配语言,两者任务本质不同。

为何常见:两者输出都是边界框,视觉呈现太像,初学者容易只盯着“画框”这个动作,忽略输入里多出来的那句自然语言。

误区Acc@0.5 是不是表示预测框和真实框有一半面积重叠就够了?那门槛好像挺宽松的。

正解IoU 是交集除以并集,不是简单的一半。当预测框比真实框大很多时,即使真实框完全被包含,IoU 也可能不到 0.5;反之小物体偏移几个像素就断崖式掉分。Acc@0.5 表示“IoU≥0.5 的样本占比”,是大规模评测的通用及格线,并不代表框得漂亮。

为何常见:把 Acc@0.5 里的“0.5“直接理解为”重叠面积比例”,忽略了 IoU 分母是并集而非某个框的面积。

误区用了 Transformer 的 REC 模型肯定比 CNN 两阶段方法好,效果不行就换更大的模型。

正解模型结构只是影响因素之一。两阶段方法的性能上限取决于候选生成质量,但逻辑清晰、易调试;Transformer 方法表达能力更强,但通常需要更多数据和更久训练,在小数据或域差异大的场景下未必占优。评判标准是 Acc@0.5/Acc@0.9 等指标,而不是“是不是 Transformer”。

为何常见:论文标题容易给人“新架构=更优”的错觉,忽略了实验数据量、训练策略、评测协议等条件差异。

误区模型在 RefCOCO 上 Acc@0.5 到了 90%,直接拿去产品里用应该没问题。

正解评测基准是“标准考题”,不等于真实场景。RefCOCO 的描述由标注员按规范生成,相对简洁;真实用户口语随意、背景杂乱、目标小且常有歧义。部署前要在目标场景的自建评测集上重新评估,必要时微调模型并结合人工抽检。

为何常见:基准分数直观有冲击力,但训练分布与部署分布不一致是机器学习落地中最常见的陷阱之一。

误区主任务的定位损失做好就行了,加分割、问答这些辅助损失纯属浪费时间。

正解多任务联合让模型共享视觉-语言对齐能力,相当于让“找东西的玩家”同时练习“描述边界”和“理解语义”,往往能显著提升小目标和长描述场景下的 Acc@0.5。当然辅助损失需要调权重,不是越多越好。

为何常见:单任务收敛快、调参简单,辅助任务的收益是间接的,短期看不到效果就容易低估其价值。

面试题

Q1. REC 任务中,模型接收的核心输入是什么?

单选题 · easy

  • A.仅一张彩色图像
  • B.仅一句自然语言
  • C.图像加描述文本← 正确答案
  • D.视频与音频流

答案:C。REC 是跨模态任务,必须同时接收图像和指代文本,模型才能把“这句话”与“画面位置”对应起来。只给图像就是纯视觉任务,只给文本无法定位,视频音频则属于其他模态场景。

Q2. 计算 IoU 时,分母表示什么?

单选题 · mid

  • A.两框交集的面积
  • B.两框并集的面积← 正确答案
  • C.预测框自身的面积
  • D.真实框自身的面积

答案:B。IoU 是交集面积除以并集面积。并集 = 预测框面积 + 真实框面积 - 交集面积,这样两个框重叠的部分不会被重复计算。选交集面积是分子而非分母,选单框面积则忽略了另一个框。

Q3. RefCOCO+ 与 RefCOCO 数据集的主要区别是什么?

单选题 · mid

  • A.前者禁止出现位置词← 正确答案
  • B.前者图片数量更多
  • C.前者表达语句更长
  • D.前者目标类别更少

答案:A。RefCOCO+ 规定标注时不能使用“左边”“右边”等绝对位置词,迫使模型依赖物体的外观和属性来理解指代,因此难度更高。图片数量、句子长度和类别数不是两者的核心区分点。

Q4. Acc@0.5 指标的含义是什么?

单选题 · hard

  • A.预测框与真值框 IoU 大于等于 0.5 的样本占比← 正确答案
  • B.预测框中心与真值框中心距离小于 0.5 像素
  • C.模型输出置信度高于 0.5 的样本总数
  • D.数据集里被标注框覆盖面积超过一半的物体数

答案:A。Acc@0.5 统计的是所有测试样本中,IoU 达到 0.5 的样本比例。它衡量的是“框得够不够准”,与置信度、像素距离、标注覆盖率无关。这是 REC 评测中最常用的命中率指标。

Q5. 两阶段 REC 算法的典型流程是什么?

单选题 · mid

  • A.先生成候选框,再按描述匹配打分← 正确答案
  • B.直接回归目标框坐标而不生成候选
  • C.将图像与文本拼接后交给分类器
  • D.使用聚类算法分割所有物体再标注

答案:A。两阶段方法先由检测器提候选区域,再逐一计算候选与指代句的匹配分,选最高分者。直接回归坐标是单阶段思路,拼接分类和聚类分割都不是 REC 的主流范式。

Q6. 下列哪些属于指代表达的典型应用?

多选题 · mid

  • A.机器人按描述抓取物体← 正确答案
  • B.图像编辑中按描述抠图← 正确答案
  • C.语音识别中的声纹认证
  • D.智能相册按描述定位照片← 正确答案

答案:ABD。机器抓取需要理解“拿起那个红色杯子”这类指令,图像编辑需要按描述定位抠图区域,智能相册需要按描述锁定照片中的目标,三者都是 REC 的落地场景。声纹认证属于语音生物识别,与视觉定位无关。

Q7. 跨模态融合模块的主要作用是什么?

单选题 · easy

  • A.将视觉与文本特征对齐← 正确答案
  • B.压缩图像分辨率大小
  • C.把中文翻译成英文
  • D.为图像增加更多通道

答案:A。跨模态融合让视觉特征和文本特征在同一个空间里“对话”,确定画面中哪些区域与描述中的词最相关。压缩分辨率是图像预处理,翻译是纯文本任务,增加通道是图像处理操作,都不是融合模块的职责。

Q8. 下列哪些因素可能导致 REC 模型表现明显下降?

多选题 · hard

  • A.指代句含有歧义表达← 正确答案
  • B.目标被其他物体遮挡← 正确答案
  • C.训练标注存在噪声← 正确答案
  • D.显示器刷新率较低

答案:ABC。语言歧义会让模型难以确定指代对象,遮挡会让视觉特征不完整,标注噪声会直接污染训练信号,三者都会拉低定位准确率。显示器刷新率是硬件显示参数,与模型推理无关。

Q9. 关于 Acc@0.9 与 Acc@0.5,下列说法正确的是?

多选题 · mid

  • A.前者要求边界框更精准← 正确答案
  • B.前者比后者更难达标← 正确答案
  • C.大物体更容易通过前者← 正确答案
  • D.两者评估标准完全相同

答案:ABC。Acc@0.9 要求 IoU 达到 0.9,边界框必须几乎完全重合,比 0.5 严格得多。大物体容错率高,小物体偏移几像素就掉分,所以大物体更容易通过高阈值。两者阈值不同,评估标准自然不相同。

Q10. 对于“蓝衣小孩旁边的红书包”,两阶段算法最可能在哪一步出错?

单选题 · extreme

  • A.候选框生成漏掉小红书包← 正确答案
  • B.文本编码把蓝色认成绿色
  • C.评测指标把并集算大
  • D.数据划分把样本分错

答案:A。“红书包”是小目标且紧挨着小孩,两阶段方法如果检测器没把它生成候选,后续匹配再准也找不到——这是两阶段范式“候选遗漏”的经典瓶颈。文本编码混淆颜色和指标计算、数据划分问题不属于该算法特有的主要风险。