Skip to content

如何评估 VLM 的定位与指点能力

定位按多个阈值下的 IoU 评分,指点按点落入区域的命中率评分,无可指对象则单独作为一种答案。以及为什么用给框评分的方式给点评分总是会失败。

定位评估问的是模型有没有把区域放在正确的位置;指点评估问的是它有没有把点放在正确的东西上。 两者需要不同的度量,而用定位的度量去评估指点,会把一个指点完全正确的模型报成彻底失败。

定位:报告多个阈值

以人工标注区域为参照,按 IoU0.25、0.5、0.75 与 0.9 四个阈值下为定位评分。

单一阈值无法区分"几乎正确"与"差得很远",而一个恰好被调到刚好跨过 0.5 的模型,看起来与一个真正贴合的模型毫无二致。跨阈值的曲线形状才是结论所在。

指点不是"画个小框的定位"

Molmo 系列的模型输出的是点。点没有面积,因此任何针对它的 IoU 都是 0。 用给定位模型评分的方式去给指点模型评分,无论它指得多好,报出来的都是彻底失败。

点所回答的问题是"它是否那个东西里面",因此度量是一个命中率:point_in_region

mean_miss_distance 只在未命中的样本上报告。若把命中样本也一并平均,它主要衡量的将是物体有多大,而不是模型偏得有多离谱。

标注者在点上的一致性是一个距离

同样的结构性问题也出现在标注者之间。把由重叠导出的度量套用到点上会饱和:两位标注者分别指向同一张图的对角,得分仍约为 0.86,而任何系数量表都会把它归入"高度一致"。

因此请报告标注者点位之间的平均距离与中位距离,以归一化图像单位表示,0 为完美。距离没有可饱和的上限,而把它称作距离,也就阻止了任何人把它当作系数来归档。

无可指对象是三种不同的错误

请分开跟踪:

结果含义
正确拒答该表达式并未指向画面中存在的任何东西,而模型也如实指出了
臆造了位置为一个并不存在的东西给出了区域
漏掉了确实存在的指称对象东西在那里,却没被找到

把它们合并成一个"错误"数字,会掩盖"过度断言"与"过度保守"之间的差别,而这两者的纠正方式恰好相反。

标注者从未作答的表达式会被排除,而不是计作漏检。 若把它计入,被跳过的短语越多、模型看起来就越差,而那说的其实是标注者,不是模型。

区域描述需要语义距离

描述同一个物体的两位标注者,很少会用到相同的实词。"一个把手有缺口的红马克杯"与"左边那个破了的杯子"描述的是同一个区域,却没有任何重合的实词。

请通过语义距离而非字符串重叠来计算描述的一致性。Krippendorff's α 接受任意距离函数,因此只要距离选对了,同一套系数机制便可沿用。

配置

yaml
annotation_schemes:
  # grounding_eval 负责绑定,但它自己不绘图,
  # 因此由一个图像模式来提供画布。
  - annotation_type: image_annotation
    name: region
    description: "Draw the region for the selected phrase."
    source_field: image
    tools: [bbox, polygon, landmark]
    labels: [{name: referent, color: "#6e56cf"}]
 
  - annotation_type: grounding_eval
    name: grounding
    description: "What does each phrase refer to?"
    region_type: box          # 指点评估时改用 `point`
    expressions_field: expressions

条目携带其短语,并带有稳定的 id:

json
{"id": "img1", "image": "/media/img1.jpg",
 "expressions": [{"id": "e1", "text": "the man in the red shirt"}]}

直接给一个字符串列表也可以,但此时 id 会回退为位置序号,因此重排该列表会让已有标注指向别处。

可用示例:RefCOCOPixMo-Points 展示设计。

复核模型预测

如果你是在审计一个模型,而不是在采集基准答案,请让预测在整条链路上都被标记为预测。一条标注者尚未接受的预测,是关于模型的证据;把它并入人工标注区域,就毁掉了它唯一的用途。

延伸阅读