Als Markdown anzeigen

Open-Vocabulary-Erkennung

Die Open-Vocabulary-Erkennung ersetzt die feste Klassenliste eines Checkpoints durch Wörter, die du beim Aufruf auswählst. In LibreYOLO ist sie keine eigene Aufgabe. Sie verwendet die detect-Aufgabe einer eigenen Modellstufe, die über LibreOpenVocab statt LibreYOLO geladen wird.

Definition

Die Open-Vocabulary-Erkennung gibt normale Results einer Erkennung zurück: Boxen, Confidence-Werte und Klassenindizes. result.names ordnet diese Indizes den angeforderten Strings zu. Der Unterschied liegt in der Herkunft der Klassenliste. Ein herkömmlicher Detektor wird mit einem festen Kategoriensatz trainiert und kann nie eine Kategorie außerhalb davon ausgeben. Diese Modelle nehmen das Vokabular bei der Inferenz als Text entgegen. Mit set_classes(["forklift", "safety cone"]) werden diese Begriffe daher zu den Klassen.

LibreYOLO besitzt keinen Aufgabenschlüssel open-vocabulary. Diese Modelle deklarieren wie jeder andere Detektor SUPPORTED_TASKS = ("detect",). Sie unterscheiden sich durch den Ladepfad. Da es sich um Snapshots von Hugging Face und nicht um State-Dict-Checkpoints von LibreYOLO handelt, werden sie nicht von der Factory LibreYOLO() geladen, sondern über LibreOpenVocab() erstellt. Diese Factory steht neben LibreSAM() und LibreVLM() und ersetzt LibreYOLO() nicht.

Die Scores sind echte Erkennungs-Scores und keine nachträglich geparsten generierten Bildbeschreibungen. Jede Familie bewertet Bildregionen anhand des Text-Embeddings jedes Prompts.

Modelle

Vier Familien bilden diese Stufe und unterstützen ausschließlich Vorhersagen. Lade jede davon über ihren Alias mit LibreOpenVocab.

Grounding DINO von IDEA Research gibt es in den Größen t und b. Es ist der Standard dieser Stufe und die einzige Familie, die text_threshold akzeptiert. Dieser zweite Grenzwert gilt für den Token-Score der decodierten Phrase.

OWLv2 von Google Research gibt es in den Größen b16 und l14. Die Familie bewertet Bildregionen anhand von Text-Embeddings aus einem CLIP-artigen Encoder.

OMDet-Turbo vom Om AI Lab gibt es in einer Größe t. Die Familie trennt Klassen-Embeddings von einem sprachlichen Aufgaben-Prompt. Als einzige Familie dieser Stufe unterdrückt sie überlappende Boxen in der eigenen Nachverarbeitung, weshalb iou= berücksichtigt wird.

OV-DEIM gibt es in den Größen s, m und l. Dieser DETR-artige Detektor gleicht Decoder-Queries mit Text-Embeddings eines gebündelten MobileCLIP-Text-Towers ab. Er verwendet eine eindeutige Zuordnung mit Top-K-Auswahl, sodass keine NMS ausgeführt wird.

Die Gewichte von OV-DEIM bilden den eingeschränkten Fall dieser Stufe. Die Detektorgewichte stehen unter CC BY-NC 4.0 und sind nicht kommerziell nutzbar. Der gebündelte Text-Tower steht unter Apples Machine Learning Research Model License und ist nur für Forschungszwecke bestimmt. Der Checkpoint l ergänzt ein nachtrainiertes DINOv3-S-Backbone unter Metas DINOv3 License. Alle drei Lizenztexte werden im Gewichts-Repository ausgeliefert. Die Bibliothek protokolliert dieselbe Zusammenfassung beim Auflösen der Gewichte, bevor das Modell erstellt wird. Lies vor dem Deployment die Seite zu OV-DEIM.

Die Stufe benötigt ein Extra:

bash
pip install "libreyolo[openvocab]"

Es umfasst transformers und timm für die drei eingebundenen Familien sowie huggingface_hub, safetensors, regex und ftfy, die OV-DEIM als native Portierung benötigt.

