有一次,我用 Qwen-VL 做视觉定位测试。输入一张猫的照片,问它 "猫在哪里",它返回了一串看起来像乱码的文字:<box>174,82,413,379</box>。我当时有点懵——这算什么答案?后来拆开这三个部分我才意识到,这四个数字就是坐标。模型没有把位置画在图上,而是直接报了一串数字,就好像在用摩斯电码传递位置信息。

视觉定位:认出你是第一步,指给你看是第二步
视觉定位(Grounding)这个任务,要求模型不仅理解 "图里有什么",还要指出具体的位置。比如 "第二排左边那只红杯子",模型要能框出红杯子。这跟图像分类完全不同。传统方案是在模型后面接一个检测头,输出连续坐标。但 Qwen-VL 论文 走了另一条路:它把坐标写成了文本。
为什么是四点坐标,而不是中心点加宽高
一个矩形框,只需要两个点:左上角 (x1,y1) 和右下角 (x2,y2),摊开就是四个数字。这就是 "四点坐标"。为什么不写成中心点 + 宽高?看起来也只有四个数。但放到语言模型的自回归生成里,四点坐标有一个隐式好处:模型输出的第一个数字决定左边,第二个决定上边,第三个决定右边,第四个决定下边。它天然地把 "框住物体" 这个空间关系拆解成四个独立约束,而语言模型最擅长按顺序生成约束。
在 Qwen-VL 的格式里,这四个数会用特殊标记包裹起来:<box>x1,y1,x2,y2</box>。数字与数字之间用半角逗号分隔。这样,一个框在模型眼里就是一段普通的 token 序列。
把坐标当成一句话,训练就变成了外语学习
Qwen-VL 的架构里没有专门的检测头。它是一个标准的多模态大模型:视觉编码器把图片变成视觉 token,语言模型负责生成文本。想要它输出位置,最直接的办法就是让 "位置" 本身成为文本的一部分。
于是训练数据被格式化成类似这样的序列:
图片:[猫的图片]
文本:Find the cat
答案:<box>0.174,0.082,0.413,0.379</box>
这里坐标被归一化到 0~1 之间,实际实现可能会再缩放成整数。模型看到图片和 "Find the cat" 之后,需要预测出这串带标记的数字。预测方式与普通文本完全一样:自回归,一个 token 一个 token 地出。
关键点来了:坐标的损失函数就是普通的交叉熵,没有任何额外的回归损失。 模型不知道自己在 "回归坐标",它只知道自己在完成一个文本补全任务。
训练过程中,模型是怎么学会数字之间的约束的?
你可能想问:模型怎么学会 0.1 和 0.2 之间的区别?怎么知道左上角的数要小于右下角的数?
答案在数据里。RefCOCO、RefCOCO+ 这类视觉定位数据集提供了大量 "描述-框" 样本。训练工具把这些框转换成上述格式,然后扔给模型模仿。你可以把一次训练看成下面几步:
- 取一张图片和它的真实框。
- 把图片切成 patch,加上位置编码,变成视觉 token。
- 把文本描述和真实框转换成目标 token 序列。
- 让语言模型依次预测目标序列中的每个 token。
- 计算交叉熵损失,反向传播更新权重。
模型通过数万次迭代发现,当图片某个位置出现一只猫时,它生成的 "0.174,0.082" 这样的数字总是接近猫的实际位置。数字对模型来说,和 "猫" 这个汉字没什么区别——都是一种符号。它学到的不是数学,而是符号与视觉特征之间的统计关联。
一张表说清传统检测和文本坐标的区别
| 方案 | 坐标如何产生 | 优点 | 缺点 |
|---|---|---|---|
| 检测头回归 | 连续的回归头直接输出数值 | 精度高,训练稳定 | 需要额外设计网络分支,难以统一多任务 |
| 文本坐标生成 | 语言模型逐个生成数字 token | 架构统一,无需改动模型结构 | 坐标离散化,可能出现非法框,精度受 token 粒度限制 |
我自己原来一直以为,视觉定位必须靠一个回归头。因为坐标是连续量,文本生成看起来是 "不务正业"。直到我想通一件事:语言模型学的是符号之间的关联,数字也是符号。它不需要 "算" 出坐标,只需要在合适的视觉特征下选出合适的数字 token。这种把连续问题转成离散序列的思路,虽然损失了一些精度,但换来了整个系统的统一——同一个模型既能写作文,又能报坐标,不需要为每个任务单独定制输出头。
几个容易被忽略的关键细节
- 特殊 token 也是 token:
<box>和</box>加入了词表,模型看到它们就知道要开始或结束坐标。 - 归一化让不同尺寸的图片对齐:坐标除以图片宽高,得到 0~1 之间的小数,模型就不用关心原始分辨率。
- 小数位数就是精度上限:如果保留三位小数,在 1000 像素的图上误差约 1 像素。模型生成数字串的过程,本质上是在做隐式的离散化。
三个关于四点坐标的常见疑问
Q:为什么不用像素坐标,而用归一化坐标?
像素坐标跟图片尺寸直接相关。同样的猫,在 2000×1000 的图和 500×250 的图上,坐标数字完全不同。归一化后,不同分辨率的图片对模型来说是一致的,训练数据也能更好地复用。
Q:模型怎么知道 <box> 后面要跟四个数字?
靠大量样本。训练时,所有正样本都在 <box> 后紧跟四个数字。模型学会了 "看到 <box> 之后,下一步是预测数字",就像它学会 "看到句号之后,下一步可能是大写字母" 一样。这是序列统计规律,不是显式规则。
Q:如果模型输出了五个数字怎么办?
会解析失败。实际工程里会加一层容错:以 </box> 为结束符,截取之前的部分,若数字数量不对就丢弃或重新采样。这也是文本坐标方案的常见痛点。
边界在哪里
文本坐标的致命弱点是:模型输出的 token 没有几何约束。你偶尔能看到它输出 x2<x1 这种非法框,或者两个数字粘连在一起。应对方法只能是在后处理里做钳制,比如取 min 和 max。
更麻烦的是,四点矩形框能承载的空间信息有限。如果目标很小,比如一只停在树枝上的小鸟,坐标稍微偏一点,IoU 就掉得很快。所以 Qwen-VL 的定位更适合 "指出大范围",而不是像素级精确。看看 Qwen-VL 官方仓库 里的 demo,你会发现它的边框都偏粗。这是不可避免的:你在训练时把所有框压成了 0~1 的小数,又要用自回归方式生成,精度上限就在那里。
但换个角度看,这套设计的价值不在精度,而在 通用性。它让多模态模型第一次用同一种方式处理 "看" 和 "说"。未来如果要做点标、线段、多边形,只需要定义新的特殊标记,模型就能学会。这比每次重新设计一个检测头要优雅得多。
我的结论是:Qwen-VL 用四点坐标把定位问题转成了生成问题,是有意为之的工程取舍。它不完美,但很聪明。下次你看到模型输出一串数字时,应该想到——那不是偶然,是语言模型在用它的语言,告诉你它眼里物体的位置。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/682.html