细粒度视觉定位:不是找到「车」,而是找到「那辆银色 SUV 的左前轮」

停车场里的一句人话,难倒了整个检测系统

假如你站在停车场,对着一台搭载了视觉识别系统的机器人说:“帮我把那辆银色SUV的左前轮擦干净。” 机器人大概率会先给你一个整车框,然后在框上贴一个标签:银色SUV。至于左前轮在哪里?它答不上来。

AI technology illustration

这个场景不是未来科幻,而是当前计算机视觉要攻克的硬骨头——细粒度视觉定位。它的任务不是“找到一辆车”,而是“找到那辆银色SUV的左前轮”。从“车”到“轮子”,中间隔着一层厚厚的语言理解和空间推理。

传统检测为什么输在一个“轮”字上

我们先看看传统目标检测器在做什么。给它一张图,它输出一堆边界框,每个框配一个标签。标签来自训练集里预定义的类别,比如COCO数据集只有80个类:轿车、卡车、自行车……没有“左前轮”这种细粒度部件。

有人会说:那我多标几个类不就行了?问题在于,世界上的物体组合是无限的。“银色”“SUV”“左前”“轮”这些词排列组合,训练集根本覆盖不完。真正的细粒度定位要理解的是描述,而不是记住类别。

维度 传统目标检测 细粒度视觉定位
输出 边界框 + 固定类别 边界框/掩码 + 自然语言短语
类别空间 封闭的(80类) 开放的(任意描述)
属性理解 不识别“银色” 需要识别颜色、材质等属性
空间关系 不关心“左前” 需要结合物体朝向判断

这张表大概是所有检测工程师的心头痛:前两行可以通过扩充数据解决,后两行是本质性的认知鸿沟。

视觉接地:让检测器听懂人话

细粒度视觉定位在学术界有一个正式名字:视觉接地(Visual Grounding)。给定一张图和一句自然语言描述,模型要定位出对应的图像区域。这个区域不一定是一个完整物体,也可以是物体的一个部分,比如“左前轮”。

早期做法是“两步走”:先用目标检测器生成一堆候选框,然后用语言模型对每个框打分,选出最匹配的。我曾经以为这就是终点——把候选框切细一点,语言模型再强一点,总能命中吧?

直到我亲身跑了一个实验,让模型定位“戴帽子的左边的人”。模型确实找到了人,但它的框落在画面右侧的那个人身上。原因很直接:它把“左边”理解成了“离图像左边缘近”,而实际上那句话指的是画面里这个人的左边还是右边?这让我意识到,语言与空间的关系不是简单的坐标对应

GLIP:把检测重写成一句文本匹配

2022年,微软的 GLIP(Grounded Language-Image Pre-training)提出了一个颠覆性的视角:目标检测本来就是“图片区域和短语的对应”。他们把传统检测中的类别标签(比如“car”)改写成一句话:“car . truck . person . …”然后让模型同时看图和这句话,学习把每个名词短语和图像区域对齐。

这样一来,“银色SUV”就不是一个需要预先定义的类,而是一段可以自由组合的文本。检测变成了文本引理(grounding)。用没见过的类别做测试,模型也能根据文本提示把区域找出来,这就是开放词汇检测。

但GLIP也有一个天真的假设:它把文本和区域做点乘匹配,认为“左前轮”这个词组在语义上是一个整体。实际上,“左前”是两个独立的空间修饰,需要两步推理:先找到轮子,再判断哪个是左前。GLIP在这一步基本是瞎猜的。

Grounding DINO:更强的编码器,更聪明的匹配

Grounding DINO 在2023年把GLIP的思路和DINO检测器结合,用Transformer做跨模态融合,让文本特征和图像特征在连续层中互相“交换情报”。它不仅能处理“银色SUV”这样的名词短语,还能捕捉一些简单的属性词。

用起来也很简单:

from groundingdino.util.inference import load_model, load_image, predict

model = load_model("GroundingDINO_SwinT_OGC.py", "groundingdino_swint_ogc.pth")
image, _ = load_image("parking_lot.jpg")
boxes, logits, phrases = predict(
    model=model,
    image=image,
    caption="银色 SUV 的左前轮",
    box_threshold=0.3,
    text_threshold=0.25
)

你可以在Hugging Face上亲自试试。我试过很多次,结果是:如果你输入“车轮”,模型的框非常准;如果你输入“左前轮”,它经常只找到“轮”,再随便挑一个。换句话说,它知道了“轮”,但没学会“左前”。

空间逻辑才是最后一堵墙

为什么“左前”这么难?因为这个词组的理解依赖于物体自身的坐标系。车头朝向左边时,左前轮在画面左侧;车头朝向右边时,左前轮反而可能在画面右侧。模型必须先从图像中推断出“车头朝向”,再计算“左”和“前”的交集。

更糟的是,有些情况下左前轮被遮挡了。比如从车正后方拍摄,左前轮藏在车体后面。人类会脑补“哦那是后侧视角,所以左前轮在那边”,模型则完全没有这种世界模型。它只会从可见的像素中找答案。

那有什么办法绕过去?

  1. 把任务拆开:先用通用检测器找到车辆,再用专用部件检测器(如YOLO专门识别4个轮子)找到所有轮子,最后用规则判断哪个是左前(根据车辆朝向)。
  2. 把语言变成二维空间坐标:用一个大模型(比如GPT-4V)首先生成车辆的朝向、左右规则,再输出“左前轮”的相对位置,最后指导检测器。
  3. 用掩码文本预训练:构建包含空间关系的区域-文本对,比如“图片左侧的轮胎”“车头前面的保险杠”,让模型显式学习“左/右/前/后”是如何映射到图像的。

这些思路没有哪个是银弹,但至少比让模型在黑暗中猜方向要可靠。

常见误区,一次说清

误区一:细粒度定位就是更高分辨率的图像分割

完全不是。语义分割输出一个像素级标签,但标签集合是固定的。细粒度定位要处理的是开放世界描述,哪怕这个描述从来没出现在训练集里,模型也得理解并定位。

误区二:CLIP也能精确框出“左前轮”

CLIP只能给你一张图和一句话的全局相似度,无法输出边框。你可以用Grad-CAM做热力图,但热力图的模糊程度比轮胎还宽。想做细粒度定位,还是得靠检测框架。

误区三:只要数据够多,模型一定能学会“左前”

不一定。数据多能解决常见短语,但空间关系是组合爆炸的。哪怕你把所有物体的“左前”都标好,遇到“左侧第二个轮子后面那个螺丝”还是会抓瞎。我们需要的是可组合的推理,而不是记忆。

细粒度视觉定位的现实边界

总的来说,以2025年为坐标,细粒度视觉定位在“名词+形容词”型描述上已经相当能打,比如“银色SUV”“红色座椅”“破损轮胎”。但一旦涉及“左前”“上面”“第二个”这类需要空间推理的词,模型的准确率会断崖式下跌。

如果你在做一个需要精确操纵的机器人,我的建议是:把语言模型当作调度器,而不是定位器。让它先识别“车前有4个轮子”,再用几何规则算出左前轮的具体坐标——这种混合方案比端到端模型可靠得多。

我们离“机器人完全听懂人话”还很远,但至少现在,它能听懂“找到那辆银色SUV”了。至于“左前轮”,还需要我们再聪明一点。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/700.html

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

相关推荐