v4.7.0

v4.7.0 to duże wydanie z nowymi funkcjami. Najważniejsze z nich: nowa płytka OpenMV AE3 (Alif Ensemble, Cortex-M55 + Ethos-U55 NPU) z dwurdzeniowym modelem programowania openamp, system plików tylko do odczytu ROMFS (/rom) z dołączonymi modelami i kaskadami, obsługa VL53L8CX 8x8 time-of-flight, nowe procesory końcowe YOLOv8 / YOLO-LC oraz MicroPython 1.25. Wydanie zmienia też sposób ładowania wbudowanych modeli i kaskad Haara, więc zapoznaj się z opisem zmian niezgodnych poniżej.

Najważniejsze zmiany

  • Płytka OpenMV AE3 — płytka Alif Ensemble (Cortex-M55 + Ethos-U55 NPU), z pełnym portem, bootloaderem i ROMFS.

  • Dwurdzeniowy moduł openamp — przenoszenie pracy na drugi rdzeń Alif przez RPMsg (dekorator @async_remote, Endpoint/ EndpointIO).

  • ROMFS — system plików tylko do odczytu /rom z wbudowanymi modelami TFLite i kaskadami Haara oraz nowy kreator hosta tools/mkromfs.py.

  • Obsługa wielostrefowego sensora VL53L8CX 8x8 time-of-flight.

  • Nowe procesory końcowe MLyolo_v8_postprocess oraz yolo_lc_postprocess.

  • MicroPython zaktualizowany do 1.25.0.

  • Zmiana niezgodna: wbudowane modele i kaskady Haara ładują się teraz z /rom po ścieżce (zobacz zmianę ml.Model i zmianę kaskad Haara).

Nowe funkcje

  • OpenMV AE3 — nowa płytka Alif Ensemble (rdzeń aplikacyjny Cortex-M55 + Ethos-U55 NPU), z portem, bootloaderem, konfiguracją płytki, diodą RGB LED oraz obsługą ROMFS.

  • openamp — nowy moduł dla modelu RPC dwurdzeniowego Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback oraz dekorator @async_remote do przenoszenia zserializowanych funkcji na drugi rdzeń. Rdzenie HE/HP dostarczają domyślny moduł uruchamiający zadania _boot.py oparty na asyncio.

  • audio — port Alif dodaje moduł audio (mikrofon PDM) ze strumieniowym API opartym na wywołaniach zwrotnych (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) na AE3.

  • ROMFS — system plików tylko do odczytu /rom z wbudowanymi zasobami (modele TFLite, kaskady Haara, …) pakowanymi osobno dla każdej płytki, nowe narzędzie hosta tools/mkromfs.py (tflite, tflite+vela, kaskada Haara, tekst, plik binarny) oraz pomocnik scripts/libraries/romfs.py udostępniający ls_romfs().

  • Przetwarzanie końcowe ML — nowe klasy yolo_v8_postprocess (YOLOv8) i yolo_lc_postprocess (lekki wariant tiny-YOLOv2 z domyślnymi anchorami zoptymalizowanymi pod systemy wbudowane), każda przyjmująca threshold, nms_threshold oraz nms_sigma.

  • Anti-flicker GenX320 — nowy ioctl IOCTL_GENX320_SET_AFK do włączania i konfigurowania filtra anti-flicker sensora zdarzeniowego (min./maks. częstotliwość migotania w Hz), z przykładem genx320_grayscale_set_afk.py.

  • VL53L8CX — obsługa wielostrefowego sensora 8x8 time-of-flight przez moduł tof (automatycznie wykrywany, 8x8 przy 15 Hz).

Pozostałe zmiany i usprawnienia

  • MicroPython zaktualizowany do 1.25.0 (porty STM32 i i.MX RT), z dodanym portem Alif z upstream oraz usuniętymi starszymi sterownikami BT-HCI z portów STM32 / i.MX RT.

  • GenX320 — nowa sekwencja ISSD podwaja wewnętrzny zegar pikseli (24 → 48 MHz) dla wyższych liczb klatek.

  • STM32N6 / ST Edge AI — podstawy wdrażania modeli Neural-ART na STM32N6 (narzędzia ST Edge AI oraz obsługa ROMFS).

  • PAG7936 — ustawiana jest teraz przepływność bitowa CSI PHY, poprawiając działanie tego sensora.

Poprawki błędów