Eine zweite Stufe nimmt ebenfalls ein Textvokabular entgegen: LibreVLM() lädt generative Vision-Language-Modelle wie Qwen3-VL und Florence-2 und wandelt ihre Ausgabe in dieselben Results um. Sie stellt ebenfalls set_classes() bereit. Der Unterschied liegt in der Erzeugung der Boxen. Die Familien dieser Seite sind diskriminative Detektoren, die Scores direkt ausgeben. Die VLM-Stufe generiert die Boxen dagegen.

Vorhersage

Python
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-t")model.set_classes(["person", "dog", "skateboard"]) result = model.predict(SAMPLE_IMAGE, conf=0.25)print(result.names)for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
Vokabular wechseln
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("owlv2-b16") # set_classes bleibt bis zum nächsten Aufruf aktiv. Nach Umwandlung in# Kleinbuchstaben und Entfernung von Artikeln müssen Labels eindeutig sein.model.set_classes(["a red backpack", "traffic cone"])result = model.predict(SAMPLE_IMAGE) model.set_classes(["bicycle wheel"])result = model.predict(SAMPLE_IMAGE)
Grounding-DINO-Textschwellenwert
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-b")model.set_classes(["remote control", "school bus"]) # conf filtert nach Boxen-Score, text_threshold nach Token-Score der# decodierten Phrase. Ohne Angabe sind beide 0.25. Nur Grounding DINO# akzeptiert text_threshold, die anderen lösen einen Fehler aus.result = model.predict(SAMPLE_IMAGE, conf=0.25, text_threshold=0.3)

set_classes() nimmt eine nicht leere Liste von Labelstrings entgegen und bleibt bis zum nächsten Aufruf aktiv. Nach der Umwandlung in Kleinbuchstaben und dem Entfernen vorangestellter Artikel müssen Labels eindeutig sein. Daher können "a bus" und "bus" nicht gemeinsam in einem Vokabular stehen. Phrasen aus mehreren Wörtern sind Labels wie alle anderen. Jede Familie wandelt die Liste vor der Tokenisierung in ihre eigene Texteingabe um. Deshalb ist "traffic cone" eine andere Query als "cone".

Drei Vorhersageargumente verhalten sich hier anders als bei einem nativen Detektor. imgsz= wird abgelehnt, da der Processor die Größenänderung für diese Familien steuert. augment=True wird ebenfalls abgelehnt, weil Test-Time-Augmentierung nicht zum Funktionsumfang dieser Stufe gehört. iou= gilt nur für die Familie, deren Processor eine eigene Unterdrückung ausführt. Wenn keine Unterdrückung stattfindet, wird das Argument mit einer Warnung ignoriert.

Ohne Angabe verwendet conf den eigenen Standardwert der geladenen Familie und nicht den üblichen Wert 0.25 von predict(). Dieser Standardwert ist nicht in der gesamten Stufe gleich. Setze ihn explizit, wenn du zwei Familien mit demselben Bild vergleichst.

track() löst in der gesamten Stufe einen Fehler aus. Führe stattdessen pro Frame predict() aus. Unter Vorhersage findest du Informationen zu Quellen, Streaming und Ergebnisverarbeitung.

Training

Keine Familie dieser Stufe wird innerhalb von LibreYOLO trainiert. train() löst einen Fehler aus. Führe das Fine-Tuning im Upstream-Projekt durch und lade die resultierenden Gewichte. Das an set_classes() übergebene Vokabular ist die einzige Einstellung, die beeinflusst, was ein geladenes Modell erkennt.

Validierung

Für diese Stufe gibt es keinen Validator und val() löst einen Fehler aus. Die Open-Vocabulary-Validierung benötigt eine eigene Implementierung, weil der normale Erkennungsvalidator Bildtensoren direkt an das Modell übergibt, während diese Familien parallel dazu erstellte textkonditionierte Eingaben benötigen.

Export

Der Export liegt außerhalb des Funktionsumfangs dieser Stufe und export() löst einen Fehler aus. Diese Modelle werden mit predict() in PyTorch ausgeführt.

Mit LibreYOLO v1.5.0 verifiziert.