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 APIcsi.CSIz obsługą wielu jednoczesnych kamer, wprowadzone obok starszego modułusensor.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ł
buzzeroraz obsługę Lepton w modulefir(Lepton jest teraz zwykłą kamerą). Zobacz zmianę fir/Lepton oraz usunięcie modułu buzzer.
Nowe funkcje¶
Nowy moduł kamery
csi— oparty na klasach obiektcsi.CSIz wieloma jednoczesnymi kamerami (do trzech na N6), nieblokującym zrzutem obrazu, niestandardowymi rozmiarami ramki(w, h)oraz informacyjnymprint()/ repr. Jest wprowadzony obok starszego modułusensor(nie jest jego bezpośrednim zamiennikiem).crc—crc.crc16()icrc.crc32(), sprzętowo akcelerowane z programowym fallbackiem, na OpenMV N6 i AE3.image.Image.draw_image()zyskało słowo kluczowetransform=(dwuwymiarowa macierz typu floatndarraydo 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 GenX320 —
csi.IOCTL_GENX320_SET_MODEzcsi.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.Modelzyskał słowo kluczowepostprocess=(post-procesor uruchamia się teraz automatycznie wewnątrzpredict()nawet bez wywołania zwrotnego);ml.postprocessingzostało zreorganizowane w podpakiety producentów —ml.postprocessing.ultralytics(YoloV5,YoloV8),ml.postprocessing.darknet(YoloV2,YoloLC),ml.postprocessing.edgeimpulse(Fomo) orazml.postprocessing.mediapipe(BlazeFace,BlazePalm,HandLandmarks,FaceLandmarks) — stare nazwy w stylu snake_case pozostają jako aliasy; dodanoml.utils.draw_keypoints()iml.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
SPIDisplaymogą nadpisać swoje polecenia inicjalizacyjne; konstruktor wyświetlacza SPI zyskał słowa kluczowehmirror/vflip.Profiler na urządzeniu — liczniki cykli/zdarzeń SysTick + Armv8.1-M PMU z instrumentacją na poziomie funkcji, odczytywane przez łącze debugowe (
pyopenmvzyskał 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/
transposeteraz 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;Normalizationstosuje 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;YoloV2nie 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
toforaz 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ł
crcoraz 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.
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.
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.
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.
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.
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.
Lista kontrolna migracji¶
Typowa praca potrzebna do czystego przeniesienia na v4.8.0 to:
Jeśli używałeś FLIR Lepton przez
fir, przejdź na przechwytywanie go jako sensora kamery (zmiana fir/Lepton).Zastąp każde użycie
buzzerprzezmachine.PWM(usunięcie modułu buzzer).Usuń wywołania
omv.disable_fb()(usunięcie omv.disable_fb()).Dla
image.ImageIO: używaj małych liter'r'/'w'i oczekuj, że'w'obetnie plik (zmiana ImageIO).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).
Ponownie sprawdź każdy skrypt, który sterował zegarem sensora dla przechwytywania wrażliwego na czasowanie (zmiana zegara).