Segmentacja sterowana promptem

Segmentacja sterowana promptem zamienia kliknięcie w maskę: wskazuje się obiekt lub rysuje wokół niego ramkę, a model zwraca jego obrys. W LibreYOLO nie jest to osobny klucz zadania, lecz warstwa modeli wczytywana przez fabrykę LibreSAM, której wyniki są zwykłymi obiektami Results segmentacji.

Definicja

Segmentacja sterowana promptem przyjmuje obraz wraz z promptem przestrzennym i zwraca maskę wskazanego obiektu. Nic nie jest klasyfikowane. Nie ma listy klas, a result.boxes zawiera ciasne ramki wyprowadzone z masek, a nie samodzielne detekcje. Pole result.masks zawiera dane masek, natomiast result.masks.xy ich wielokąty.

Interfejsem jest prompt. points zawiera współrzędne pikselowe [x, y], po jednym zestawie na obiekt, a labels oznacza każdy punkt jako dodatni (1, uwzględnij) lub ujemny (0, wyklucz). bboxes ma postać [x1, y1, x2, y2], z jedną maską na ramkę. Punkty i ramki można łączyć. Są wtedy parowane według obiektów i muszą mieć tę samą długość. Pominięcie wszystkich promptów uruchamia ścieżkę segmentowania wszystkiego, czyli siatkę punktów na obrazie.

Pojedynczy punkt jest z założenia niejednoznaczny. Kliknięcie rękawa może oznaczać rękaw, koszulę albo osobę, dlatego multimask=True zwraca dla każdego promptu wszystkie trzy maski całości lub części zamiast jednej najlepszej. conf filtruje według przewidywanego przez model IoU, czyli wyniku jakości maski, a nie pewności detekcji.

LibreYOLO nie ma klucza zadania promptable. Warstwa rejestruje się jako segment, czyli pod tym samym kluczem co segmentacja instancji. Odróżnia ją postać wywołania, dlatego ma własną fabrykę LibreSAM(), równorzędną z LibreYOLO(), LibreOpenVocab() i LibreVLM(). Pojedyncza sygnatura predict(image) nie może wyrazić pętli, do której zbudowano te modele. set_image() uruchamia enkoder obrazu raz i zapisuje embeddingi w pamięci podręcznej, każde późniejsze wywołanie predict() z source=None ponosi tylko koszt dekodowania promptu, a reset_image() czyści pamięć podręczną. Enkoder obrazu jest głównym źródłem kosztu i działa raz na obraz, więc drugi prompt na tym samym obrazie całkowicie go pomija.

Modele

Sześć rodzin wczytuje się przez alias za pomocą LibreSAM.

SAM jest domyślny i występuje w rozmiarach base, large oraz huge, zapisywanych też jako b, l i h.

SAM 2 występuje jako sam2-tiny, sam2-small, sam2-base-plus i sam2-large. LibreYOLO obsługuje jego ścieżkę obrazu.

SAM 3, dostępny jako sam3, jest jedyną rodziną, która przyjmuje prompt pojęcia tekstowego. text="yellow school bus" zwraca każdą pasującą instancję. Przekazanie text= do dowolnej innej rodziny zgłasza błąd z komunikatem wskazującym SAM 3. Wagi pochodzą od Meta i są udostępniane na niestandardowej licencji SAM License zamiast licencji MIT biblioteki LibreYOLO, a repozytorium jest zabezpieczone. Przed pierwszym pobraniem zaakceptuj warunki na stronie modelu i uwierzytelnij się przez hf auth login. Przed wdrożeniem należy przeczytać stronę SAM 3.

EdgeTAM, dostępny jako edgetam, jest wariantem SAM 2 na urządzenia. LibreYOLO obsługuje jego ścieżkę obrazu.

MobileSAM, dostępny jako mobilesam, zastępuje enkoder ViT-H z SAM destylowanym enkoderem TinyViT.

PicoSAM3, dostępny jako picosam3, jest kompaktową siecią CNN do obszarów wskazywanych promptem ramkowym na czujnikach brzegowych. Prompty ramkowe stanowią tutaj cały kontrakt. Punkty, tekst, maska, multimask i segmentowanie wszystkiego zgłaszają błąd z komunikatem wskazującym SAM 2 lub SAM 3.

Dodatek tej warstwy obejmuje cztery rodziny wczytywane przez transformers:

bash
pip install "libreyolo[sam]"

MobileSAM i PicoSAM3 są natywnymi portami LibreYOLO i do działania nie wymagają instalacji transformers.

Predykcja

Prompty punktowe i ramkowe
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base") # Punkt ma postać [x, y] w pikselach; etykiety to 1 dla dodatnich i 0 dla ujemnych.result = model.predict(SAMPLE_IMAGE, points=[640, 420], labels=[1])print(result.masks.xy)      # wielokątyprint(result.boxes.xyxy)    # ciasne ramki wyprowadzone z masek # Prompt ramkowy zwraca jedną maskę na ramkę.result = model.predict(SAMPLE_IMAGE, bboxes=[300, 200, 900, 700])
Jedno kodowanie, wiele promptów
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base") # set_image uruchamia ciężki enkoder obrazu raz i zapisuje wynik w pamięci podręcznej.model.set_image(SAMPLE_IMAGE)first = model.predict(points=[640, 420], labels=[1])second = model.predict(bboxes=[300, 200, 900, 700])model.reset_image()
Segmentowanie wszystkiego
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base") # Brak promptu oznacza siatkę punktów na całym obrazie. Domyślna# siatka 32 na bok to około 1024 przebiegi dekodera, co jest wolne na CPU.result = model.predict(SAMPLE_IMAGE, points_per_side=8)print(len(result.masks))
Maski niejednoznaczności
from libreyolo import LibreSAM, SAMPLE_IMAGE model = LibreSAM("base") # Jeden punkt może oznaczać rękaw, koszulę lub osobę. multimask=True# zwraca wszystkie trzy maski całości lub części zamiast najlepszej.result = model.predict(    SAMPLE_IMAGE, points=[640, 420], labels=[1], multimask=True)print(len(result.masks))

source i set_image() są alternatywami, a nie sekwencją. Przekaż obraz do predict(), aby wykonać jednorazowe wywołanie, albo najpierw wywołaj set_image(), a następnie predict(source=None) dla każdego promptu. Przekazanie device= do predict() przenosi model dla tego i wszystkich kolejnych wywołań oraz unieważnia wszystkie embeddingi w pamięci podręcznej.

Segmentowanie wszystkiego jest kosztownym trybem. points_per_side ma domyślną wartość 32, co odpowiada około 1024 przebiegom dekodera na obrazie. Dla pracy interaktywnej na CPU należy ją zmniejszyć. Jeśli conf nie jest ustawione, w tym trybie stosowany jest próg siatki danej rodziny, natomiast w ścieżce z promptem zachowywane są wszystkie maski. Przekazanie conf=0.0 wyłącza filtrowanie w obu trybach, a max_det ogranicza liczbę zwracanych masek.

Prompty masek nie są obsługiwane w tej wersji, a masks= zgłasza błąd zamiast być ignorowane. track() również zgłasza błąd w całej warstwie. Są to segmentatory obrazów, dlatego należy uruchamiać predict() dla każdej klatki. Informacje o źródłach i obsłudze wyników znajdują się w sekcji predykcja.

Trenowanie

Żadna rodzina w tej warstwie nie jest trenowana wewnątrz LibreYOLO. train() zgłasza błąd. Należy dostroić model w projekcie nadrzędnym i wczytać wynikowe wagi.

Walidacja

Dla tej warstwy nie ma walidatora, a val() zgłasza błąd. Maska sterowana promptem nie ma stałego zestawu klas do porównania, więc zwykłe metryki detekcji i segmentacji nie mają klucza odniesienia. Ocena takiej maski polega na porównaniu jej z samodzielnie dostarczoną maską referencyjną dla istotnych promptów.

Eksport

Eksport nie wchodzi w zakres całej warstwy, a export() zgłasza błąd, z jednym wyjątkiem. PicoSAM3 eksportuje surową sieć CNN obszaru 96x96 do ONNX jako roi_image -> mask_logits. Wycinanie ramki i ponowne skalowanie maski do współrzędnych obrazu pozostają w Pythonie. Każda inna rodzina działa przez predict() w środowisku PyTorch. Formaty dostępne w innych częściach biblioteki opisano w sekcji eksport.

Zweryfikowano z LibreYOLO v1.5.0.