clip-box — 这个东西在图像的哪里?
这是 “X 在哪里” 功能的前门。其实现位于 decision-model 中:同一个客户端可以回答 bool、choice、score 和 box 四种问题,而 clip-box 是一个轻量化的入口点,使这些词汇保持可路由,并且在其他模型占据决策槽位时可以指向一个独立的垫片(shim)。
clip-box --image scene.png --target "the red square" # 槽位垫片,端口 :8083
clip-box --image scene.png --target "the red square" --port 8761 # 独立垫片
decision-model box --image scene.png --target "the red square" # 同一功能
h2o-lightning 是一个 4B 参数的决策模型:它回答带概率值的类型化问题,从不生成文本。它的 box 问题返回一个矩形而非标签,以及三个比矩形更重要的数值:
| 字段 | 含义 |
|---|---|
box | left、top、right、bottom,以图像尺寸的分数表示,坐标原点在左上角 |
confidence | P(IoU ≥ 0.5)——在绘制了边界框的图像上进行的决策读出值,不是模型叙述的数字 |
present | P(目标在图像中可见)——在未修改的图像上进行的独立读出值 |
found | 是否生成了任何边界框;若未找到则返回整张图像且置信度为 0 |
依据 present 而非 found 做门控。 当询问一个场景中不存在的蓝色自行车时,模型会返回一个看起来自信的边界框,框住其他物体,且 found: true,但 present: 0.111。present 才是说“不”的那个值。
用法
# 启动 API(box 问题已开启;槽位前端口为 :8083)
h2o-serve --port 8083 # CPU,Q8_0 量化
h2o-serve --backend vulkan # AMD GPU:一次性构建锁定的 Vulkan 后端
h2o-serve --status
h2o-serve --stop
# 提问
clip-box --image scene.png --target "the red square"
# ACCEPT box=(0.247, 0.247) -> (0.753, 0.753) confidence=0.651 present=0.885
clip-box --image scene.png --target "the blue bicycle" # 不存在 -> 退出码 2
clip-box --image receipt.png --target "the total amount" # confidence 0.163 < 0.30 -> 被拒绝
clip-box --image scene.png --target "the red square" --json --crop /tmp/square.png
--json 返回 accepted、reason、box、pixels(根据实际图像尺寸计算)、confidence、present、found 以及回答的 model。退出码 0 表示接受,2 表示拒绝,1 表示请求错误。
--min-present(默认 0.5)和 --min-confidence(默认 0.30)设置门控阈值;它们也可以通过环境变量设置(BOX_MIN_PRESENT、BOX_MIN_CONFIDENCE)。--crop 写入已接受的边界框区域;需要安装 Pillow。
能力,而非假设
box 是一个垫片功能,而非协议功能:llama.cpp 自身的 /v1/systemone 仅接受 choice、score 和 noul。决策槽位在五个候选模型之间轮换,因此:
decision-model caps
# model /models/h2o-lightning-4b-Q4_K_M.gguf
# slot :8083 (box 在 :8083 端口)
# primitives bool, choice, score, box
如果当前占位模型不是 h2o,那么 caps 不会列出 box,而 box 将以当前服务模型的名字拒绝请求——而不是向端点发送其无法回答的问题。
实际擅长之处
在本工作站(Q8_0,CPU 后端)上对有已知真实值的合成场景进行测量:
| 目标 | IoU | confidence | present |
|---|---|---|---|
| 红色方块,512×512 居中 | 0.976 | 0.651 | 0.885 |
| 红色长方形,512×1024 高 | 0.877 | 0.669 | 0.897 |
| 红色长方形,1024×512 宽 | 0.848 | 0.722 | 0.895 |
| 密集场景中的小红色方块 | 0.603 | 0.359 | 0.896 |
| “蓝色自行车”(不存在) | — | 0.188 | 0.111 |
| 收据上的“总金额” | 未命中(框选在总金额下方) | 0.144 | 0.899 |
显著物体、图标、形状、单张图像:效果良好,能正确处理宽高比。收据上的密集小文本:会失败,且低置信度值表明了这一点。如需获取收据上的数值,请裁剪出总金额附近的区域,或使用决策 API 的 choice 问题(“总金额是多少?小计/合计/税额”),该问题在同一图像上能正确评分。
本技能存在即为了解决的一个陷阱
Pillow。 垫片在读取紧密度值之前绘制边界框,并在发生 ImportError 时返回 None,因此一个没有安装 Pillow 的 Python 环境对每个边界框都会回答 confidence: 0.0。h2o-serve 会构建自己的虚拟环境并检查导入。
文件
| 路径 | 角色 |
|---|---|
scripts/clip_box.py | 入口点——处理 --port/--host 参数,委托给 decision-model box |
../hardware/decision-model/scripts/decision_model.py | 客户端:一个 box 问题、两个门控阈值、裁剪功能、退出码 |
../hardware/decision-model/scripts/h2o_serve.py | 启动器:按哈希锁定引导、Pillow 安全的虚拟环境、CPU/CUDA/Vulkan 后端、--status、--stop |
状态数据存储在 ~/.cache/h2o_lightning_gguf(权重 + 锁定的后端)和 ~/.local/share/h2o-lightning/venv。不会触及这两个路径之外的任何位置。
协议说明
- 垫片的
box.mode在此处为generate:在 Qwen 的bbox_2d约定(0–1000,x 优先)下进行一次受约束的生成,然后解析并钳位。edges/hybrid模式需要一个在边缘读出上训练过的模型;此版本请继续使用generate。 confidence是一个带有独立温度参数的概率值,在尚未拟合时默认为1.0,因此它是保守的:一个大方块上近乎完美的边界框读数为 0.65,而不是 0.95。- 默认情况下每次请求处理一张图像;垫片通过
images:参数最多接受 8 张图像,后端启动时应带有--image-max-tokens 1024。 - 同一服务器的决策侧在
/v1/systemone上回答针对文本和图像的choice/noul/score;对于文本上的校准决策,优先使用pplx-decider(这里决策指数 60.06 对比 51.38)。此模型应用于几何问题,而非路由选择。