Aktualizacja do 1.7.0
Wersja 1.7.0 zachowuje wczytywanie starszych checkpointów YOLO9 z tymi samymi ramkami zmiennoprzecinkowymi. Zmienia trenowanie rodziny YOLO9, nazwy widoczne dla kodu wewnątrz sieci oraz kilka kontraktów walidacji i predykcji.
Z 1.6.0 do 1.7.0
-
Checkpointy YOLO9, YOLO9-E2E i YOLO9-P2 zapisane w 1.7.0 używają nowych nazw tensorów i nie wczytują się w 1.6.x: 1.6.x wczytuje checkpointy YOLO9 i YOLO9-P2 z ostrzeżeniem o brakujących kluczach i nie przewiduje żadnych ramek, a dla checkpointów YOLO9-E2E zgłasza błąd niezgodności
model_family. Należy zaktualizować każde środowisko, które je odczytuje. Checkpointy zmiennoprzecinkowe, kwantyzowane i treningowe zapisane przez wcześniejsze wydania wczytują się w 1.7.0, a eksporty ONNX pozostają bez zmian. -
Kod sięgający do
model.modelmodelu z rodziny YOLO9 widzi nazwy modułów z MultimediaTechLab/YOLO, bez aliasów.DDetecttoYOLO9Head(anchor_convs/class_convs),RepConvNtoRepConv,RepNBottlenecktoBottleneck,DFLtoAnchor2Vec(anchor2vec),nctonum_classes, a podwarstwy bloków toconv1/conv2/bottleneck. W YOLO9-E2EYOLO9E2EDetecttoYOLO9E2EHead, aone2one_cv2/one2one_cv3toone_to_one_anchor_convs/one_to_one_class_convs.LibreYOLO9Model.fuse(),RepConvN.fuse_convs(),Conv.forward_without_bn(),Concatiyolo9.utils.decode_boxeszostały usunięte. Lista zmian wymienia każdą zmianę nazwy. -
Nazwy węzłów ONNX w głowicy, backbone i neck odpowiadają nowym nazwom modułów, na przykład
/head/anchor_convs.0/.... Należy zaktualizować narzędzia oparte na nazwach węzłów, takie jak konfiguracje węzłów końcowych Hailo. Wejścia modelu, wyjścia i ich nazwy pozostają bez zmian. -
Dostrajanie YOLO9 z wag bez tensorów PGI, w tym z opublikowanych
LibreYOLO9{t,s,m,c}.pt, trenuje tylko główną głowicę, jak w 1.5.0; wersja 1.6.0 dołączała losowo zainicjalizowaną gałąź PGI zaux_weight=0.25. Wagi, które zawierają tensory PGI, oraz uruchomienia od zera nadal trenują z PGI. Należy przekazaćaux_weight=0.25, aby mimo to dołączyć nową gałąź, alboaux_weight=0, aby ją wyłączyć. -
Gdy PGI jest dołączone, YOLO9-m i YOLO9-c budują pomocniczą gałąź z MultimediaTechLab: 12.8M (m) i 25.7M (c) parametrów używanych tylko podczas trenowania przy 80 klasach, wobec 7.5M i 10.2M wcześniej, więc trenowanie tych rozmiarów z PGI wymaga więcej pamięci i czasu na krok. Checkpoint treningowy m/c z 1.6.0 wznawia trenowanie i dostrajanie z gałęzią, z którą był trenowany. Inferencja oraz YOLO9-t/s pozostają bez zmian.
-
YOLO9, YOLO9-E2E i YOLO9-P2 obcinają normę L2 gradientu do 10, a ich przypisywanie w trenowaniu ocenia kotwice w fp32, więc pozytywy wybrane przy fp16 AMP mogą się różnić. Należy przekazać
clip_max_norm=0, aby uzyskać obcinanie z 1.6.0; uruchomienie rozpoczęte w 1.6.0 i wznowione w 1.7.0 również obcina, chyba że się to przekaże. Przypisywanie w fp32 nie ma przełącznika. -
Niezerowe
perspectivezniekształca obraz przez przesunięcie narożników w każdej rodzinie używającej wspólnej transformacji afinicznej (YOLO9 i jego warianty E2E i P2, YOLOX, YOLOv7, YOLO-NAS, PP-YOLOE, RTMDet, PicoDet, RT-DETR i RT-DETRv2), w tym w uruchomieniach wznowionych z checkpointu 1.6.0, który je ustawiał. Wartości0.002i wyższe dają to samo maksymalne zniekształcenie, a wartości ujemne zgłaszająValueError. Żadne ustawienie nie odtwarza zniekształcenia z 1.6.0; domyślneperspective=0pozostaje bez zmian. -
Pipeline mosaic YOLO9 losuje współczynnik mixup z rozkładu Beta(1, 1) zamiast Beta(32, 32), bez ustawienia dla starej wartości. Domyślne trenowanie YOLOv7 się zmienia, ponieważ YOLOv7 domyślnie włącza mixup. YOLO9, YOLO9-E2E, YOLO9-P2, RT-DETR i RT-DETRv2 zmieniają się tylko wtedy, gdy mixup jest włączony.
-
libreyolo trainbezname=zapisuje uruchomienia EC, D-FINE, SegFormer i LingBot-Vision wruns/train/ec_exp,dfine_exp,segformer_expilingbotvision_expzamiast wruns/train/exp, sondy V-JEPA 2 wruns/train/train, a uruchomienia YOLO9-P2 wruns/train/yolo9_exp. Należy przekazaćname=expdla starej ścieżki alboname=yolo9_p2_expdla YOLO9-P2. -
libreyolo trainuruchamia D-FINE, SegFormer i LingBot-Vision z ich własnych receptur. Dla D-FINE oznacza to 132 epoki,lr0=2e-4,weight_decay=1e-4, 2 epoki rozgrzewki oraz brak augmentacji mosaic, mixup, HSV i afinicznej. Aby przekazać wartości, które wysyłała wersja 1.6.0, należy podaćepochs=300 optimizer=sgd lr0=0.01 weight_decay=5e-4 warmup_epochs=5 mosaic=1.0 mixup=1.0 hsv_prob=1.0 degrees=10 translate=0.1 shear=2.0. -
libreyolo.validation.ConfusionMatrixindeksujematrix[predicted, true](wcześniej[actual, predicted]), liczy detekcje przyconf_thres=0.25(wcześniej 0.15), przyjmujenames=itask=wyłącznie jako argumenty nazwane, a jegomatrixnie może już być przypisywane na nowo. Należy transponować kod, który indeksował starą macierz, i przekazaćconf_thres=0.15dla starych liczności.plots=Truezapisuje liczności wconfusion_matrix.png, a wykres znormalizowany wconfusion_matrix_normalized.png. -
predict(agnostic_nms=True)tłumi nakładające się ramki między klasami zamiast ostrzegać. Zadania bez ramek zgłaszająValueError,LibreEnsemblei HRNet zgłaszająNotImplementedError, a poziom SAM odrzuca ten argument zTypeError; należy usunąć ten argument z takich wywołań. -
Nieznana wartość
interpolationklasyfikatora zgłaszaValueError, w tym tryby torchvisionLANCZOS,BOX,HAMMINGiNEAREST_EXACT. Należy użyćbilinear,bicubic,nearestlubbilinear_no_antialias. -
Przed porównaniem z wynikami 1.6.0 należy ponownie uruchomić walidację dla
val(single_cls=True)na modelu trenowanym na kilku klasach, dla zbiorów segmentacji mieszających wiersze tylko z ramkami i z wielokątami oraz dla RTMDet-Ins, który domyślnie zachowuje domax_det=300masek na obraz; dla ustawienia z MMDetection należy przekazaćmax_det=100. -
Bez
libreyolo[rfdetr]wywołania CLI z nazwą modelu RF-DETR lub DINOv2 kończą działanie z kodem błędu JSONmodel_load_failedzamiastmodel_not_found, a komunikat podajepip install libreyolo[rfdetr].
Pełne wydanie opisuje lista zmian.
Z 1.5.0 do 1.6.0
-
Przed instalacją dodatku ONNX należy zaktualizować środowiska z ONNX Runtime poniżej 1.18 do
onnxruntime>=1.18.0. -
SAM 3D Body przyjmuje sprawdzony zestaw zasobów snapshotu. Należy zainstalować
libreyolo[hf], uzyskać dostęp do modelu i użyć automatycznego pobierania albo podać niezmieniony katalog snapshotu i ustalony zasób MHR w zaufanym lokalnym systemie plików. -
Po poprawkach zmiany rozmiaru RF-DETR dla zadań innych niż estymacja pozy oraz normalizacji klasyfikatorów należy ponownie uruchomić walidację. Przed porównaniem z wynikami 1.5.0 należy sprawdzić wdrożone progi pewności; nie ma flagi dawnego przetwarzania wstępnego.
-
D-FINE, DEIM, RT-DETRv4 i detekcja YOLO-NAS domyślnie włączają FP16 AMP. Aby zachować FP32, należy przekazać
amp=False. -
Aby odtworzyć dawne ustawienia dostrajania YOLO9, należy ustawić
aux_weight=0,max_labels=100iwarmup_momentum=0.937.letterbox_pad="topleft"jest potrzebne, gdy nowa konwersja ze znacznikiem wyśrodkowania ma odtworzyć starą geometrię. Stare checkpointy z jedną głowicą wznawiają trenowanie z oryginalnym grafem. Nowe przebiegi trenowania YOLO9 zużywają więcej pamięci GPU, więc należy obniżyćbatch, jeśli rozmiar batcha z wersji 1.5.0 wyczerpuje pamięć. -
RF-DETR i DINOv2 tworzą katalogi uruchomień z nazwą rodziny i kolejnym numerem. Należy zaktualizować kod korzystający ze ścieżek artefaktów lub ustawić
output_dir="runs/train", exist_ok=True, aby zachować dawną lokalizację i ponowne używanie katalogu. -
W klasyfikacji należy zachować
mixup + cutmix <= 1; nieprawidłowe kombinacje zgłaszają teraz błąd podczas konfiguracji. -
QAT wyłącza EMA, SyncBatchNorm i uśrednianie checkpointów. Należy używać checkpointów QAT best/last bez polegania na tych stanach.
-
Własne loadery z hookami zmieniającymi zbiór danych muszą używać
persistent_workers=Falselub odtwarzać procesy robocze po zmianie. Niezgodne trwałe kopie przy wielu procesach roboczych zgłaszają teraz błąd. -
Tablice obrazów NumPy są odczytywane jako BGR, w kolejności używanej przez OpenCV. Przy przekazywaniu tablicy RGB, takiej jak
np.asarray(pil_image), należy podaćcolor_format="rgb"; wynikcv2.imread()i klatki wideo nie wymagają zmian. -
Tablica NumPy lub tensor 4D to batch:
predict()zwraca listę z jednymResultsna obraz, zamiast używać tylko pierwszego obrazu. -
train(resume=True)itrain(resume="path/to/last.pt")przywracają zapisane argumenty trenowania uruchomienia i nadal zapisują do jego katalogu uruchomienia; argumenty przekazane jawnie mają pierwszeństwo. Wznowienie opublikowanych wag albo uruchomienia, które osiągnęło już swoją wartośćepochs, zgłaszaValueError. -
Przy włączonej walidacji ostatnia epoka jest zawsze walidowana, dlatego uruchomienia krótsze niż
eval_intervalraportują teraz metryki i zapisująbest.pt.val=Falsewyłącza walidację, łącznie z ostatnią epoką. Walidacja w trakcie trenowania zapisuje do<run>/valzamiast doruns/val/. -
Niepowodzenia polecenia
trainw CLI raportują typ błędu, dlatego błędy konfiguracji kończą się kodem 2 zamiast kodem 1 zio_error.
Pełny opis wydania zawiera lista zmian, a konwersję checkpointów opisano w sekcji importowania wag.
Z 1.4.0 do 1.5.0
Ta strona dotyczy aktualizacji samego LibreYOLO. Instrukcje wczytywania checkpointu z projektu źródłowego znajdują się na osobnej stronie import istniejących wag.
Pełny wpis dotyczący wydania znajduje się w dzienniku zmian. Poniżej opisano wyłącznie część wymagającą działania.
Wymagane zmiany w kodzie
allow_experimental=True już nie istnieje
Usunięto bramkę potwierdzenia wraz ze stojącym za nią mechanizmem
ddp_aware(experimental_key=...). Trenowanie i eksport rodzin EC, RTMDet,
PicoDet oraz FOMO wymagały wcześniej tego argumentu, więc zmiana dotyczy każdego
skryptu trenującego jedną z tych rodzin.
# 1.4.0model.train(data="data.yaml", epochs=100, allow_experimental=True) # 1.5.0: usuń argumentmodel.train(data="data.yaml", epochs=100)Nie ma warstwy zgodności sygnalizującej wycofanie. Wywołanie, które nadal
przekazuje ten argument, otrzymuje ostrzeżenie
Unknown training config keys (ignored), a sam argument nie ma żadnego efektu.
Wraz z nim usunięto
BaseModel.EXPERIMENTAL_WEIGHT_FILENAMES. Hook get_download_notice() pozostał
i nadal jest zastępowany przez MiDaS, SegFormer oraz YOLO9-P2.
Poziomy wsparcia są nadal publikowane, ale nie stanowią już argumentu. Zobacz poziomy stabilności.
Poziom eksportu "experimental" już nie istnieje
from libreyolo.export.support import Tier # 1.4.0: Literal["validated", "experimental", "blocked"]# 1.5.0: Literal["validated", "available", "blocked"]Kod rozgałęziający działanie na podstawie ciągu poziomu powinien teraz
odczytywać "available" w miejscu, w którym wcześniej odczytywał
"experimental". BaseExporter nie emituje już RuntimeWarning dla tych
formatów. Stan poszczególnych formatów zawiera macierz
eksportu.
Połączenie pretrained=False z resume jest teraz odrzucane
Wcześniej ta kombinacja prowadziła do niespójnego działania. Teraz zgłasza:
ValueError: pretrained=False cannot be combined with resume.Należy wybrać jedną opcję. pretrained=False rozpoczyna od nowej,
deterministycznie inicjowanej konfiguracji, która w 1.5.0 działa dla każdej
rodziny obsługującej trenowanie, a nie tylko dla trzech z nich. resume
kontynuuje przerwane uruchomienie od jego checkpointu. Obie opcje opisano w
sekcji trenowanie.
--imgsz w CLI jest ciągiem znaków, a nie liczbą całkowitą
Zmiana ma węższy zakres, niż może się wydawać. Oba poniższe przypadki pozostają bez zmian:
libreyolo predict --model yolo9-t --source img.jpg --imgsz 640 # nadal działamodel.predict("img.jpg", imgsz=640) # nadal działaZmiany wymaga tylko kod, który bezpośrednio wywołuje funkcje poleceń
CLI z Pythona. Typ --imgsz w predict, train i val
rozszerzono z int do str, aby akceptować prostokątne rozmiary:
from libreyolo.cli.commands.predict import predict_cmd predict_cmd(..., imgsz=640) # 1.4.0predict_cmd(..., imgsz="640") # 1.5.0, teraz działa też "480x640"Wartością domyślną train jest teraz ciąg "640". Argument export --imgsz
był już ciągiem znaków, a profile pozostaje bez zmian.
Zmieniające się wartości
Trzy zmiany wpływają na metryki przy ustawieniach domyślnych. Przed porównaniem uruchomienia 1.5.0 z uruchomieniem 1.4.0 należy zapoznać się z tymi informacjami.
faster-coco-eval jest domyślnym backendem metryk COCO
Funkcja val() i walidacja w każdej epoce trenowania obliczają teraz metryki
COCO za pomocą backendu C++ faster-coco-eval zamiast pycocotools.
Decyzję podjęto na podstawie zmierzonej zgodności we wszystkich 100 podziałach testowych RF100-VL. Spośród 1400 wartości metryk 1381 było identycznych bitowo, maksymalne odchylenie wyniosło 2.22e-16, różnice głównych wskaźników dokładnie 0, a całość działała 15.6 razy szybciej i 56 razy szybciej na zbiorach danych z dużą liczbą detekcji. Wyniki nie powinny się zmienić. Mimo to tworzy je inna implementacja i właśnie dlatego zmiana znajduje się na tej liście.
pycocotools pozostaje automatycznym rozwiązaniem zapasowym, gdy faster-coco-eval nie jest zainstalowany. Aby go wymusić:
libreyolo val --model yolo9-t --data coco.yaml --no-faster-coco-evalmodel.val(data="coco.yaml", faster_coco_eval=False)Ustawienie LIBREYOLO_FASTER_COCO_EVAL=0 daje ten sam efekt globalnie.
Faktycznie użyty backend jest zapisywany w logu na poziomie INFO, dostępny jako
model.last_eval_backend po wywołaniu val() i zawarty jako eval_backend w
danych JSON CLI. Szybką ścieżkę można zainstalować poleceniem
pip install libreyolo[fast-eval].
Checkpointy YOLOX wytrenowane przed 1.5.0 wymagają nadpisania eps
To pułapka tego wydania. Należy ją uwzględnić w przypadku dostrojonego modelu YOLOX.
YOLOX określa parametry BatchNorm jako eps=1e-3 i momentum=0.03. Do wersji
1.5.0 wartości te stosowano jako późniejszą poprawkę, która nie zachowywała się
podczas przebudowy liczby klas wykonywanej przez train(), gdy nc zbioru
danych różniło się od wartości checkpointu. Taki dostrojony model był trenowany
i walidowany w trakcie trenowania z domyślnym dla torch eps=1e-5, a następnie
ponownie wczytywany do inferencji z wartością 1e-3. Te same tensory działały
więc z inną normalizacją.
Rozmiary ze zwykłymi konwolucjami zmieniają się nieznacznie. Rozmiar depthwise
n zmienia się znacznie, ponieważ jego running_var dla poszczególnych kanałów
jest na tyle małe, że zaczyna dominować eps. W podziale ball zbioru RF100-VL
ten sam checkpoint nano osiąga 0.566 mAP50-95 przy eps użytym podczas
trenowania i 0.151 po standardowym ponownym wczytaniu.
Checkpoint wytrenowany przed 1.5.0 ma semantykę eps=1e-5. Aby uzyskać dla niego wiarygodne wyniki, można przeprowadzić ocenę z nadpisanym eps BN na 1e-5:
import torchfrom libreyolo import LibreYOLO model = LibreYOLO("my-yolox-finetune.pt")for module in model.model.modules(): if isinstance(module, torch.nn.BatchNorm2d): module.eps = 1e-5 model.val(data="data.yaml")Można też jednorazowo włączyć sqrt((var + 1e-3) / (var + 1e-5)) do wag BN i
zapisać wynik. Checkpointy wytrenowane w wersji 1.5.0 lub nowszej nie wymagają
żadnej z tych czynności.
Trenowanie wieloskalowe D-FINE korzysta z procedury projektu źródłowego dla każdego rozmiaru
Wartość base_size_repeat była ustawiona na stałe na 3 dla każdego rozmiaru.
Teraz jest wyznaczana dla poszczególnych rozmiarów zgodnie z projektem
źródłowym: n jest trenowany przy stałym rozmiarze z wyłączoną
wieloskalowością, s ma wartość 20, m 6, l 4, a x 3. Wcześniej
zgodny był tylko x, więc n, s, m i l otrzymują inny rozkład skal i zbiegają do
innych wartości metryk.
Aby przywrócić stare działanie, ustaw wartość jawnie:
from libreyolo.training.config import DFINEConfig config = DFINEConfig(base_size_repeat=3)DEIM nadal używa stałej wartości 3. Szczegóły rodziny znajdują się na stronie D-FINE.
Warto wiedzieć, działanie nie jest wymagane
- Wyniki prostokątnego
imgszzmieniły się, ponieważ wcześniej były błędne. Współrzędne ramek, zmiana rozmiaru masek RTMDet, przeskalowanie YOLO-NAS i skalowanie danych referencyjnych w walidatorze używają teraz osobnych wartości wysokości i szerokości zamiast jednego skalara. Kwadratowyimgsznie zmienił się na poziomie bitów. Prostokątna inferencja lub walidacja w wersji 1.4.0 była nieprawidłowo skalowana. YOLO-NAS odrzuca teraz prostokątnyimgsz, zamiast po cichu tworzyć błędne dane wyjściowe. - Słowniki metryk zyskały nowe klucze. Są to
max_det,ar_max_detiAR_max_detz modułu oceniającego COCO orazmetrics/lossimetrics/loss/cez FOMO. Wartości przy ustawieniach domyślnych pozostają bez zmian, ale każdy mechanizm iterujący po kluczach metryk, w tym niestandardowe moduły rejestrujące i nagłówki CSV, zobaczy nowe kolumny. - Deterministyczne uruchomienia YOLO9, które powodują przebudowę głowicy, rozpoczynają od innej inicjalizacji, ponieważ ziarno jest teraz stosowane przed przebudową, a nie po niej. Dostrajania z wersji 1.4.0 z ustalonym ziarnem do innej liczby klas nie można odtworzyć bit po bicie w wersji 1.5.0.
libreyolo[hub-kernels]na CUDA rzeczywiście włącza teraz natywny kernel MS-deform-attn. Wersja 1.4.0 uzależniała go od warunku, którego RF-DETR nigdy nie spełniał, więc kernel nie był uruchamiany. Predykcje dla RF-DETR i pozostałych rodzin z deformowalną uwagą mogą zmienić się w granicach tolerancji float. Nie dotyczy to standardowych instalacji, a ustawienieLIBREYOLO_HUB_KERNELS=0wyłącza kernel.libreyolo predictpomija nieobsługiwane opcje zamiast zgłaszać wyjątek. CLI filtruje argumenty nazwane na podstawie sygnatury__call__modelu, więc opcja nieprzyjmowana przez rodzinę jest ignorowana zamiast zgłoszeniaTypeError. Nieznana nazwa flagi jest nadal odrzucana z komunikatemNo such option.- Źródła na żywo zmieniają strukturę danych wyjściowych JSON. Kamery internetowe, strumienie RTSP i przechwytywanie ekranu domyślnie włączają streaming, który emituje jeden rekord na klatkę zamiast jednego na wywołanie. Te źródła są nowe w wersji 1.5.0, więc zmiana nie dotyczy żadnego skryptu 1.4.0.
- Ponowny eksport
rfdetr-poselubyolonas-posedo ONNX tworzy inne nazwy wyjściowe. Wersja 1.4.0 błędnie interpretowała ich wielotensorowe głowice pozy jako segmentację za pomocą heurystyki liczby wyjść. Istniejące pliki.onnxna dysku pozostają bez zmian. - W instalacji bez torch wyniki zawierają tablice numpy zamiast
torch.Tensor, dlatego.boxes.datazwraca inny typ, a rozstrzyganie remisów przez NMS może różnić się od torchvision. Gdy torch jest zainstalowany, działanie pozostaje identyczne bajt po bajcie. Zobacz lekką instalację. - Obiekty konfiguracji sprawdzają więcej danych podczas tworzenia.
TrainConfigotrzymał metodę__post_init__, której wcześniej nie miał, dlatego konfiguracja, która już wcześniej była nieprawidłowa, zgłasza wyjątek natychmiast zamiast na późnym etapie uruchomienia. SerializacjaValidationConfigotrzymała kluczedge_thresholds, co uniemożliwia ścisły cyklValidationConfig(**dump)z danych wersji 1.4.0. - Nazwy plików wag dla rodzin z sufiksem zadania są rozwiązywane inaczej.
segformer-b0prowadzi teraz doLibreSegformerb0-sem.pt. Naprawia to błędy 404 automatycznego pobierania, ale psuje skrypty z wpisaną na stałe starą nazwą bez sufiksu. - Znacznik pytest
experimental_backendnazywa się terazextended_backend. Ma to znaczenie tylko w przypadku uruchamiania zestawu testów z opcją-m.
Checkpointy i zbiory danych
Checkpointy zapisane przez wersję 1.4.0 wczytują się bez zmian.
Schemat otrzymał pola imgsz_h i imgsz_w
dla modeli prostokątnych i nadal zapisuje skalar imgsz = max(h, w) dla
starszych modułów odczytujących. Eksporty ExecuTorch
i MNN wymagają teraz pliku towarzyszącego, odpowiednio
<program>.pte.json i <model>.mnn.json, a eksporty HRNet zawierają
pose_input: "person_crop". Formaty zbiorów danych pozostają bez zmian.