v4.8.0

v4.8.0 to duże wydanie wprowadzające nowe funkcje. Najważniejsze z nich: zupełnie nowy, oparty na klasach moduł kamery csi z obsługą wielu kamer, płytka OpenMV N6 (STM32N6) z NPU Neural-ART, backend wnioskowania na NPU, tryb zdarzeń RAW dla kamery zdarzeniowej GenX320, nowy moduł crc, zreorganizowana biblioteka do post-processingu ML oraz MicroPython 1.26. Usunięto też kilka starszych API — moduł buzzer oraz obsługę FLIR Lepton w module fir — dlatego przeczytaj poniższe zmiany łamiące zgodność.

Najważniejsze zmiany

  • Nowy moduł kamery csi. Oparte na klasach API csi.CSI z obsługą wielu jednoczesnych kamer, wprowadzone obok starszego modułu sensor.

  • OpenMV N6. Płytka STM32N6 z NPU Neural-ART, potrójnym buforowaniem, Soft-CSI oraz modułem ToF.

  • Wnioskowanie na NPU. Backend ST Neural-ART (STAI) do sprzętowo akcelerowanego wnioskowania modeli.

  • Tryb zdarzeń GenX320. Wyjście zdarzeń RAW oraz draw_event_histogram() do renderowania danych z kamery zdarzeniowej.

  • Zreorganizowany post-processing ML — podpakiety producentów (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) z nowymi detektorami BlazeFace / BlazePalm oraz punktów charakterystycznych dłoni i twarzy.

  • Nowy moduł crc — sprzętowo akcelerowane CRC-16 / CRC-32.

  • MicroPython zaktualizowany do 1.26.0.

  • Zmiana łamiąca zgodność: usunięto moduł buzzer oraz obsługę Lepton w module fir (Lepton jest teraz zwykłą kamerą). Zobacz zmianę fir/Lepton oraz usunięcie modułu buzzer.

Nowe funkcje

  • Nowy moduł kamery csi — oparty na klasach obiekt csi.CSI z wieloma jednoczesnymi kamerami (do trzech na N6), nieblokującym zrzutem obrazu, niestandardowymi rozmiarami ramki (w, h) oraz informacyjnym print() / repr. Jest wprowadzony obok starszego modułu sensor (nie jest jego bezpośrednim zamiennikiem).

  • crccrc.crc16() i crc.crc32(), sprzętowo akcelerowane z programowym fallbackiem, na OpenMV N6 i AE3.

  • image.Image.draw_image() zyskało słowo kluczowe transform= (dwuwymiarowa macierz typu float ndarray do przekształceń afinicznych/perspektywicznych, akcelerowanych GPU na STM32 i Alif); to samo przekształcenie jest dostępne w konwersji obrazu.

  • draw_event_histogram() — renderowanie histogramów z kamery zdarzeniowej.

  • Tryb zdarzeń RAW GenX320csi.IOCTL_GENX320_SET_MODE z csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, stałe typów zdarzeń oraz nowe przykładowe skrypty.

  • ML — backend wnioskowania na NPU ST Neural-ART (STAI); ml.Model zyskał słowo kluczowe postprocess= (post-procesor uruchamia się teraz automatycznie wewnątrz predict() nawet bez wywołania zwrotnego); ml.postprocessing zostało zreorganizowane w podpakiety producentów — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo) oraz ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — stare nazwy w stylu snake_case pozostają jako aliasy; dodano ml.utils.draw_keypoints() i ml.utils.draw_skeleton(); rozszerzono dołączane modele ROMFS (BlazeFace, YOLO-LC, YOLOv8n, punkty charakterystyczne dłoni/twarzy).

  • audio — wejście mikrofonu cyfrowego MDF na STM32N6.

  • Wyświetlacz — sterownik OLED SSD1351 i przykład; kontrolery SPIDisplay mogą nadpisać swoje polecenia inicjalizacyjne; konstruktor wyświetlacza SPI zyskał słowa kluczowe hmirror / vflip.

  • Profiler na urządzeniu — liczniki cykli/zdarzeń SysTick + Armv8.1-M PMU z instrumentacją na poziomie funkcji, odczytywane przez łącze debugowe (pyopenmv zyskał obsługę profilowania i symboli ELF).

  • Obsługa nowych sensorów — PixArt PS5520; FLIR BOSON na OpenMV H7 Plus; automatyczne wykrywanie GenX320.

