向AI转型的程序员都关注公众号 机器学习AI算法工程
💡 一句话总结:英伟达联合多所顶尖高校发布的 LocateAnything,用仅 3B 参数实现了 10× 于 Qwen3-VL 的解码速度,同时在 LVIS、DocLayNet、ScreenSpot-Pro 等多个基准上刷新 SOTA。核心秘密:Parallel Box Decoding(并行框解码)——把一个 bounding box 当作一个原子单元一步解码,而不是逐 token 一个字一个字蹦。
一、开篇:VLM 视觉定位的"速度-精度"死结
视觉语言模型(VLM)正在成为机器人、自动驾驶、GUI Agent 等具身智能系统的"眼睛"。但有一个老问题一直没解决:现有 VLM 做目标检测时,把每个 bbox 坐标拆成多个 token,然后逐个 token 自回归生成。
这带来两个核心痛点:
- 几何不连贯:
x₁、y₁、x₂、y₂ 四个坐标被拆成 8 个独立 token,模型把它们当作互不相关的序列来学。跨框边界的 token 可能产生错误组合,"画出"完全不合理的框。 - 推理瓶颈:
自回归(NTP)逐 token 生成,一个框至少需要 8 步推理。检测 100 个目标就需要 800+ 步——延迟极高,吞吐极低。
最近 Multi-Token Prediction(MTP)试图用"并行预测多个 token"来加速,但标准 MTP 是结构无关的——它把 token 流随机分块,不区分"哪些 token 属于同一个框"。这会导致模型学到跨框边界的虚假模式,既不快也不准。
LocateAnything 的回答是:把一个框当作一个原子单元,一步解码整个框。
二、论文信息
论文标题:LocateAnything: Fast and High-Quality Vision-Language Grounding with Parallel Box Decoding
arXiv:https://arxiv.org/abs/2605.27365
项目主页:https://research.nvidia.com/labs/lpr/locate-anything/
GitHub:github.com/NVlabs/Eagle/tree/main/Embodied
HF 模型:nvidia/LocateAnything-3B
HF 在线Demo:nvidia/LocateAnything (Spaces)
三、核心创新:Parallel Box Decoding(PBD)
3.1 从"逐 token 蹦字"到"一步画框"
理解 PBD 的关键在于理解现有方法的问题:
传统 NTP(Next-Token Prediction):
检测一个框需要生成: "1","0","2","4","2","5","6","7","8","9","0","1" → 12 个 token,12 步串行推理 → 每步都依赖前一步,完全无法并行
标准 MTP(Multi-Token Prediction):
随机分块并行: Token块: [1024][256][789][012] → 结构无关!块内 token 可能跨框边界 → 模型学到虚假的跨框组合模式
PBD(Parallel Box Decoding):
框对齐原子块(固定长度6): Block: [
🎯 核心洞察:Bounding box 的四个坐标 (x₁, y₁, x₂, y₂) 天然是一个强耦合的几何整体。把它们当作一个原子单元学习和解码,比拆成独立 token 效率更高,精度也更好。
3.2 模型架构
LocateAnything 的架构基于一个原生分辨率 VLM,由三部分组成:
- Moon-ViT 视觉编码器:
原生分辨率提取视觉 token,保留高精度空间细节 - Qwen2.5 语言解码器:
强大的语言理解与生成能力 - MLP 投影器:
桥接视觉与语言两个模态
给定图像 𝓘 和自然语言查询 ℰ,视觉编码器提取视觉 token Z = Encoder(𝓘),语言解码器直接将视觉 token 转换为一系列框对齐的块级预测。
3.3 块化输出格式
PBD 要求输出被重新组织为固定长度的块序列。坐标归一化到 [0, 1000] 后离散化为 token,然后重组为块序列 B = (b₁, b₂, ..., bₙ),每个块是固定长度 L=6 的原子单元。
论文定义了四种功能块类型:
|
|
|
|
|---|---|---|
| Semantic Block |
|
|
| Box Block |
|
|
| Negative Block |
|
|
| End Block |
|
|
如果一个语义标签超过单个块的容量,会跨多个连续块分割。任何未占位的位置用 <null> token 填充,保证所有块的张量形状统一。
四、训练策略:双流联合训练
直接在训练阶段并行化输出会破坏模型的因果推理能力。为解决这个问题,LocateAnything 采用了双公式联合训练策略:
x_all = x_vis ⊕ x_q ⊕ x_ntp ⊕ x_blk 其中: x_vis + x_q → 共享上下文(视觉 + 文本查询) x_ntp → 标准自回归序列(保留因果推理能力) x_blk → 块级 MTP 序列(学习框对齐预测)
本质上,x_ntp 和 x_blk 代表完全相同的 ground truth,但格式不同——一个是 token 级表示,一个是块级表示。
4.1 注意力掩码设计
这是整个训练策略的精髓。注意力掩码控制三个信息流:
- NTP 流使用因果注意力:
共享上下文和 NTP 序列只能看到前面的 token,不能看到 x_blk 中的内容,防止数据泄漏。这与推理时的 KV Cache 完全一致。 - MTP 块间使用因果注意力:
当前块可以看到共享上下文和所有已提交的块,但不能看到未来的块。这让模型学到不同框预测之间的依赖关系。 - 块内使用双向注意力:
同一块内的所有 token 可以互相看到。这让模型能捕捉框内坐标之间的几何依赖关系,一次性解码所有坐标。
训练目标是两个交叉熵损失之和:ℒ = ℒntp + ℒmtp。
五、推理模式:三种按需选择
PBD 虽然显著加速了推理,但并行解码在复杂场景中存在固有的"探索-利用"困境。LocateAnything 设计了三种按需推理模式:
5.1 Fast Mode(MTP 快速模式)
-
所有框一步并行解码,最大化吞吐 -
适用于延迟敏感的场景:机器人视觉、嵌入式设备、实时 Agent -
吞吐量:16.9 BPS(Boxes Per Second)
5.2 Slow Mode(NTP 慢速模式)
-
逐 token 自回归解码坐标,最大化稳定性 -
适用于高精度场景:标注平台、离线评估、数据集构建 -
精度上限:52.1 F1(COCO)
5.3 Hybrid Mode(混合模式,默认)
-
默认用 Fast Mode,当检测到问题时自动切换到 Slow Mode -
平衡速度与鲁棒性,保留大部分加速增益 -
吞吐量:12.7-13.2 BPS,F1 51.6
5.4 纠正式 NTP 重解码
Hybrid Mode 的核心是Corrected NTP Re-decoding机制。当并行解码遇到两种异常情况时,会触发 NTP 回退:
格式不规则性(Format Irregularity):复杂场景中多个类别时,模型在类别边界犹豫,可能在同一个块内混合结构 token 和坐标 token(如 <box><211></ref><911><887></box>)。
空间模糊性(Spatial Ambiguity):密集排列的物体(如网格状排列),MTP 可能输出两个物体之间的中间坐标,导致低 IoU 预测。
触发条件(同时满足):(1) top-1 坐标 token 概率低于 0.7;(2) top-5 坐标 token 的最大-最小差值超过 80(在 [0, 1000] 归一化空间中)。
一旦检测到异常,丢弃有问题的块,回退到上一个已验证的前缀,用 NTP 自回归生成该块的 token,完成后无缝切换回 MTP。
六、LocateAnything-Data:138M 查询,785M 框
要训练一个强大的通用视觉定位模型,数据量和多样性至关重要。LocateAnything 团队构建了迄今最大规模的视觉定位数据集。
|
|
|
|
|
|---|---|---|---|
| 通用目标检测 |
|
|
|
| GUI 元素定位 |
|
|
|
| 指代表达理解 |
|
|
|
| 文字定位(OCR) |
|
|
|
| 文档/场景布局 |
|
|
|
| 点定位 |
|
|
|
数据集涵盖 12M 独特图像、138M 自然语言查询、785M 标注边界框。其中检测数据提供 83.1% 的框级监督,GUI 定位数据支持具身智能场景,指代表达理解连接复杂语义与空间区域。
七、实验结果:速度-精度双杀
7.1 核心数据一览
|
|
|
|
|
|---|---|---|---|
| 解码速度 |
|
12.7 |
|
| LVIS |
|
50.7 |
|
| COCO |
|
54.7 |
|
| Dense200 |
|
58.7 |
|
| VisDrone |
|
39.9 |
|
| DocLayNet |
|
76.8 |
|
| M6Doc |
|
70.1 |
|
| TotalText (OCR) |
|
43.3 |
|
| ScreenSpot-Pro |
|
60.3 |
|
| HumanRef |
|
68.8 |
|
| RefCOCOg val |
|
76.7 |
|
| Pointing (7项) |
|
Best on all 7 |
|
7.2 高质量多目标检测
在 LVIS(长尾分布)上,LocateAnything-3B 的 mean F1 达到 50.7,超越 Rex-Omni-3B 的 46.9(+3.8)。更值得注意的是 IoU=0.95(高精度阈值)下的表现:31.1 vs 20.7,差距高达 10.4 分。这说明 PBD 不仅能"找到"目标,还能"画得准"。
在密集检测场景 Dense200 和 VisDrone 上,LocateAnything-3B 分别达到 58.7 和 39.9 mean F1,大幅超越所有 VLM 方法。特别是在 VisDrone 上比 Rex-Omni 高出 4.1 分,展现出在高度重叠环境中的优越边界划定能力。
7.3 GUI 定位(ScreenSpot-Pro)
ScreenSpot-Pro 是评估 GUI Agent 定位能力的标杆基准。LocateAnything-3B 达到 60.3 平均 F1,超越了 30B 参数的 Qwen3-VL-30B-A3B(53.7)和 32B 的 GUI-Owl-32B(58.0)。这意味着一个 3B 模型在 GUI 交互场景中,定位精度超过了参数量 10 倍于它的对手。
7.4 文档理解与 OCR
在文档布局分析任务上,LocateAnything 建立了新的标杆:DocLayNet 上 76.8 F1(+6.1 vs Rex-Omni),M6Doc 上 70.1 F1(+14.5 vs Rex-Omni)。在 TotalText OCR 任务上达到 43.3 F1,超越所有对比方法。
7.5 解码速度对比
这是最直观的优势。在单张 H100 GPU 上(batch size=1):
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
| LocateAnything-3B (Hybrid) | 12.7 | 11.5× |
| LocateAnything-3B (Fast) | 16.9 | 15.4× |
当目标数量从 20 增加到 300 时,NTP 方法延迟严重飙升,而 PBD 实现了 2× 到 6× 的加速,吞吐量从 12 BPS 扩展到约 25 BPS。这意味着在密集检测场景中,PBD 的速度优势会进一步放大。
7.6 消融实验亮点
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
消融实验明确验证了:结构对齐的 MTP 公式(PBD)在速度和精度上同时优于结构无关的 MTP 方法。标准 MTP 增大块尺寸只会略微提升吞吐,但会持续降低精度。PBD 打破了这个困局。
八、实战代码
8.1 快速安装
git clone https://github.com/NVlabs/Eagle.git eagle cd eagle/Embodied pip install -e .
8.2 基础使用
import torchfrom PIL import Imagefrom locateanything_worker import LocateAnythingWorker# 加载模型worker = LocateAnythingWorker("nvidia/LocateAnything-3B")img = Image.open("example.jpg").convert("RGB")# 目标检测 —— 一次检测多个类别result = worker.detect(img, ["person", "car", "bicycle"])print(result["answer"])# 输出:person<123><45><678><901>car<234><56><789><012> ...# 短语定位 —— 自然语言描述定位result = worker.ground_multi(img, "people wearing red shirts")print(result["answer"])# 文字检测(OCR)result = worker.detect_text(img)print(result["answer"])# GUI 元素定位(返回点坐标)result = worker.ground_gui(img, "the search button", output_type="point")print(result["answer"])# 指向(Pointing)result = worker.point(img, "the traffic light")print(result["answer"])
8.3 解析输出结果
import redef parse_boxes(answer: str, image_width: int, image_height: int):"""解析 LocateAnything 的输出坐标范围 [0, 1000],需要归一化"""boxes = []# 匹配:labelfor m in re.finditer(r'(.*?)<(\d+)><(\d+)><(\d+)><(\d+)>',answer):label = m.group(1)x1, y1, x2, y2 = [int(g) for g in m.groups()[1:]]boxes.append({"label": label,"x1": x1 / 1000 * image_width,"y1": y1 / 1000 * image_height,"x2": x2 / 1000 * image_width,"y2": y2 / 1000 * image_height,})return boxes# 使用示例img = Image.open("test.jpg")boxes = parse_boxes(result["answer"], img.width, img.height)for b in boxes:print(f"{b['label']}: ({b['x1']:.0f}, {b['y1']:.0f}) → ({b['x2']:.0f}, {b['y2']:.0f})")
8.4 用 OpenAI SDK 格式调用
from openai import OpenAIfrom PIL import Imageimport base64, io# 如果部署为 API 服务client = OpenAI(base_url="http://localhost:8000/v1",api_key="not-needed")# 编码图片img = Image.open("screenshot.png")buf = io.BytesIO()img.save(buf, format="PNG")img_b64 = base64.b64encode(buf.getvalue()).decode()response = client.chat.completions.create(model="LocateAnything-3B",messages=[{"role": "user","content": [{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{img_b64}"}},{"type": "text", "text": "Locate all buttons and text fields in this GUI screenshot"}]}],max_tokens=1024)print(response.choices[0].message.content)
8.5 训练自己的版本
# 单机 8 卡全量微调torchrun --nproc_per_node=8 \eaglevl/train/locany_finetune_magi_stream.py \--model_name_or_path nvidia/LocateAnything-3B \--meta_path "./locany_recipe/your_recipe.json" \--output_dir work_dirs/my_sft \--max_steps 25000 \--learning_rate 2e-5 \--bf16 True \--block_size 6 \--attn_implementation magi \--max_seq_length 16384 \--deepspeed "deepspeed_configs/zero_stage2_config.json"
💡 注意:MagiAttention 仅支持 Hopper(H100)和 Blackwell 架构的 GPU。在 A100、L40 等旧卡上,使用 --attn_implementation sdpa,但仅支持约 4K token 的序列长度。
九、应用场景全景
LocateAnything 的"一个模型做所有定位任务"设计,使其在多个领域具有落地价值:
- 🤖 具身智能/机器人:
Fast Mode 16.9 BPS 的速度足够实时处理机器人视觉,快速定位抓取目标、导航路标 - 🖥️ GUI Agent:
60.3 ScreenSpot-Pro SOTA,定位界面上的按钮、输入框、图标,驱动自动操作 - 📄 文档理解:
DocLayNet 76.8、M6Doc 70.1,自动解析文档布局,提取表格、标题、段落 - 🔍 场景文字 OCR:
TotalText 43.3 F1,精准定位自然场景中的文字 - 🚗 无人机/监控:
VisDrone 39.9 F1,密集小目标检测能力 - 🏷️ 数据集标注:
Slow Mode 高精度输出,可直接用于半自动标注流水线
十、与同类方法的对比思考
LocateAnything 的独特之处在于它同时解决了速度和精度两个问题:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
值得注意的是,LocateAnything 是首个将 MTP 应用于 VLM 检测/定位的工作。论文明确指出,标准 MTP 是"结构无关的"——把 token 流当作通用序列处理,主要捕获共现相关性。对于 bounding box 这种强耦合结构,这种监督与训练目标不匹配。PBD 通过框对齐彻底解决了这个问题。
十一、结论与展望
LocateAnything 证明了一个重要命题:并行解码与结构化几何约束并不矛盾。通过把 bounding box 视为不可分割的原子单元,PBD 同时提升了速度和精度——这打破了传统"速度-精度"的 trade-off 认知。
从更广的视角看,LocateAnything 的成功暗示了一个重要趋势:在大模型时代,解码策略的设计可能比单纯增加参数更重要。3B 模型通过精心设计的解码方式,击败了 30B 甚至更大的通用模型。
对于关注机器人、GUI Agent、自动化标注等领域的从业者,LocateAnything 提供了一个即插即用的工业级视觉定位解决方案。3B 参数、开源代码、HuggingFace 在线 Demo——三者结合,让任何人都能在几分钟内跑起来。
📎 资源汇总
📄 论文:arXiv:2605.27365
🌐 项目主页:research.nvidia.com/labs/lpr/locate-anything/
💻 GitHub:github.com/NVlabs/Eagle/tree/main/Embodied
🤗 HuggingFace 模型:nvidia/LocateAnything-3B
⚡ HuggingFace Demo:nvidia/LocateAnything (Spaces)
机器学习算法AI大数据技术
搜索公众号添加: datanlp
长按图片,识别二维码
阅读过本文的人还看了以下文章:
【模型高效部署】tensorrtx 深度解读,yolov11高性能推理实战案例
整理开源的中文大语言模型,以规模较小、可私有化部署、训练成本较低的模型为主
基于40万表格数据集TableBank,用MaskRCNN做表格检测
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx

