clip-box — 它在圖片的哪裡?
這是 「X 在哪裡」 的入口。實作位於 decision-model:同一個客戶端回答 bool、choice、score 和 box,而 clip-box 是一個輕量的入口點,讓這個詞彙保持可路由,並且可以在其他模型佔用決策槽時指向一個獨立的 shim。
clip-box --image scene.png --target "the red square" # 在 :8083 的槽 shim
clip-box --image scene.png --target "the red square" --port 8761 # 獨立 shim
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 是一個 shim 功能,而非協定功能: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 |
| "the blue bicycle" (不存在) | — | 0.188 | 0.111 |
| 收據上的 "the total amount" | 未命中(方框在總額下方) | 0.144 | 0.899 |
顯著物體、圖示、形狀、單張圖片:表現良好,長寬比處理正確。收據上的密集小文字:會失誤,其低信心度也反映了這一點。對於收據上的金額,請裁剪包含總額附近的區域,或使用決策 API 的 choice 問題("the TOTAL? subtotal/total/tax"),該模型在相同圖片上已正確評分。
這個技能存在的目的是為了吸收這個陷阱
Pillow。 shim 在緊密度讀數之前繪製方框,並在發生 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。這兩個路徑之外的任何東西都不會被觸及。
協定備註
- 此處 shim 的
box.mode為generate:在 Qwen 的bbox_2d慣例(0–1000,x 優先)中進行一次約束生成,並進行解析和限制。edges/hybrid需要一個在邊緣讀數上訓練過的模型;此版本請保持使用generate。 confidence是一個具有自身溫度參數的機率,在擬合完成前為1.0,因此它是保守的:一個大正方形上的近乎完美的方框,其讀數約為 0.65,而非 0.95。- 預設情況下每次請求處理一張圖片;shim 透過
images:參數最多接受 8 張圖片,且後端以--image-max-tokens 1024啟動。 - 同一伺服器的決策端在
/v1/systemone上回答文字和圖片的choice/noul/score問題;對於文字上的校準決策,請優先使用pplx-decider(決策指數 60.06,此處為 51.38)。將此模型用於幾何定位,而非路由決策。