v5.0.1#
v5.0.1 to wydanie serwisowe na bazie v5.0.0 — dotychczasowy moduł sensor staje się warstwą zgodności w Pythonie nad csi, obrazy wczytane do bufora ramki są teraz wyświetlane w podglądzie jak ramki z kamery, enkodery JPEG tracą limit 1 MB na dane wyjściowe i poprawnie obsługują przepełnienie, a do tego dochodzi zestaw poprawek dotyczących kamery, protokołu, sieci i biblioteki ML. Nie wprowadza ono żadnych niezgodnych wstecz zmian w API dla skryptów napisanych pod csi; nieliczne zmiany zachowania wymieniono w sekcji niezgodne wstecz zmiany w API.
Najważniejsze elementy#
Moduł
sensorjest teraz zamrożonym modułem Pythona zbudowanym nacsi. Przy imporcie wypisuje ostrzeżenie o przestarzałości; kilka funkcji, których modułcsinie może obsłużyć, zgłasza terazOSError. Zobacz zmiany w module sensor.Wczytane obrazy są wyświetlane w podglądzie jak ramki z kamery. Obraz umieszczony w buforze ramki z
copy_to_fb=True(image.Image,image.ImageIO.read(),fir.snapshot(),tof.snapshot()) jest wypychany do IDE — wraz ze wszystkim, co na nim narysowano — gdy następny obraz nadpisze bufor ramki, a nie natychmiast. Zobacz zmiany w podglądzie.Przebudowa enkodera JPEG. Limit 1 MB bufora wyjściowego zniknął (rozmiar bufora jest dobierany na podstawie wolnej pamięci), przepełnienie zarówno na ścieżce programowej, jak i sprzętowej jest obsługiwane zamiast zapisywania obciętych plików, a zapisanie skompresowanego obrazu pod drugim skompresowanym rozszerzeniem zgłasza wyjątek zamiast zapisywać śmieci.
Nowa funkcja
protocol.poll()oraz sześć nowych widżetów CBOR (text,lineedit,pushbutton,spinbox,radio,waveform) dlaprotocol.CBORChannel.Postprocesor YOLO Pro, obsługa FLIR Lepton 3.1R / UW, odczyty seryjne IMU, CAN na OpenMV N6 oraz cel symulatora z obsługą sieci.
Nowe funkcje#
YoloPro— nowy postprocesor dla modeli detekcji obiektów Edge Impulse YOLO Pro, wraz z przykłademyolo_pro_detector.py. (f3f150ebd, ea7bbb398)protocol.poll()— wykonuje na żądanie jedną iterację zadania protokołu, dla niestandardowych transportów, które nie są sterowane przez przerwanie USB ani timerpoll_ms.protocol.init()można też wywołać ponownie, aby reinicjalizować stos. (c00c215f9, f849ffb1b)Więcej widżetów kanału CBOR —
protocol.CBORChannel.add()zyskujetext(statyczny ciąg znaków),lineedit(zapisywalny ciąg znaków),pushbutton(działanie chwilowe),spinbox(krokowe wprowadzanie liczb),radio(grupa opcji) orazwaveform(szereg czasowy 1D z argumentamisample_rate,seriesitypecode; przypisz bajty przeplatanych próbek, aby go strumieniować). (8016d29ba)csi.CUSTOM—csi.CSI.framesize()zwraca teraz użyteczną stałą po ustawieniu niestandardowej rozdzielczości(w, h), zamiast anonimowej liczby całkowitej. (af8841654)Odczyt seryjny IMU —
imu.__read_reg()przyjmuje opcjonalny zapisywalny bufor i wypełnia go z kolejnych rejestrów w jednej transakcji. (244ca480a)FLIR Lepton 3.1R i Lepton UW są rozpoznawane przez sterownik Leptona, włącznie z ich radiometrycznymi trybami wzmocnienia. (0fc356632)
Sieć w symulatorze — cel QEMU
MPS2_AN500ma teraz lwIP i kartę sieciową w trybie użytkownika, z zamrożonymirequests,mqttisensororaz testem jednostkowym sieci. (23546dfb1, 61d187305, 15096c3a2)Przykład API zgodnego z OpenAI —
openai_compatible.pywykonuje zrzut JPEG i wysyła go do punktu końcowego chat-completions w celu opisania sceny. (79033c6aa)Przykłady LoRa SX126x — sterownik
lora-sx126xz micropython-lib (wraz zlora-sync/lora-async) jest zamrożony w oprogramowaniu układowym OpenMV RT1062, z przykładami nadajnika/odbiornika/ping-pong/strumienia obrazu dla podłączenia modułu SX1261 lub SX1262 do magistrali SPI. Jest to wsparcie wniesione przez społeczność; OpenMV nie sprzedaje sprzętu LoRa. (19576e1b1)
Pozostałe zmiany i usprawnienia#
Przepisanie biblioteki
requests— odpowiedzi z transferem chunked są dekodowane, udostępniono argumenttimeout(domyślnie 5 s), treści JSON i ciągi znaków są poprawnie serializowane/kodowane, nagłówki są parsowane bez rozróżniania wielkości liter, a linia statusu według pozycji, słownikheaderswywołującego jest kopiowany (więcauthnie przenika już do późniejszych żądań), a treść jest odczytywana blokami dobytearray. (889f0b096)mqttimportujesslleniwie, więc moduł oraz zwykłe połączenia (bez TLS) działają na kompilacjach bez obsługi SSL. (c2e0899e8)Rozmiar bufora wyjściowego JPEG dobierany na podstawie wolnej pamięci zamiast stałego limitu 1 MB; enkodery przycinają bufor do rozmiaru zakodowanych danych przed zapisaniem obrazu, więc przechwytywanie z dużych sensorów przy wysokiej jakości już nie zawodzi. (aa1ca6776)
Porządki w przetwarzaniu końcowym ML — generowanie ramek ograniczających zostało ujednolicone w postprocesorach Darknet, Edge Impulse i Ultralytics, a wyjście YOLOv8 jest transponowane po progowaniu, dzięki czemu jest przechowywane po jednym wierszu na wykrycie, tak jak w pozostałych modelach. (b5c7853f2, c45f99cad)
Bezpieczne wyłączanie PAG7936 — nowa flaga zatrzymania sensora usypia PAG7936 przed przełączeniem RESET/PWDN, co naprawia zawieszenia, gdy sensor jest używany na kablu przedłużającym. Sterownik wybiera również swój zestaw rejestrów MIPI CSI-2 lub równoległy na podstawie adresu I2C sensora w czasie działania, a nie w czasie kompilacji. (10026530c, f6acf14ec, 5f0251c74)
Tempo odtwarzania
ImageIOobsługuje teraz oczekujące zdarzenia podczas czekania na odstęp między ramkami, zamiast usypiać wWFI. (a54790193)Aktualizacje podmodułu MicroPython — pełna obsługa sieci na porcie QEMU,
machine.mem_backupna STM32 przez zapasową pamięć SRAM/rejestry BKP, sprzętowa kontrola przepływu SDIO pozostawiona wyłączona na STM32F4 oraz ponowne wykorzystanie atrybutów MPU dla regionów niebuforowanych. (31ada5626, ab61d27a6, 06bddf13a)differential-translation.pyprzechwytuje obrazy przez swój obiektcsi.CSIzamiast przestarzałego modułusensor, a odstępy w importach w przykładach zostały ujednolicone. (68c866e7f, 9ceff4513)
Poprawki błędów#
Kamera i sensory:
Ustawienie dwóch niestandardowych rozdzielczości
(w, h)z rzędu pozostawiało sensor przy pierwszym rozmiarze, podczas gdycsi.CSI.width()/height()raportowały drugi; szybka ścieżka „bez zmian” wyklucza teraz rozmiary niestandardowe. (cfbb70156)csi.CSI.lens_correction()parsowałaradiicoefjako wartości logiczne, więc wartości przekazywane do sterownika nie były tymi, które podano. (ab44b3a77)PAG7936: ustawianie ekspozycji i wzmocnienia jedno po drugim wzajemnie się nadpisywało (oba współdzielą jeden tryb ręczny, a rejestry odczytu zwrotnego są opóźnione o jedną ramkę); sterownik inicjalizuje teraz rejestry ręczne tylko przy wejściu w tryb ręczny i zapisuje wyłącznie ustawiany parametr. (e7a18c0a0)
Przechwytywanie BAYER z PAG7936 i PS5520 na OpenMV N6 kończyło się błędem „Failed to initialize the CSI interface” przy każdym rozmiarze innym niż pełna rozdzielczość, ponieważ ISP w N6 nie potrafi przeskalować surowych danych Bayer. Sensory pracują teraz w trybie natywnym odpowiadającym żądanemu rozmiarowi dla BAYER (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA nie ma trybu natywnego i nie jest obsługiwane). (fe6790055, b7622b245)
Kodowanie i zapisywanie obrazów:
Programowy enkoder JPEG: przepełnienie bufora wyjściowego było zawsze krytyczne, ponieważ ścieżka realloc była wyłączona; teraz powiększa bufor (każdorazowo o połowę jego rozmiaru), gdy jest jego właścicielem, czysto wycofuje się, gdy zabraknie pamięci, i przycina wynik.
jpeg_write/mjpeg_writenie zapisują już bufora po nieudanym kodowaniu. (28e1110be)Sprzętowe enkodery JPEG (STM32): przepełnienie zwracało częściowo zakodowany obraz o rozmiarze alokacji, tworząc obcięte pliki bez znacznika EOI (np. zrzut 5 MP przy jakości 100 z pustą dolną połową). Teraz zgłaszają przepełnienie, zwalniają bufor w przypadku niepowodzenia i przycinają go w przypadku powodzenia. (22ce9619c)
Enkoder VC8000 po cichu generował chrominancję 4:2:0 dla każdego żądania; podpróbkowanie inne niż 4:2:0 korzysta teraz awaryjnie z kodeka sprzętowego, który je obsługuje. (71f2be7f2)
image.Image.save()obrazu PNG jako.jpgzapisywało do 1 MB niezainicjalizowanej sterty, a obrazu JPEG jako.pngzapisywało pusty plik. Oba przypadki zgłaszają teraz wyjątek; obraz już w formacie docelowym jest nadal kopiowany bez zmian. (6c1fdf822)png_writesprawdza teraz wartość zwracaną przez kompresor i kompresuje przed utworzeniem pliku, więc niepowodzenie nie pozostawia już pustego pliku. (557f52d66)
Moduł image:
image.Image.get_pixel()zrgbtuple=Truena obrazach BAYER i YUV zapisywało przekonwertowany piksel poza zmienną lokalną na stosie, pod przesunięciem kontrolowanym przez wywołującego. (13f2a17b6)gif.Gif.add_frame()pozbyła się nieosiągalnej gałęzi konwersji Bayer/YUV; akceptowane są tylko obrazy GRAYSCALE i RGB565, co API Pythona już wcześniej wymuszało. (f20d99d96)
Protokół:
Rejestrowanie dynamicznego kanału, gdy wszystkie gniazda były już zajęte, powodowało zapis poza zakresem; identyfikator kanału jest teraz sprawdzany najpierw, a zarezerwowane identyfikatory kanałów są statycznie weryfikowane pod kątem zmieszczenia się w tabeli kanałów. (68f635d1f)
Obiekty dynamicznych kanałów przetrwały miękki reset we wskaźnikach korzeniowych, więc GC nadal skanował nieaktualne bloki sterty z poprzedniego uruchomienia; tabela jest teraz czyszczona przy inicjalizacji. (ef0ebb03b, e23641145)
Porty:
i.MX RT: dodano brakującą deinicjalizację CAN i Encoder przy miękkim resecie. (7cb9d3dc2)
Sprzęt i obsługa płytek#
OpenMV N6 — CAN jest teraz włączony (
machine.CAN). (294f0febd, 91e1c9573)OpenMV AE3 — sterownik SPI
sdcardjest zamrożony w oprogramowaniu dla gniazda microSD na nakładce akumulatorowej AE3. (a258f4814)OpenMV RT1062 — zamrożono
lora-sx126x/lora-sync/lora-async(zobacz Nowe funkcje).FLIR Lepton 3.1R / UW — rozpoznawane przez sterownik Leptona na wszystkich płytkach obsługujących Lepton.
PAG7936 — zatrzymanie z bezpiecznym wyłączaniem, wybór interfejsu w czasie działania, poprawka ekspozycji/wzmocnienia oraz przechwytywanie BAYER na N6.
PS5520 — przechwytywanie BAYER na N6 w rozmiarach natywnych.
Symulator (MPS2_AN500) — obsługa sieci.
Wszystkie płytki — moduł zgodności
sensorjest zamrożony w manifeście każdej płytki.
Niezgodne wstecz zmiany w API#
v5.0.1 nie wprowadza żadnych niezgodnych wstecz zmian w API csi ani image. Skrypty, które działały na v5.0.0, działają bez zmian, z następującymi zmianami zachowania.
Moduł sensor (behavior)#
Natywny moduł sensor (modules/py_csi.c) został usunięty i zastąpiony zamrożonym modułem Pythona, który implementuje to samo API na bazie csi. Zobacz sensor.
Commit: 5e3d40631
import sensorwypisuje w terminalu komunikatWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..Ukryty obiekt
csi.CSIjest tworzony przy imporcie, więc brak kamery zgłasza teraz błąd przyimport sensor, a nie przysensor.reset().Te funkcje zgłaszają teraz
OSError, ponieważcsinie ma ich odpowiedników:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (Dwie funkcje*_extra_fbzgłaszały wyjątek już w v5.0.0.) Dla dwóch ostatnich użyjcsi.CSI(delays=False)/csi.CSI(fflush=False).Rozmiary ramek, których
csinie eksportuje (QQCIF,QQSIF,QQQQVGA,HQQQQVGA,HQQQVGA,HQQVGA,B64X32,B64X64,B128X64,B128X128,B160X160,B320X320,LCD,QQVGA2), są teraz krotkami(w, h)przekazywanymi dalej jako niestandardowe rozdzielczości.get_framesize()zwraca ustawioną krotkę, dopóki kamera nadal ma ten rozmiar, dzięki czemu porównania ze stałymi nadal działają.ioctl()przekazuje dalej co najwyżej cztery argumenty po żądaniu.sleep()/shutdown()zgłaszająOSErrorw przypadku niepowodzenia, tak jak wcześniej (RuntimeErrorzcsijest tłumaczony).
Przejdź na csi — zobacz tabelę migracji v5.0.0.
Wczytywanie obrazów do bufora ramki (behavior)#
Funkcje, które wczytują obraz do bufora ramki — image.Image z copy_to_fb=True, image.Image.copy() / image.Image.scale() oraz konwersje to_* z copy_to_fb=True, image.ImageIO.read(), fir.snapshot() i tof.snapshot() z copy_to_fb=True — dotychczas wypychały nowy obraz do podglądu IDE natychmiast, więc wszystko, co narysowano na zwróconym obrazie, nigdy nie było widoczne. Teraz oznaczają bufor ramki jako oczekujący i wypychają go, wraz ze wszystkim, co na nim narysowano, tuż przed nadpisaniem go przez następny obraz — to samo zachowanie co csi.CSI.snapshot().
Commity: 87b6db5ee, 7b1a35c2f, f773c740d
Pętle odczytujące strumień obrazów nie wymagają zmian i pokazują teraz swoje rysunki. Skrypt, który wczytuje pojedynczy obraz i kończy działanie, musi jawnie go wypchnąć:
img = image.Image("example.bmp", copy_to_fb=True)
img.flush() # new: send it to the IDE preview now
time.sleep_ms(1000)
Biblioteka ML (behavior)#
Dotyczy wyłącznie kodu, który dziedziczy po dostarczonych postprocesorach lub je kopiuje. YoloV8 transponuje teraz wyjście modelu po progowaniu, dzięki czemu pozostałe wykrycia są przechowywane po jednym wierszu na ramkę (bb[:, 4:]), zgodnie z postprocesorami Darknet i Edge Impulse, zamiast po jednej kolumnie na ramkę (bb[4:, :]). Publiczne wyniki ((x, y, w, h), score) pozostają bez zmian.
Moduł protocol (minor)#
protocol.poll() powraca. v5.0.0 usunęło tę funkcję, gdy zadanie protokołu zostało przeniesione do timera; wraca jako jawny sposób sterowania zadaniem dla niestandardowych transportów. Nic więcej się nie zmieniło — skrypty, które nigdy jej nie wywoływały, nie są dotknięte.
Commit: c00c215f9
Budowanie / narzędzia (tooling)#
Nic z tego nie dotyczy skryptów MicroPython. py_image.c został podzielony: obiekty deskryptorów (kaskada, punkty kluczowe, LBP, dopasowanie punktów kluczowych) przeniesiono do py_image_descriptor.c, a obiekty statystyk (podobieństwo, statystyki, percentyl, próg, histogram) do py_image_stats.c. API enkoderów imlib zostało ujednolicone z resztą imlib: jpeg_compress / png_compress zwracają 0 w przypadku powodzenia i -1 w przypadku błędu, a jpeg_compress stracił argument realloc (zmiana rozmiaru jest uzależniona od własności bufora). OMV_PROTOCOL_MAX_CHANNELS stało się OMV_PROTOCOL_CHANNEL_MAX w omv_protocol_channel.h, a porty wywołują teraz py_protocol_init0() przy inicjalizacji. Definicja płytki OMV_PAG7936_MIPI_CSI2 zniknęła (interfejs jest wybierany w czasie działania). Całość dopełniają podbicia zależności CI oraz poprawka pustego changelogu wydania. Szczegóły istotne dla forków znajdziesz w historii repozytorium oprogramowania układowego.
Lista kontrolna migracji#
Nadal używasz
import sensor? Działa, z ostrzeżeniem. Przejdź nacsi(migracja v5.0.0); zastąpdisable_delays/disable_full_flushargumentami konstruktoracsi.CSI()i usuń wywołaniaget_fb/ automatycznego obracania.Wczytujesz pojedynczy obraz z
copy_to_fb=Truei oczekujesz, że go zobaczysz? Dodajimg.flush()po wczytaniu.Skopiowałeś postprocesor YOLOv8? Indeksuj sprogowane wyjście według wierszy (
bb[:, 4:]), a nie według kolumn.Porównujesz
csi0.framesize()po ustawieniu krotki? Zwraca terazcsi.CUSTOM.Cała reszta: wgraj ponownie oprogramowanie i uruchom.