CommunityImagegithub.com

clip-box

localisez un objet dans une image. Interrogez h2oai/h2o-lightning-4b pour obtenir une boîte englobante autour d'une phrase de référence ("le montant total", "le carré rouge", "la tasse à café") et récupérez les fractions de l'image, les coordonnées en pixels, une confiance calibrée (P(IoU >= 0.5)) et une probabilité de présence qui verrouille la réponse.

Qu'est-ce que clip-box ?

clip-box est une habileté d'agent d'IA qui sert de point d'entrée pour la question "où se trouve X" dans une image. Elle utilise le modèle de décision h2o-lightning-4B pour répondre à des questions typées avec des probabilités, sans jamais générer de texte libre. Lorsqu'on lui fournit une image et une phrase de référence (comme "le carré rouge" ou "le montant total"), elle renvoie une boîte englobante sous forme de fractions de l'image, des coordonnées en pixels, une confiance calibrée P(IoU >= 0.5) et une probabilité `present` qui indique si la cible est réellement visible. La description détaillée explique que la confiance est calculée sur l'image avec la boîte dessinée, tandis que la probabilité de présence est calculée sur l'image originale non modifiée, et qu'il faut toujours vérifier `present` plutôt que `found` pour éviter les faux positifs. L'habileté fonctionne via un serveur d'inférence local (h2o-serve) et supporte les formats d'image standards. Elle est particulièrement efficace pour les objets saillants, les icônes, les formes géométriques et les images simples, mais moins pour les textes denses comme sur un reçu. Le code et les commandes sont fournis en exemple, incluant les options `--json`, `--crop`, `--min-present` et `--min-confidence` pour ajuster les seuils de décision.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/rodritimecoder/agent-skills/tree/HEAD/multimodal/clip-box

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

clip-box — où se trouve-t-il dans cette image ?

C'est la porte d'entrée "où est X". L'implémentation réside dans decision-model : le même client répond à bool, choice, score et box, et clip-box est un point d'entrée léger qui maintient ce vocabulaire routable et peut pointer vers une couche d'adaptation autonome lorsqu'un autre modèle occupe l'emplacement de décision.

clip-box --image scene.png --target "le carré rouge"          # couche d'adaptation sur :8083
clip-box --image scene.png --target "le carré rouge" --port 8761   # couche d'adaptation autonome
decision-model box --image scene.png --target "le carré rouge"     # même chose

h2o-lightning est un modèle de décision de 4B : il répond à des questions typées avec des probabilités et ne génère jamais de prose. Sa question box renvoie un rectangle au lieu d'une étiquette, et trois nombres qui comptent plus que le rectangle :

