API vision-langage

LibreVLM charge un modèle vision-langage génératif et l'utilise comme détecteur d'objets. La liste de classes sert de prompt plutôt que de tête fixe, et le modèle renvoie les mêmes Results que toute autre famille.

Installer

Ce niveau nécessite l'extra vlm.

bash
pip install 'libreyolo[vlm]'

La fabrique

python
LibreVLM(model: str = "qwen3-vl-4b", **kwargs) -> LibreVLMModel

model est un alias, et non un chemin. **kwargs atteint le constructeur de la famille, qui accepte device, names (le vocabulaire initial, équivalent à un appel à set_classes après le chargement), prompt (pour remplacer le prompt de détection) et max_new_tokens. Un alias inconnu lève ValueError en énumérant tous les alias.

Détecter dans un vocabulaire ouvert
from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")model.set_classes(["person", "skateboard"]) result = model.predict(SAMPLE_IMAGE)for box, cls in zip(result.boxes.xyxy, result.boxes.cls):    print(result.names[int(cls)], box.tolist())
Poser une question libre
from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")print(model.chat(SAMPLE_IMAGE, "How many people are in this image?"))

Alias

FamilleAliasTaillesPoids
Qwen3-VLqwen3-vl, qwen3-vl-2b, qwen3-vl-4b, qwen3-vl-8b2b, 4b, 8bQwen/Qwen3-VL-2B-Instruct, -4B-, -8B-
LFM2-VLlfm2-vl, lfm2-vl-450m, lfm2-vl-1.6b450m, 1.6bLiquidAI/LFM2.5-VL-450M, -1.6B
InternVL3internvl3, internvl3-1b, internvl3-2b, internvl3-8b1b, 2b, 8bOpenGVLab/InternVL3-1B-hf, -2B-hf, -8B-hf
SmolVLM2smolvlm2, smolvlm2-2.2b, smolvlm2-500m2.2b, 500mHuggingFaceTB/SmolVLM2-2.2B-Instruct, SmolVLM2-500M-Video-Instruct
Florence-2florence-2, florence2, florence-2-base, florence-2-largebase, largeflorence-community/Florence-2-base, -large
Kosmos-2kosmos-2, kosmos2224microsoft/kosmos-2-patch14-224
LocateAnythinglocate-anything, locateanything, locate-anything-3b, locateanything-3b3bnvidia/LocateAnything-3B
SenseNova-Visionsensenova-vision, sensenova-vision-7b, sensenovavision7bLibreYOLO/SenseNovaVision7b
WeVisOne-VLwevisone-vl, wevisone, wevisonevl, wevisone-vl-2b, wevisone-vl-4b2b, 4btencent/WeVisOne-VL-2B, -4B
LibreMODUSlibremodus, libremodus-14b-a7b, modus, modus-14b-a7b14b-a7bSnapshot upstream épinglé

L'alias par défaut est qwen3-vl-4b. Les tailles des alias par défaut de chaque famille sont celles qui apparaissent en premier : qwen3-vl se résout en 4b, lfm2-vl en 450m, internvl3 en 2b, smolvlm2 en 2.2b, florence-2 en base et wevisone-vl en 2b.

LibreVLM, LibreLFM2VL, LibreQwen3VL, LibreSmolVLM2, LibreInternVL3, LibreFlorence2, LibreKosmos2, LibreLocateAnything, LibreWeVisOneVL et LibreMODUS (également orthographié LibreModus) sont exportés au niveau du package.

La détection comprend aussi north-micro-vision, gemma-4-e2b, gemma-4-e4b, moondream-2, moondream-3 et lfm2-vl-3b. L'alias nu gemma-4 sélectionne E4B. Les alias Molmo2 sont molmo2-4b, molmo2-8b et molmo2-o-7b ; la valeur par défaut est 4B. Les alias définissent le routage, sans garantir que chaque snapshot distant a été téléchargé et testé. moondream-3 ne se charge pas en 1.6.0 : il manque des shards de poids sur son miroir.

Tâches

Les tâches prises en charge dépendent de la famille. Ces adaptateurs prennent en charge plusieurs tâches :

FamilleTâches prises en charge
LocateAnythingdetect, point
SenseNova-Visiondetect, segment, panoptic, pose, point, depth, ocr
WeVisOne-VLdetect, point, segment, matte, ocr

