v4.5.6#

v4.5.6 to duże wydanie poświęcone uczeniu maszynowemu. Moduł C tf dla TensorFlow został zastąpiony nowym, niezależnym od silnika pakietem ml opartym na TensorFlow Lite Micro (TFLM), konwersja obraz→tensor została przeniesiona do image.to_ndarray(), a płytki dwurdzeniowe przeszły na Open-AMP. Wprowadzono kilka zmian łamiących zgodność — przeczytaj je poniżej przed aktualizacją skryptów ML.

Najważniejsze zmiany#

  • Nowy pakiet ml — stary moduł tf został przepisany na niezależny od silnika pakiet ml (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf pozostaje jako alias.

  • Backend TFLM — przestarzała biblioteka libtf została zastąpiona przez TensorFlow Lite Micro oparty na wersji upstream: ~20% szybsze wnioskowanie i mniejsze biblioteki.

  • Open-AMP dwurdzeniowy — GIGA i Portenta H7 używają teraz Open-AMP/RPMsg do komunikacji międzyrdzeniowej M7/M4 (stary mechanizm CM4 został usunięty).

  • Wbudowany Bluetooth — oprogramowanie układowe Bluetooth CYW43 włączone na Nicla Vision, Portenta H7 i GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (z obsługą 4-wymiarowych ndarray).

  • Zmiana łamiąca zgodność: API ML zmieniło się znacząco, a kaskady Haara są domyślnie wyłączone na większości płytek — zobacz zmiany łamiące zgodność.

Nowe funkcje#

  • Pakiet mlml.Model z predict() (roi, callback, lista wielu wejść), atrybutami kształtu/dtype/scale/zero-point dla każdego tensora, ml.preprocessing.Normalization, ml.utils (NMS) oraz ml.apps (napisany w czystym Pythonie detektor słów kluczowych MicroSpeech z listen() i nieblokującym strumieniowaniem timeout=-1, a także draw_predictions()).

  • System modeli wbudowanych — modele wymienione w models/index.txt są warunkowo osadzane w zależności od płytki (FOMO na wszystkich płytkach ML, modele audio na płytkach z mikrofonami).

  • image.to_ndarray(dtype, buffer=...) — konwertuje obraz na ndarray biblioteki ulab (opcjonalnie w miejscu).

  • Image() z surowych tablic — nowe argumenty słowne shape=, strides=, scale= budują obrazy w skali szarości / RGB565 z surowych list pikseli.

  • Wygładzane draw_circle().

  • Moduł ssl wbudowany w oprogramowanie układowe na GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 i Pico.

  • Audioaudio.init() zyskało argument słowny samples= (próbki PDM na kanał); gain_db działa teraz na mikrofonach DFSDM (np. Nicla Vision).

  • Protokół debugowania — nowe polecenie GET_STATE zwraca w jednym pakiecie flagi run/text/JPEG, geometrię ramki i tekst, ograniczając liczbę zapytań do hosta.

  • Przykład vuart dla Open-AMP do komunikacji międzyrdzeniowej.

Inne zmiany i usprawnienia#

  • MicroPython zaktualizowany do 1.23.0; ulab do 6.5.2 z obsługą 4-wymiarowych ndarray.

  • Szybsze wnioskowanie — backend ML utrzymuje trwały stan/pamięć pomiędzy wywołaniami (~20% szybciej, obsługuje modele typu LSTM).

  • get_similarity() zostało zaimplementowane od nowa na backendzie draw_image (szersza obsługa formatów/operacji).

  • morph() oraz rodzina filtrów mean() przeszły na parsowanie argumentów słownych; mask= akceptuje teraz mutowalny obraz.

  • Przeprojektowany układ pamięci — regiony DMA wyrównane do potęgi 2, bloki GC z możliwością zmiany kolejności, wiele stert; mniejsza wczesna fragmentacja sterty na płytkach z małą ilością RAM; RT1060 zyskuje dodatkową stertę GC.

  • WiFi (CYW43) jest teraz deinicjalizowane przy miękkim resecie; wyświetlacz SPI-TV opróżnia z pamięci podręcznej tylko region bufora ramki dla płynniejszych aktualizacji.

Poprawki błędów#

Kamera i sensory:

  • Naprawiono przypadkowe unieważnianie pamięci podręcznej CPU w ścieżce bufora ramki/sensora na STM32 i i.MX RT, które mogło uszkadzać dane obrazu.

  • Naprawiono odczyty termiczne I2C MLX90640/MLX90641 na płytkach i.MX RT (duże transfery są teraz dzielone na fragmenty).

Uczenie maszynowe:

  • Naprawiono obsługę load_to_fb w ml.Model, ustalanie rozmiaru wejściowej bytearray, sprawdzanie ndim w ndarray oraz walidację formatu/kształtu obrazu w Normalization.

Obraz / system:

  • Dodano brakującą stałą podpowiedzi rysowania image.BLACK_BACKGROUND oraz kontrolę poprawności długości bufora obrazu/tensora.

  • Naprawiono wskaźniki korzeni GC dla FIR i audio, które mogły pozwolić kolektorowi zwolnić używane bufory.

  • Przykład Servo Shield używa teraz SoftI2C, dzięki czemu działa na płytkach OpenMV RT.

Sprzęt i obsługa płytek#

  • Arduino GIGA — obsługa sensorów HM01B0 / HM0360; dwurdzeniowy Open-AMP.

  • Bluetooth — oprogramowanie układowe BT CYW43 na Nicla Vision, Portenta H7 i GIGA.

  • Portenta H7 — RPMsg M7/M4 przez Open-AMP.

  • OpenMV RT1060 — dodatkowe bloki sterty GC (więcej pamięci dla Pythona).

Zmiany API łamiące zgodność#

Widoczne dla użytkownika zmiany API łamiące zgodność pomiędzy v4.5.5 a v4.5.6. Zakres: moduły C Pythona w modules/ oraz biblioteki Pythona w scripts/libraries/.

Każda zmiana jest oznaczona swoim wpływem:

  • duży — większość skryptów, które tego używały, wymaga zmian.

  • mały — wąskie API; dotyczy tylko skryptów, które tego używały.

  • zachowanie — to samo API, inne wyniki; ponownie sprawdź dostrojone skrypty.

  • narzędzia — dotyczy mechanizmów dwurdzeniowych / płytkowych, a nie API Pythona.

Zmiany są pogrupowane według wpływu w tej kolejności. Jeśli chcesz tylko przenieść swój kod, przejdź do listy kontrolnej migracji na końcu. Każdy skrót commita prowadzi do jego diffa na GitHubie.

Moduł tf zastąpiony pakietem ml (duży)#

Moduł C tf dla TensorFlow został przepisany na niezależny od silnika pakiet ml (tf jest zachowany jako wstecznie kompatybilny alias, ale nowy kod powinien używać ml). Funkcje na poziomie modułu tf.load, tf.load_builtin_model oraz metody detect()/segment()/klasyfikacji zostały usunięte — utwórz ml.Model i wywołaj predict(). ml.Model(path) zwraca teraz tylko model (bez krotki (labels, model)); etykiety są atrybutem model.labels. predict() zwraca teraz ndarraye biblioteki ulab (a nie krotki float), obsługuje modele wielowejściowe (przekaż listę), a NMS przeniesiono do ml.utils; normalizacja wejścia została przeniesiona do ml.preprocessing.Normalization. Stary ml.py to teraz ml.apps.

Commity: c7228cbb4, 6c212409c, 3e37f46db, 9a186f4e2, 70b89f474, 3f8491cb0, 4506682c2, 8b38f3837

image.unpack() usunięte — użyj to_ndarray() (duży)#

Krótko istniejące image.unpack() zostało usunięte; zamiast tego konwertuj obraz na tensor za pomocą image.to_ndarray(dtype, buffer=...) i stosuj normalizację scale/mean/stdev za pomocą ml.preprocessing.Normalization, a nie starej wbudowanej ścieżki skalowania obrazu.

Commity: 9848eed12, de0d46fa6

Argument scale surowej tablicy w Image() (mały)#

Podczas tworzenia Image z surowej tablicy pikseli argument scale przyjmuje teraz zakres (min, max) zamiast (scale, add).

Commit: 7b79fb4c7

Kaskady Haara domyślnie wyłączone na większości płytek (zachowanie)#

Aby zwolnić miejsce w pamięci flash, wykrywanie twarzy oparte na kaskadach Haara (find_features() / image.HaarCascade()) jest teraz domyślnie wyłączone na Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO oraz OpenMV Pure Thermal. Skrypty używające kaskad Haara na tych płytkach muszą ponownie zbudować oprogramowanie układowe z włączoną tą funkcją.

Commit: 6ce27c910

Przerywanie skryptu i skalowanie tensora (zachowanie)#

Debuger USB przerywa teraz działający skrypt za pomocą funkcji VM-abort MicroPythona zamiast wymuszonego skoku PendSV (czystsze rozwiązanie, ale punkt przerwania jest inny). Skalowanie wejścia SCALE_S128_127 zostało poprawione tak, aby mapować 0–255 na −128–127 bez błędnego wzmocnienia — modele opierające się na starym (błędnym) skalowaniu dadzą inne wyniki.

Commity: e758a0f95, a4d97c572

Koprocesor CM4 zastąpiony przez Open-AMP (narzędzia)#

Przestarzały mechanizm oprogramowania układowego koprocesora CM4 na GIGA / Nicla Vision / Portenta H7 został usunięty i zastąpiony przez Open-AMP/RPMsg. Kod dwurdzeniowy musi przejść na model Open-AMP (dostarczono przykład vuart).

Commity: 3cc57fea4, 93f2d4c41

Lista kontrolna migracji#

Dla czystego przeniesienia na v4.5.6 typowa praca to:

  1. Przenieś kod ML na ml: utwórz ml.Model(path), wywołaj predict(), odczytaj model.labels, oczekuj wyjść typu ndarray oraz przenieś normalizację do ml.preprocessing.Normalization, a NMS do ml.utils (zmiana pakietu ml).

  2. Zastąp image.unpack() przez image.to_ndarray() (usunięcie unpack).

  3. Zaktualizuj wszelkie argumenty scale surowej tablicy w Image() na zakres (min, max) (zmiana skali Image).

  4. Jeśli używasz kaskad Haara na płytce, której to dotyczy, zbuduj ponownie oprogramowanie z włączoną tą funkcją (zmiana kaskad Haara).

  5. Zwaliduj ponownie modele, które zależały od SCALE_S128_127 (zmiana skalowania).

  6. Przenieś kod dwurdzeniowy na Open-AMP (zmiana CM4).