Qwen-VL 的视觉定位训练:怎么用四点坐标格式让模型输出物体的位置

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

AI technology illustration

视觉定位:认出你是第一步,指给你看是第二步

视觉定位(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+ 这类视觉定位数据集提供了大量 "描述-框" 样本。训练工具把这些框转换成上述格式,然后扔给模型模仿。你可以把一次训练看成下面几步:

  1. 取一张图片和它的真实框。
  2. 把图片切成 patch,加上位置编码,变成视觉 token。
  3. 把文本描述和真实框转换成目标 token 序列。
  4. 让语言模型依次预测目标序列中的每个 token。
  5. 计算交叉熵损失,反向传播更新权重。

模型通过数万次迭代发现,当图片某个位置出现一只猫时,它生成的 "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

(0)
上一篇 10小时前
下一篇 10小时前

相关推荐