Comme la tâche est déterminée par le prompt et non intégrée à un checkpoint, elle peut être modifiée sur un modèle déjà chargé :

python
model.set_task(task: str) -> LibreVLMModel

La tâche est validée par rapport à la liste prise en charge par la famille, reste appliquée aux appels predict() et track() ultérieurs, et le modèle est renvoyé afin de pouvoir chaîner les appels.

Molmo2 renvoie des points et exige {label} dans les templates de pointage personnalisés. referring=True de WeVisOne-VL fait envoyer à detect une génération par expression, et ses tâches segment, matte et la détection référentielle lèvent ValueError sans vocabulaire. Moondream prend en charge la détection, les points et le chat natif. Utilisez LibreGround pour les requêtes transformant une instruction en clic.

set_classes

python
model.set_classes(classes: list[str]) -> LibreVLMModel

Définit le vocabulaire ouvert. Tous les mots fonctionnent, car ils sont transmis au modèle sous forme de prompt au lieu d'être limités à une tête fixe. La liste ne doit pas être vide et ses entrées doivent être uniques sans tenir compte de la casse. Une chaîne seule lève TypeError, car elle serait décomposée en classes d'un caractère. Le vocabulaire est persistant : définissez-le une fois après le chargement, il reste actif jusqu'à sa prochaine définition.

chat

python
model.chat(image, prompt, max_new_tokens=None, color_format="auto") -> str

Génération multimodale brute : une image et un prompt en entrée, le texte décodé verbatim en sortie. C'est la porte de sortie sous l'outil pratique de détection, destinée aux questions libres, au comptage ou à un format de sortie non couvert par le wrapper de détection. max_new_tokens utilise par défaut la valeur MAX_NEW_TOKENS de la famille, soit 1024 sur la classe de base. Le décodage est glouton avec une légère pénalité de répétition.

Confiance

La sortie générée ne possède aucune confiance calibrée par bounding box. Cette version attribue une valeur factice constante afin que predict, le dessin et track fonctionnent. Le filtrage conf= et la mAP deviennent donc approximatifs plutôt que significatifs. C'est également la raison pour laquelle val() lève une erreur : une mAP COCO calculée sur des scores factices serait trompeuse.

Prédire et suivre

L'interface de prédiction standard s'applique et track() fonctionne. Un détecteur VLM s'intègre donc au même pipeline que toute autre famille. Deux politiques de classe diffèrent d'un détecteur convolutionnel : l'augmentation à l'inférence est désactivée, car une augmentation multi-échelle n'a aucun sens pour un générateur à résolution fixe, et la prédiction par batch est désactivée, car la génération est autorégressive et le prétraitement renvoie un encodage texte-image plutôt qu'un tenseur d'images empilable.

Fonctionnalités non prises en charge

L'export et la validation par mAP de détection ne sont pas pris en charge. L'entraînement est limité au parcours Qwen3-VL ci-dessous.

Code distant

Chaque famille fournie se charge par l'intermédiaire d'une classe de modèle native. LibreYOLO n'exécute donc pas de code de dépôt tiers par défaut. Une famille qui en a réellement besoin doit l'activer explicitement et épingler la révision d'un snapshot. LocateAnything est la seule à le faire, avec le commit c32291ca5e996f5a7a485845b4f57a233936bba0.

LibreMODUS constitue une exception explicite au schéma de checkpoint : son alias se résout en un répertoire de fichiers upstream épinglés plutôt qu'en un fichier .pt LibreYOLO. LibreYOLO ne lui ajoute pas de métadonnées v1.0 et ne le republie pas.

Entraîner

Qwen3-VL prend en charge LoRA pour la détection via train(data=...) après installation de libreyolo[vlm-train]. Il gèle la tour de vision, choisit les meilleurs checkpoints selon la loss de validation et enregistre des répertoires de checkpoints. Consultez le fine-tuning VLM.

Alias lus dans libreyolo/models/vlm/__init__.py ; dépôts, tailles et listes de tâches lus dans les modules de familles sous libreyolo/models/vlm/ ainsi que dans libreyolo/models/sensenova/model.py ; règles d'appel et erreurs lues dans libreyolo/models/vlm/base.py, le tout en v1.6.0.