Pozostałe zmiany i ulepszenia

  • MicroPython zaktualizowany do 1.26.0.

  • Uruchamianie kamery — zegar sensora został oddzielony od stanu CSI, wykrywanie kamery przy starcie jest szybsze (najpierw próbowana jest najczęstsza konfiguracja), a domyślny zegar OV7725 w OpenMV 3 został poprawiony.

  • Jakość obrazu — programowa korekcja gamma ISP (Alif i STM32) oraz korekcja uszkodzonych pikseli (STM32) są domyślnie włączone; sensory PAG7936 i PS5520 zyskały sterowanie automatycznym balansem bieli.

  • Wydajnośćimage.Image.to_ndarray() jest akcelerowane przez Helium SIMD, a post-procesor FOMO został zwektoryzowany za pomocą ulab.

  • Sterownik FLIR Lepton przepisany tak, aby odbierać ramki asynchronicznie w tle — obrót/transpose teraz działa, rysowanie skaluje obraz w górę dwuliniowo, a reset jest szybszy.

  • Przepustowość przechwytywania — i.MX RT1062 CSI używa teraz pełnego odciążenia DMA, a STM32 N6 ma sprzętowo-GPU draw_image().

Poprawki błędów

Kamera i sensory:

  • Naprawiono tryby RGB565 / GRAYSCALE / BAYER / YUV422 w sensorach STM32, PAJ6100 na OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565 oraz konfigurację mono / RGB-YUV w CSI na N6; programowa kamera testowa resetuje się teraz deterministycznie.

  • Automatyczny balans bieli nie zmienia już obrazu na zielony przy niskich lub zmiennych liczbach ramek na sekundę (próbkowanie co 100 ramek zastąpiono 250 ms średnią ruchomą), a migotanie luminancji PS5520 zostało naprawione.

Przetwarzanie obrazu:

  • Naprawiono usterkę renderowania linii w rysowaniu; image.Image.flush() opróżnia teraz bufor JPEG obrazu, na którym została wywołana; Normalization stosuje teraz średnią/odchylenie standardowe do danych wejściowych typu float; naprawiono alokację obrazu wczytywanego z pliku.

Przechwytywanie z kamery:

  • Naprawiono poważne uszkodzenia obrazu przy transferach innych niż JPEG (przerwanie ramki jest teraz włączane tylko w trybie JPEG), obsługę trybu 3 JPEG oraz blokady rozmiaru linii DMA i małego bufora na STM32; synchronizacja VOSPI / Lepton jest bardziej niezawodna, zwłaszcza na N6.

Różne:

  • omv.board_id() zwraca poprawny UID na RT1060; YoloV2 nie ulega już awarii, gdy zostanie utworzony bez jawnych kotwic (anchors).

Obsługa sprzętu i płytek

  • OpenMV N6 — STM32N6 z NPU Neural-ART, potrójnym buforowaniem, wyjściem SPI LCD/TV, Soft-CSI, modułem tof oraz dołączonymi modelami ROMFS.

  • Arduino GIGA — wyjście wyświetlacza MIPI DSI.

  • Nowe sensory — PixArt PS5520; FLIR BOSON na OpenMV H7 Plus; automatyczne wykrywanie GenX320.

  • OpenMV Pure Thermal — FLIR Lepton jest teraz zwykłym (drugorzędnym) sensorem kamery.

  • Alif AE3 — programowa korekcja gamma ISP, moduł crc oraz poprawki SPI.

Zmiany w API łamiące zgodność

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

Każda zmiana jest oznaczona swoim wpływem:

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

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

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

  • tooling — dotyczy tylko narzędzi hosta / budowania ze źródeł.

Zmiany są pogrupowane według wpływu w tej kolejności — najpierw major, następnie minor, behavior i tooling. Jeśli chcesz po prostu przenieść swój kod, przejdź do listy kontrolnej migracji na końcu, gdzie znajdziesz skróconą listę zadań. Każdy hash commita prowadzi do swojego diffa na GitHubie.

FLIR Lepton przeniesiony z modułu fir (major)

FLIR Lepton jest teraz sterowany jako zwykły sensor kamery, zamiast przez moduł fir. Sterowanie Lepton zostało usunięte z fir: typ FIR_LEPTON oraz metody radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() i trigger_ffc() zniknęły. Przechwytuj Lepton jak każdą inną kamerę (pojawia się jako drugorzędny sensor na OpenMV Pure Thermal); przykład Pure Thermal został przepisany na nowe API. Pozostałe (nie-Lepton) sensory fir (Grid-EYE, MLX, AMG8833) pozostają bez zmian.

Commity: bacfb7aeb, 117710566, 592a22902, 1a614202e

Moduł buzzer usunięty (minor)

Moduł buzzer został usunięty z portów STM32 i i.MX RT. Steruj buzzerem za pomocą machine.PWM; dodano przykład buzzera Pure Thermal wykorzystujący PWM.

Commity: ccb947924, 444120f2d