Kamera i sensory:

  • Naprawiono IMU przez I2C — płytki podłączające IMU LSM6DSx przez I2C inicjalizują się teraz i odczytują poprawnie (ścieżka I2C wcześniej używała wadliwej ścieżki odczytu i błędnych stałych).

  • Inicjalizacja FLIR Boson ponawia teraz próbę do 10 razy dla starszych sensorów (< IDD 4.x), których uruchomienie trwa ~10 s, a fabryczne ustawienia domyślne są przywracane przy resecie, dzięki czemu zewnętrznie wczytane ustawienia nie mogą zepsuć wyjścia wideo.

  • Naprawiono psee_ehc_activate_override GenX320, które zapisywało błędny (zerowy) czas akumulacji.

  • Na płytkach STM32 bez sprzętu FastMode+ żądanie trybu fast I2C jest teraz właściwie zabezpieczone zamiast po cichu błędnie konfigurować magistralę.

Uczenie maszynowe:

  • Naprawiono zbieranie ramek ograniczających oraz obsługę np.nonzero w procesorach końcowych YOLOv2 / YOLOv5, poprawiając niezawodność wykrywania.

Obsługa sprzętu i płytek

  • OpenMV AE3 — nowa płytka Alif Ensemble (Cortex-M55 + Ethos-U55 NPU).

  • VL53L8CX — wielostrefowy sensor 8x8 time-of-flight; sensor ToF w AE3 został zmieniony z VL53L5CX na VL53L8CX.

  • STM32N6 — podstawy wdrażania modeli ST Edge AI (Neural-ART).

Niezgodne zmiany API

Widoczne dla użytkownika niezgodności API między v4.6.20 a v4.7.0. Zakres: moduły C Pythona w modules/ oraz biblioteki Pythona w scripts/libraries/.

Każda zmiana jest oznaczona swoim wpływem:

  • major — większość skryptów, które jej używały, wymaga edycji.

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

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

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, aby uzyskać skróconą listę zadań. Każdy hash commita prowadzi do jego diffa na GitHub.

Wbudowane modele ładują się po ścieżce, a nie po nazwie (major)

ml.Model nie ładuje już wbudowanego modelu z samego ciągu nazwy. Modele są teraz ładowane z systemu plików / ROMFS po ścieżce:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

Atrybut model.labels po stronie C został usunięty; etykiety są teraz ładowane przez wrapper Pythona ml.Model z towarzyszącego pliku <model>.txt (None, jeśli nie istnieje). Wszystkie dołączone przykłady oraz ml/apps.py zostały zaktualizowane do ścieżek /rom/*.tflite.

Commits: 978fa436c, 3f55d956c, 416bc4613

Kaskady Haara ładują się z ROMFS (minor)

image.HaarCascade() ładuje teraz wbudowane kaskady przez VFS / ROMFS. Domyślny plik kaskady frontalnej twarzy został przemianowany z haarcascade_frontalface_default.xml na haarcascade_frontalface.xml, a niepowodzenie ładowania zgłasza teraz RuntimeError („Failed to load Haar cascade”) zamiast OSError.

Commit: 9de1220d8

Semantyka tof.reset() / tof.deinit() (behavior)

W module tof reset() było wcześniej aliasem init() i nie istniał prawdziwy deinit. tof.reset() wykonuje teraz rzeczywisty reset sensora, a tof.deinit() poprawnie wyłącza sensor (z obsługą wyłączania VL53L5CX). Kod, który polegał na tym, że reset() ponownie inicjalizuje sensor, powinien zostać sprawdzony.

Commits: 20d6b53f8, c743cab6a

Ograniczenia czasowe i trybu zdarzeniowego GenX320 (behavior)

Nowa sekwencja ISSD GenX320 zmienia podstawę czasu sensora: argumenty liczby klatek i ekspozycji są teraz wyrażane w jednostkach 1 MHz zamiast być skalowane zegarem, a wygaszanie HSYNC jest dynamicznie dostosowywane do żądanej liczby klatek. Skrypty, które na sztywno zakodowały wartości czasowe GenX320, muszą zostać ponownie dostrojone. Przechwytywanie w trybie zdarzeniowym zgłasza teraz błąd, gdy włączona jest transpozycja obrazu (jest ona nieobsługiwana w tej konfiguracji).

Commits: 660a783d6, 7a718c6af

Lista kontrolna migracji

Dla czystego przeniesienia do v4.7.0 typowa praca to:

  1. Zmień ładowanie wbudowanego modelu z ciągu nazwy na ścieżkę /rom/<name>.tflite i dostarcz etykiety przez towarzyszący plik <name>.txt (zmiana ml.Model).

  2. Zaktualizuj haarcascade_frontalface_default.xml na haarcascade_frontalface.xml i przechwytuj RuntimeError (a nie OSError) przy niepowodzeniu ładowania kaskady (zmiana kaskad Haara).

  3. Usuń kod, który polegał na tym, że tof.reset() ponownie inicjalizuje sensor (zmiana tof).

  4. Dostrój ponownie wszelkie na sztywno zakodowane wartości liczby klatek / ekspozycji GenX320 do jednostek 1 MHz i nie włączaj transpozycji w trybie zdarzeniowym (zmiana GenX320).