视觉定位这个方向这两年卷得厉害,但大部分工作都绕不开一个核心矛盾:要么依赖大规模标注数据做微调,要么推理时需要额外的检测器或分割模型做辅助。GroundingAgent 这篇 AAAI 2026 的工作走了一条不太一样的路——用智能体推理的方式做免训练视觉定位。我读完后的第一反应是:这个思路其实把“定位”这件事从传统的回归/分类范式,重新拆解成了“推理+验证”的搜索过程。下面我按自己的理解,把这篇工作的设计思路、核心机制、实操要点和潜在坑点完整拆一遍。
1. 视觉定位任务的现状与GroundingAgent的切入点
1.1 传统视觉定位为什么绕不开训练
视觉定位(Visual Grounding)要解决的问题很直观:给一张图和一句自然语言描述,找出描述对应的目标区域,输出通常是边界框或分割掩码。听起来简单,但落地时你会发现它比想象中难得多。
传统方案大致分两条路。第一条是两阶段方法:先用一个预训练检测器(比如 Faster R-CNN)生成一堆候选框,再用一个语言模型对每个候选框做匹配打分,选最高的那个。第二条是单阶段方法:直接用一个多模态网络把图像特征和文本特征对齐,端到端回归出目标框,代表工作像 TransVG、VGTR 这类。
这两条路有个共同点——都需要在标注数据上做训练或微调。RefCOCO、RefCOCO+、RefCOCOg 这些标准数据集虽然规模不小,但标注成本极高,而且训练出来的模型换一个域(比如从自然图像换到工业质检图像)性能就掉得厉害。这就是所谓的域偏移问题。
更麻烦的是,很多实际场景根本没有标注数据。你拿到一批新的产品图,想用自然语言定位“左上角那个有划痕的零件”,没有标注,传统方法直接歇菜。
1.2 免训练范式的价值在哪里
免训练(Training-free)视觉定位的核心诉求是:不更新任何模型参数,直接利用已有的预训练模型能力完成定位。这条路的价值在于泛化性和部署成本。
泛化性方面,免训练方法不依赖特定数据集的分布,理论上换任何域都能用,只要预训练模型本身见过类似的概念。部署成本方面,你不需要准备标注数据、不需要跑训练流程、不需要调超参,拿到就能用。
但免训练也有代价。没有针对性训练,模型对细粒度描述的理解能力会弱一些,尤其是涉及空间关系(“左边那个”“被遮挡的”)和属性组合(“红色的圆形按钮”)时,纯靠预训练模型的零样本能力往往不够。
GroundingAgent 的切入点就在这里:既然单个模型零样本能力有限,那就用多个模型协作,通过智能体式的推理流程把定位任务拆解成可验证的子步骤,用推理来弥补训练的缺失。
1.3 GroundingAgent的核心思路拆解
GroundingAgent 的整体框架可以理解为一个“提议-验证-修正”的闭环。它不直接输出一个框,而是让一个基于多模态大模型的智能体去分析文本描述,生成候选区域,然后调用视觉工具(比如分割模型、检测模型)去验证这些候选是否匹配描述,不匹配就调整,直到找到最合理的区域。
这个思路借鉴了智能体(Agent)领域的 ReAct 范式——推理(Reasoning)和行动(Acting)交替进行。在 GroundingAgent 里,“推理”是多模态大模型对描述和图像的理解,“行动”是调用外部视觉工具获取更精确的定位信息。
关键设计在于:它把定位任务从“一次前向传播”变成了“多轮交互”。每一轮,智能体根据当前掌握的信息决定下一步做什么——是生成新的候选框,还是放大某个区域细看,还是调用分割工具获取精确边界。这种动态决策能力是传统单次推理方法不具备的。
2. 智能体推理机制的核心细节
2.1 多模态大模型作为推理引擎的选型考量
GroundingAgent 的推理引擎用的是多模态大模型(MLLM),具体选型上通常会考虑 GPT-4V、Qwen-VL、InternVL 这类具备强视觉理解能力的模型。选型时主要看三个维度:视觉定位能力、工具调用能力、推理链稳定性。
视觉定位能力指的是模型本身能不能大致指出目标在哪里。有些 MLLM 虽然能描述图像内容,但你让它输出坐标,它给的框偏差很大。这类模型就不适合做 GroundingAgent 的推理引擎,因为初始候选质量太差,后续验证轮次会很多,效率低。
工具调用能力指的是模型能不能按照预设格式输出工具调用指令。GroundingAgent 需要模型在推理过程中决定“调用分割工具”还是“调用检测工具”,这要求模型具备结构化输出能力。实测下来,经过工具调用微调的模型(比如支持 function calling 的版本)在这块表现明显更好。
推理链稳定性指的是模型在多轮交互中会不会“跑偏”。有些模型第一轮理解对了,第二轮被工具返回的结果干扰,反而给出了错误判断。这个在实操中很常见,后面讲排查技巧时会细说。
2.2 候选区域生成:从粗到细的策略
候选区域生成是 GroundingAgent 的第一步。它不依赖传统检测器的 region proposal,而是让 MLLM 直接根据文本描述生成初始候选。
具体做法通常是:把图像和描述一起输入 MLLM,要求它输出一个或多个可能的目标区域坐标。这里有个细节——直接让模型输出精确坐标往往不准,所以实际实现中会采用“网格化”或“锚点化”的策略。比如把图像划分成若干网格,让模型先指出目标在哪个网格,再在该网格内细化。
我试过类似的流程,发现一个实用技巧:让模型先输出目标的中心点大致位置,再输出宽高估计,比直接输出左上右下坐标要稳。原因是中心点定位对模型来说更直观,宽高估计即使有偏差,后续也可以通过分割工具修正。
候选生成阶段一般会产出 3-5 个候选区域,按置信度排序。这些候选会进入验证阶段,而不是直接选最高的那个。这个设计很关键——MLLM 的置信度校准往往不准,直接取最高分容易踩坑。
2.3 视觉工具调用与验证闭环
验证阶段是 GroundingAgent 区别于普通 MLLM 定位的核心。它会调用外部视觉工具来验证候选区域是否真的匹配描述。
常用的工具包括:
- 分割模型(如 SAM 系列):给定一个点或框,输出精确的分割掩码。用来验证候选区域内是否包含一个完整、合理的物体。
- 检测模型(如 Grounding DINO):给定文本和图像,输出匹配的框。用来交叉验证 MLLM 的候选是否合理。
- 图像裁剪与放大工具:把候选区域裁出来放大,再送回 MLLM 细看。用来处理小目标或细节丰富的场景。
验证闭环的逻辑是:智能体拿到工具返回的结果后,判断当前候选是否满足描述。如果满足,输出结果;如果不满足,根据差异调整候选,进入下一轮。
这里有个设计上的取舍——验证轮次不能无限多,否则推理成本爆炸。实际实现中通常会设一个最大轮次(比如 5 轮),超过就输出当前最优候选。这个阈值需要根据任务复杂度调,简单描述 2-3 轮就够,复杂空间关系可能需要 4-5 轮。
2.4 免训练特性如何保证泛化能力
免训练的核心在于所有组件都是预训练好的,GroundingAgent 本身不引入任何需要训练的参数。它的“智能”来自于推理流程的设计,而不是模型权重的更新。
这种设计的泛化优势在跨域场景下特别明显。比如从自然图像换到医学影像,传统方法需要重新标注和微调,GroundingAgent 只需要换一个在医学影像上预训练的分割工具,推理流程不变。
但免训练也有明显的边界。如果描述涉及预训练模型完全没见过的概念(比如某种特定型号的工业零件),推理引擎和工具都无法理解,定位就会失败。这种情况下,要么补充少量示例做上下文学习,要么还是得走微调路线。
3. 实操流程与关键环节实现
3.1 环境准备与模型选型清单
要复现 GroundingAgent 的流程,你需要准备以下组件:
| 组件类型 | 推荐选型 | 作用 | 备注 |
|---|---|---|---|
| 推理引擎 | Qwen-VL-Max / GPT-4V | 理解描述、生成候选、决策 | 需支持结构化输出 |
| 分割工具 | SAM-HQ / MobileSAM | 精确边界提取 | MobileSAM 速度快,适合实时 |
| 检测工具 | Grounding DINO | 交叉验证候选 | 支持开放词汇检测 |
| 图像处理 | OpenCV / PIL | 裁剪、放大、坐标变换 | 基础依赖 |
| 编排框架 | 自研轻量 Agent 循环 | 管理多轮交互 | 不建议用重型框架 |
选型时有个经验:推理引擎和检测工具的能力要匹配。如果推理引擎很强但检测工具很弱,验证阶段会频繁失败,轮次飙升。反过来,检测工具很强但推理引擎理解不准,初始候选质量差,也白搭。实测下来,Qwen-VL-Max + Grounding DINO + SAM-HQ 这个组合在通用场景下比较均衡。
3.2 完整推理流程的分步拆解
整个流程可以拆成六个步骤,我用伪代码的方式说明关键逻辑:
# 步骤1:初始理解与候选生成 def generate_candidates(image, description, mllm): prompt = f""" 图像中有一个目标,描述为:{description} 请输出3个可能的候选区域,每个区域包含中心点坐标和宽高估计。 格式:[{{"cx": x, "cy": y, "w": w, "h": h, "confidence": c}}, ...] """ response = mllm.generate(image, prompt) candidates = parse_json(response) return candidates # 步骤2:候选验证 def verify_candidate(image, description, candidate, tools): # 裁剪候选区域 cropped = crop_image(image, candidate) # 调用分割工具获取精确掩码 mask = tools['sam'].segment(cropped, candidate['center']) # 调用检测工具交叉验证 detections = tools['dino'].detect(image, description) # 计算候选与检测结果的重叠度 iou = compute_iou(candidate, detections) return {'mask': mask, 'iou': iou, 'detections': detections} # 步骤3:智能体决策 def agent_step(image, description, candidates, history, mllm): prompt = f""" 当前描述:{description} 候选区域:{candidates} 历史验证结果:{history} 请判断:当前最优候选是否匹配描述? 如果不匹配,请说明原因并给出调整后的候选。 如果需要更多信息,请指定调用哪个工具。 """ decision = mllm.generate(image, prompt) return decision # 步骤4:主循环 def grounding_agent(image, description, max_rounds=5): candidates = generate_candidates(image, description, mllm) history = [] for round_idx in range(max_rounds): best_candidate = candidates[0] verification = verify_candidate(image, description, best_candidate, tools) history.append(verification) decision = agent_step(image, description, candidates, history, mllm) if decision['status'] == 'accept': return best_candidate, verification['mask'] elif decision['status'] == 'adjust': candidates = decision['new_candidates'] elif decision['status'] == 'tool_call': tool_result = call_tool(decision['tool'], decision['args']) history.append(tool_result) return candidates[0], history[-1]['mask']这个流程里,步骤3的决策提示词设计是成败关键。提示词需要明确告诉模型:什么情况下接受候选,什么情况下调整,什么情况下调用工具。模糊的提示词会导致模型反复犹豫,轮次浪费。
3.3 提示词工程的关键设计
提示词在 GroundingAgent 里不是简单的“描述任务”,而是要引导模型完成一个结构化的推理过程。我总结了几条实操中验证有效的设计原则。
第一,角色设定要具体。不要只说“你是一个视觉助手”,而要说“你是一个视觉定位智能体,你的任务是通过多轮推理找到描述对应的精确区域”。角色越具体,模型的行为越符合预期。
第二,输出格式要强制约束。用 JSON schema 或者明确的格式说明,让模型每次输出都可解析。实测下来,不加格式约束的话,模型会混入大量自然语言解释,解析起来很痛苦。
第三,决策逻辑要显式列出。比如明确写“如果候选区域与检测结果 IoU 大于 0.5,且分割掩码完整,则接受;否则调整”。这种显式规则能显著提升决策一致性。
第四,历史信息要精简。多轮交互后,历史记录会很长,全部塞进提示词会超出上下文限制。实际实现中通常只保留最近 2-3 轮的验证结果,更早的用摘要代替。
3.4 坐标变换与后处理细节
GroundingAgent 涉及多次坐标变换——从原图到裁剪区域,从裁剪区域到分割掩码,再映射回原图。这块容易出 bug,我踩过几次坑。
关键点在于:每次裁剪都要记录变换矩阵(缩放比例、平移量),分割掩码映射回原图时要用逆变换。如果中间有多次裁剪嵌套,变换矩阵要按顺序累积。
另一个细节是边界处理。候选框可能超出图像边界,裁剪时要 clamp 到有效范围,但映射回原图时要注意不要引入偏移。我的做法是统一用归一化坐标(0-1 范围)做中间表示,最后再转回像素坐标,这样能减少边界问题。
后处理阶段还要做一次非极大值抑制(NMS),因为多轮调整可能产生重叠的候选。NMS 的 IoU 阈值建议设 0.5-0.6,太低会误删正确候选,太高会保留冗余。
4. 常见问题与排查技巧实录
4.1 候选框偏移严重怎么办
这是最常见的问题。表现是 MLLM 生成的候选框和真实目标偏差很大,导致后续验证轮次飙升。
排查思路分三层。第一层,检查 MLLM 的坐标输出格式是否和你的解析逻辑匹配。有些模型输出的是归一化坐标,有些是像素坐标,混了就会偏。第二层,检查图像预处理是否有缩放。如果输入 MLLM 的图像被 resize 过,坐标要相应变换。第三层,如果前两层都没问题,那就是模型本身的定位能力不足,考虑换更强的 MLLM 或者改用“网格+细化”的两阶段生成策略。
实操技巧:让模型输出坐标时附带一个“参考点”描述,比如“目标中心大约在图像水平方向 40%、垂直方向 60% 的位置”。这个描述可以用来交叉验证坐标是否合理,偏差大时能及时发现。
4.2 多轮推理不收敛的解决思路
不收敛的表现是智能体反复调整候选,每轮都说“还差一点”,但就是不给最终结果。这个问题通常出在决策提示词上。
解决方法是给决策加一个“收敛条件”。比如明确写“如果连续两轮调整后的候选 IoU 变化小于 0.05,则接受当前最优候选”。这个条件能强制模型在候选稳定后停止调整。
另一个原因是验证工具返回的结果矛盾。比如分割工具说候选区域是个完整物体,但检测工具说这里没有匹配目标。这种矛盾会让模型犹豫。解决办法是给工具结果设优先级——通常分割工具的几何信息更可靠,检测工具的语义信息更可靠,根据任务侧重选择。
4.3 小目标和密集场景的定位技巧
小目标定位是免训练方法的弱项。MLLM 对小目标的感知能力有限,初始候选往往偏大或偏。
实用技巧是“先放大再定位”。第一轮不直接定位小目标,而是先定位包含小目标的大致区域,然后裁剪放大,在放大后的图像上做第二轮定位。这样相当于人为提升了小目标的像素占比,模型更容易看清。
密集场景(比如货架上排列的商品)的难点是候选区域容易混淆。这时候要充分利用描述中的空间关系词——“左边第二个”“最上面那个”。提示词里要强调这些关系词,让模型在生成候选时优先考虑空间约束。
4.4 推理成本控制的实战经验
GroundingAgent 的多轮推理成本不低,尤其是调用 GPT-4V 这类闭源模型时。控制成本有几个实用手段。
第一,分级调用。简单描述(单一物体、无空间关系)用轻量模型跑 1-2 轮,复杂描述才上强模型。判断复杂度可以用一个简单的规则:描述里有没有空间关系词、属性词数量、是否涉及多个物体。
第二,缓存中间结果。同一张图多次查询时,图像特征可以缓存,避免重复编码。分割工具的掩码也可以缓存,相同候选区域不重复分割。
第三,并行候选验证。生成多个候选后,验证阶段可以并行调用工具,而不是串行。这样能把验证时间从 O(n) 降到 O(1),代价是工具调用并发数上升。
实测下来,一张图平均 3 轮推理,用 Qwen-VL-Max 的成本大约是同规模闭源模型的 1/5,效果差距在 5% 以内。如果对精度要求不是极致,轻量模型完全够用。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 候选框整体偏移 | 坐标格式不匹配 | 打印原始输出检查 | 统一坐标表示 |
| 候选框偏大 | MLLM 宽高估计不准 | 对比分割掩码 | 用分割结果修正 |
| 多轮不收敛 | 决策提示词模糊 | 检查决策日志 | 加收敛条件 |
| 小目标定位失败 | 像素占比太低 | 检查裁剪后分辨率 | 先放大再定位 |
| 密集场景混淆 | 空间关系未利用 | 检查提示词 | 强调关系词 |
| 工具返回矛盾 | 工具能力不匹配 | 分别验证工具 | 设优先级 |
| 推理成本过高 | 轮次过多 | 统计平均轮次 | 分级调用+缓存 |
| 分割掩码不完整 | 分割工具选型不当 | 换工具对比 | 用 SAM-HQ |
5. 影响范围与适用场景分析
5.1 哪些场景最适合这套方案
GroundingAgent 的免训练特性决定了它最适合标注数据稀缺、域变化频繁的场景。
工业质检是典型场景。产线上的缺陷类型经常变,今天检划痕,明天检气泡,传统方法每换一种缺陷就要重新标注训练。用 GroundingAgent,只需要用自然语言描述缺陷特征,推理流程不变,换描述就行。
遥感图像分析也适合。遥感图像标注成本极高,而且不同卫星、不同分辨率的数据分布差异大。免训练方法在这里的泛化优势很明显。
机器人交互场景同样受益。用户用自然语言指令机器人“把桌子左边那个红色杯子拿过来”,GroundingAgent 可以直接定位,不需要针对每个新物体重新训练。
5.2 当前方案的局限与边界
免训练不是万能的。最大的局限是精度上限受预训练模型能力约束。如果预训练模型本身对某类目标的理解就不好,GroundingAgent 再怎么推理也补不回来。
另一个局限是推理延迟。多轮交互意味着多次模型调用,延迟比单次前向传播高一个数量级。对实时性要求高的场景(比如自动驾驶),这套方案目前还不适用。
还有就是复杂空间关系的处理。涉及三个以上物体的相对位置描述(“A 在 B 左边、C 右边”),MLLM 的推理容易出错。这类场景可能需要引入专门的场景图解析模块。
5.3 后续可以扩展的方向
从这篇工作的思路出发,有几个自然的扩展方向。
一是工具集的扩展。目前主要用分割和检测工具,未来可以接入深度估计、姿态估计等工具,支持更复杂的定位需求(比如“那个正在举手的”)。
二是推理流程的优化。当前是串行的多轮交互,可以探索并行推理——同时生成多个候选并验证,用投票机制选最优,减少轮次。
三是与轻量微调结合。免训练是优势,但在特定高频场景下,用少量数据做轻量微调(比如 LoRA)能显著提升精度,同时保留大部分泛化能力。这个混合路线可能是落地的最优解。
我在实际项目里试过类似的混合方案:通用场景走免训练流程,高频场景用少量标注数据微调一个轻量适配器。实测精度比纯免训练提升 15% 左右,而标注成本只有全量微调的 1/10。这个思路值得在 GroundingAgent 的框架上进一步验证。
最后分享一个实操中的小发现:GroundingAgent 的推理轮次和描述的具体程度强相关。描述越具体(包含颜色、形状、空间关系),需要的轮次越少。所以实际部署时,可以在前端加一个描述规范化模块,把用户的模糊描述补全成结构化描述,能显著降低推理成本。这个模块用规则+小模型就能做,成本很低,但效果立竿见影。