omv.disable_fb() usunięte (minor)

Funkcja omv.disable_fb() została usunięta; strumieniowanie bufora ramki jest teraz sterowane przez API kamery. Usunięto również starsze skrypty desktopowe RPC, które na niej polegały.

Commity: 84c3db58a, 6fe99051c

csi jest nowy — jego API nie jest jeszcze zamrożone (minor)

Moduł csi został wprowadzony w v4.8.0, a jego API ewoluowało w trakcie wydania: csi.fb() zostało usunięte, a csi.CSI.snapshot() (image=...) wymaga teraz mutowalnego obrazu i rysuje/skaluje przechwyconą ramkę do niego, zamiast wykonywać surową głęboką kopię. Wcześni użytkownicy nowego modułu powinni ponownie przetestować swój kod; starsze API sensor pozostaje bez zmian.

Commity: 0bc0385eb, 8cd7a309f

Tryb strumieniowy image.ImageIO oraz close() (minor)

image.ImageIO — argument mode akceptuje teraz tylko małe litery 'r' / 'w' (wielkie litery są odrzucane ze zaktualizowanym komunikatem o błędzie), a otwarcie z 'w' zawsze obcina/odtwarza plik, zamiast zachowywać istniejący strumień. ImageIO.close() jest teraz idempotentne (zamknięcie już zamkniętego strumienia nie zgłasza już wyjątku) i zwraca None zamiast obiektu strumienia.

Commity: 715c4cbba, 21ceec422

Wartość zwracana przez BlazeFace / BlazePalm (minor)

Post-procesory BlazeFace i BlazePalm (nowe w tym wydaniu) zwracają teraz pojedynczą listę ramek ograniczających zamiast pełnej listy z podziałem na klasy — wywołujący indeksują wynik bezpośrednio, a nie przez [0].

Commit: 75e16b573

Wywołanie zwrotne post-procesora ML otrzymuje surowe tensory (behavior)

Wywołanie zwrotne post-processingu w predict() obiektu ml.Model otrzymuje teraz referencje do surowych (skwantyzowanych) tensorów wyjściowych zamiast wstępnie przekonwertowanych ndarrayów typu float — pozwala to uniknąć wyczerpania pamięci w przypadku dużych modeli. Jeśli nie podano wywołania zwrotnego, nadal zwracany jest ndarray typu float. Niestandardowe wywołania zwrotne muszą same dekwantyzować tensory (wbudowane post-procesory już to robią).

Commit: 84e6ee650

Zegar kamery oddzielony od stanu CSI (behavior)

Zegar sensora jest teraz niezależny od stanu CSI. set_clock / set_frequency rekonfiguruje zegar tylko wtedy, gdy żądana częstotliwość różni się o więcej niż tolerancja, a get_clk_frequency przyjmuje wartość logiczną, aby zwrócić dokładną (a nie nominalną) częstotliwość. Domyślny zegar to 24 MHz na OpenMV N6 i AE3, więc nie jest potrzebne jawne set_clock() przy starcie. Skrypty, które przełączały zegar dla przechwytywania wrażliwego na czasowanie, powinny ponownie sprawdzić swoje założenia.

Commity: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

Protokół debugowania USB i cele firmware (tooling)

Żadna z tych zmian nie wpływa na skrypty MicroPython. Przestarzałe polecenia USBDBG (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) zostały usunięte, a nieobsługiwane polecenia ze starszych IDE są teraz odrzucane zamiast powodować awarie płytek TinyUSB przy połączeniu; usunięto starszy cel firmware UVC dla STM32. Stare narzędzia hosta powinny zostać zaktualizowane; szczegóły znajdziesz w historii repozytorium firmware.

Commity: 90bd11e93, 657c9a632, 35182f035

Lista kontrolna migracji

Typowa praca potrzebna do czystego przeniesienia na v4.8.0 to:

  1. Jeśli używałeś FLIR Lepton przez fir, przejdź na przechwytywanie go jako sensora kamery (zmiana fir/Lepton).

  2. Zastąp każde użycie buzzer przez machine.PWM (usunięcie modułu buzzer).

  3. Usuń wywołania omv.disable_fb() (usunięcie omv.disable_fb()).

  4. Dla image.ImageIO: używaj małych liter 'r'/'w' i oczekuj, że 'w' obetnie plik (zmiana ImageIO).

  5. Dla niestandardowych wywołań zwrotnych post-processingu ML: samodzielnie dekwantyzuj referencje do surowych tensorów lub polegaj na domyślnej ścieżce float (zmiana wywołania zwrotnego).

  6. Ponownie sprawdź każdy skrypt, który sterował zegarem sensora dla przechwytywania wrażliwego na czasowanie (zmiana zegara).