champsignification
boxleft, top, right, bottom en fractions de l'image, à partir du coin supérieur gauche
confidenceP(IoU ≥ 0.5) — une lecture de décision sur l'image avec la boîte dessinée dessus, pas un nombre que le modèle raconte
presentP(la cible est visible quoi qu'il arrive) — une lecture séparée sur l'image non modifiée
foundsi une boîte a été produite ; un échec renvoie l'image entière avec une confiance de 0

Verrouillez sur present, pas sur found. Si on demande un vélo bleu dans une scène qui n'en a pas, le modèle renvoie une boîte d'apparence confiante autour d'autre chose avec found: true et present: 0.111. present est ce qui dit non.

Utilisation

# démarrer l'API (les questions box sont activées ; le port avant du slot est :8083)
h2o-serve --port 8083          # CPU, Q8_0
h2o-serve --backend vulkan     # GPU AMD : construit le backend Vulkan épinglé une fois
h2o-serve --status
h2o-serve --stop

# demander
clip-box --image scene.png --target "le carré rouge"
# ACCEPT  box=(0.247, 0.247) -> (0.753, 0.753)  confidence=0.651  present=0.885

clip-box --image scene.png --target "le vélo bleu"   # absent -> quitte avec 2
clip-box --image receipt.png --target "le montant total" # confidence 0.163 < 0.30 -> rejeté
clip-box --image scene.png --target "le carré rouge" --json --crop /tmp/square.png

--json renvoie accepted, reason, box, pixels (calculés à partir de la taille réelle de l'image), confidence, present, found et le model qui a répondu. Le code de sortie 0 accepte, 2 rejette, 1 est une erreur de requête.

--min-present (par défaut 0.5) et --min-confidence (par défaut 0.30) configurent les seuils ; les deux sont également des variables d'environnement (BOX_MIN_PRESENT, BOX_MIN_CONFIDENCE). --crop écrit la boîte acceptée ; il nécessite Pillow.

Capacité, pas hypothèse

box est une fonctionnalité d'adaptation, pas une fonctionnalité de protocole : le propre /v1/systemone de llama.cpp n'accepte que choice, score et noul. Le slot de décision alterne entre cinq candidats, donc :

decision-model caps
# model       /models/h2o-lightning-4b-Q4_K_M.gguf
# slot        :8083  (box sur :8083)
# primitives  bool, choice, score, box

Si l'occupant n'est pas h2o, caps n'affiche pas box et box refuse avec le nom du modèle servi — au lieu d'envoyer une question à laquelle ce point de terminaison ne peut pas répondre.

Pour quoi il est réellement bon

Mesuré sur ce poste de travail (Q8_0, backend CPU), scènes synthétiques avec vérité connue :

cibleIoUconfidencepresent
carré rouge, 512×512 centré0.9760.6510.885
rectangle rouge, 512×1024 haut0.8770.6690.897
rectangle rouge, 1024×512 large0.8480.7220.895
petit carré rouge dans une scène encombrée0.6030.3590.896
"le vélo bleu" (absent)—0.1880.111
"le montant total" sur un reçuraté (boîte en dessous du total)0.1440.899

Objets saillants, icônes, formes, images simples : bon, le rapport hauteur/largeur est traité correctement. Texte petit dense sur un reçu : il rate, et sa faible confiance le dit. Pour une valeur sur un reçu, recadrez avec le voisinage du total ou utilisez la question choice de l'API de décision ("quel est le TOTAL ? sous-total/total/taxe"), qui s'est correctement notée sur la même image.

Le piège que cette habileté existe pour absorber

Pillow. La couche d'adaptation dessine la boîte avant la lecture de l'étroitesse et renvoie None sur ImportError, donc un Python sans Pillow répond à chaque boîte avec confidence: 0.0. h2o-serve construit son propre environnement virtuel et vérifie l'import.

Fichiers

cheminrôle
scripts/clip_box.pypoint d'entrée — transfère --port/--host, délègue à decision-model box
../hardware/decision-model/scripts/decision_model.pyle client : une question box, deux seuils, recadrage, codes de sortie
../hardware/decision-model/scripts/h2o_serve.pyle lanceur : amorçage épinglé par hachage, environnement virtuel sécurisé pour Pillow, backend CPU/CUDA/Vulkan, --status, --stop

L'état réside dans ~/.cache/h2o_lightning_gguf (poids + backend épinglé) et ~/.local/share/h2o-lightning/venv. Rien en dehors de ces deux chemins n'est touché.

Notes de protocole

  • Le box.mode de la couche d'adaptation est ici generate : une génération contrainte dans la convention bbox_2d de Qwen (0–1000, x en premier), analysée et limitée. edges/hybrid nécessitent un modèle entraîné sur les lectures de bords ; gardez generate avec cette version.
  • confidence est une probabilité avec sa propre température, 1.0 jusqu'à ce qu'elle soit ajustée, donc elle est conservatrice : une boîte quasi parfaite sur un grand carré donne 0.65, pas 0.95.
  • Une image par requête par défaut ; la couche d'adaptation accepte jusqu'à 8 avec images: et le backend est démarré avec --image-max-tokens 1024.
  • Le côté décision du même serveur répond à choice / noul / score sur le texte et les images via /v1/systemone ; pour des décisions calibrées sur le texte, préférez pplx-decider (Indice de décision 60.06 contre 51.38 ici). Utilisez ce modèle pour la géométrie, pas pour le routage.

Skills associés