v5.0.1#

v5.0.1 är en underhållsutgåva ovanpå v5.0.0 — den äldre sensor-modulen blir ett Python-kompatibilitetslager över csi, bilder som läses in i bildbufferten förhandsvisas nu som kamerabildrutor, JPEG-kodarna blir av med sin utdatagräns på 1 MB och hanterar överskridande korrekt, och det finns en uppsättning fixar för kamera, protokoll, nätverk och ML-biblioteket. Den medför inga brytande API-ändringar för skript skrivna mot csi; de få beteendeändringarna listas under brytande API-ändringar.

Höjdpunkter#

  • Modulen sensor är nu en fryst Python-modul byggd på csi. Den skriver ut en varning om att den är föråldrad vid import; några få funktioner som csi-modulen inte kan stödja utlöser nu OSError. Se ändringarna i sensor-modulen.

  • Inlästa bilder förhandsvisas som kamerabildrutor. En bild som placeras i bildbufferten med copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) skrivs ut till IDE:n — med allt som ritats på den — när nästa bild skriver över bildbufferten, i stället för omedelbart. Se ändringarna i förhandsvisningen.

  • Översyn av JPEG-kodarna. Taket på 1 MB för utdatabufferten är borta (bufferten dimensioneras efter ledigt minne), överskridande hanteras på både mjukvaru- och hårdvaruvägen i stället för att trunkerade filer skrivs, och att spara en komprimerad bild under den andra komprimerade filändelsen utlöser ett fel i stället för att skriva skräp.

  • Ny protocol.poll() och sex nya CBOR-widgetar (text, lineedit, pushbutton, spinbox, radio, waveform) för protocol.CBORChannel.

  • YOLO Pro-efterbehandlare, stöd för FLIR Lepton 3.1R / UW, IMU-blockläsningar, CAN på OpenMV N6 och ett nätverkskapabelt simulatormål.

Nya funktioner#

  • YoloPro — en ny efterbehandlare för Edge Impulse YOLO Pro-modeller för objektdetektering, plus ett yolo_pro_detector.py-exempel. (f3f150ebd, ea7bbb398)

  • protocol.poll() — kör en iteration av protokolluppgiften på begäran, för anpassade transporter som inte drivs av USB-avbrottet eller poll_ms-timern. protocol.init() kan också anropas igen för att initiera om stacken. (c00c215f9, f849ffb1b)

  • Fler CBOR-kanalwidgetar — protocol.CBORChannel.add() får text (statisk sträng), lineedit (skrivbar sträng), pushbutton (momentan åtgärd), spinbox (stegvis numerisk inmatning), radio (alternativgrupp) och waveform (1D-tidsserie med argumenten sample_rate, series och typecode; tilldela sammanflätade sampelbyte för att strömma den). (8016d29ba)

  • csi.CUSTOM — csi.CSI.framesize() returnerar nu en användbar konstant efter att en anpassad (w, h)-upplösning har satts, i stället för ett anonymt heltal. (af8841654)

  • IMU-blockläsning — imu.__read_reg() tar emot en valfri skrivbar buffert och fyller den från på varandra följande register i en enda transaktion. (244ca480a)

  • FLIR Lepton 3.1R och Lepton UW känns igen av Lepton-drivrutinen, inklusive deras radiometriska förstärkningslägen. (0fc356632)

  • Nätverk i simulatorn — QEMU-målet MPS2_AN500 har nu lwIP och ett NIC i användarläge, med requests, mqtt och sensor infrusna, samt ett nätverksenhetstest. (23546dfb1, 61d187305, 15096c3a2)

  • Exempel på OpenAI-kompatibelt API — openai_compatible.py tar en JPEG-snapshot och postar den till en chat-completions-ändpunkt för scenbeskrivning. (79033c6aa)

  • SX126x LoRa-exempel — micropython-libs lora-sx126x-drivrutin (med lora-sync / lora-async) är infryst i firmwaren för OpenMV RT1062, med exempel för sändare/mottagare/ping-pong/bildströmning för att koppla en SX1261- eller SX1262-modul till SPI-bussen. Detta är stöd som bidragits av communityn; OpenMV säljer ingen LoRa-hårdvara. (19576e1b1)

Övriga ändringar och förbättringar#

  • Omskrivning av biblioteket requests — svar med chunked transfer avkodas, ett timeout-argument (standard 5 s) exponeras, JSON- och strängkroppar serialiseras/kodas korrekt, huvuden tolkas skiftlägesokänsligt och statusraden efter position, anroparens headers-dict kopieras (så att auth inte längre läcker in i senare begäranden), och kroppen läses blockvis in i en bytearray. (889f0b096)

  • mqtt importerar ssl lat, så modulen och vanliga (icke-TLS-) anslutningar fungerar på byggen utan SSL-stöd. (c2e0899e8)

  • JPEG-utdatabufferten dimensioneras efter ledigt minne i stället för ett fast tak på 1 MB; kodarna trimmar bufferten till den kodade storleken innan bilden skrivs ut, så att bildtagningar från stora sensorer i hög kvalitet inte längre misslyckas. (aa1ca6776)

  • Upprensning av ML-efterbehandlingen — genereringen av begränsningsrutor är standardiserad över efterbehandlarna för Darknet, Edge Impulse och Ultralytics, och YOLOv8-utdata transponeras efter tröskling så att de lagras med en rad per detektering som de övriga modellerna. (b5c7853f2, c45f99cad)

  • Säker avstängning av PAG7936 — en ny stoppflagga för sensorn försätter PAG7936 i viloläge innan RESET/PWDN växlas, vilket åtgärdar låsningar när sensorn används på en förlängningskabel. Drivrutinen väljer också sin registeruppsättning för MIPI CSI-2 eller parallellt gränssnitt utifrån sensorns I2C-adress vid körning i stället för vid byggtid. (10026530c, f6acf14ec, 5f0251c74)

  • Takthållningen vid ImageIO-uppspelning betjänar nu väntande händelser medan den väntar på intervallet mellan bildrutor i stället för att sova i WFI. (a54790193)

  • Uppdateringar av MicroPython-undermodulen — fullt nätverksstöd på QEMU-porten, machine.mem_backup på STM32 via backup-SRAM/BKP-register, SDIO-hårdvaruflödeskontroll fortsatt avstängd på STM32F4, och återanvändning av MPU-attribut för icke-cachebara regioner. (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py tar bilder via sitt csi.CSI-objekt i stället för den föråldrade sensor-modulen, och radavståndet mellan importer i exemplen normaliserades. (68c866e7f, 9ceff4513)

Felrättningar#

Kamera och sensorer:

  • Att sätta två anpassade (w, h)-upplösningar i rad lämnade sensorn på den första storleken medan csi.CSI.width() / height() rapporterade den andra; snabbvägen för ”ingen ändring” utesluter nu anpassade storlekar. (cfbb70156)

  • csi.CSI.lens_correction() tolkade radi och coef som booleaner, så värdena som skickades till drivrutinen var inte de som angavs. (ab44b3a77)

  • PAG7936: att sätta exponering och förstärkning direkt efter varandra gjorde att de skrev över varandra (båda delar ett manuellt läge och de återlästa registren ligger en bildruta efter); drivrutinen fyller nu i de manuella registren bara när manuellt läge aktiveras och skriver enbart den kontroll som sätts. (e7a18c0a0)

  • BAYER-bildtagning med PAG7936 och PS5520 på OpenMV N6 misslyckades med ”Failed to initialize the CSI interface” vid alla storlekar utom full upplösning, eftersom N6:ans ISP inte kan skala om rå Bayer. Sensorerna körs nu i ett inbyggt läge som matchar den begärda storleken för BAYER (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA saknar inbyggt läge och stöds inte). (fe6790055, b7622b245)

Bildkodning och sparande:

  • JPEG-kodaren i mjukvara: överskridande av utdatabufferten var alltid fatalt eftersom realloc-vägen var avstängd; den växer nu bufferten (med halva dess storlek åt gången) när den äger den, faller tillbaka rent när minnet tar slut och trimmar resultatet. jpeg_write / mjpeg_write skriver inte längre ut bufferten efter en misslyckad kodning. (28e1110be)

  • JPEG-kodarna i hårdvara (STM32): överskridande returnerade en delvis kodad bild med allokeringsstorleken, vilket gav trunkerade filer utan EOI-markör (t.ex. en 5 MP-bild i kvalitet 100 med tom nedre halva). De rapporterar nu överskridande, frigör bufferten vid fel och trimmar den vid framgång. (22ce9619c)

  • VC8000-kodaren producerade tyst 4:2:0-kroma för varje begäran; annan delsampling än 4:2:0 faller nu tillbaka till den HW-codec som stöder den. (71f2be7f2)

  • image.Image.save() av en PNG-bild som .jpg skrev upp till 1 MB oinitierad heap, och av en JPEG-bild som .png skrev en tom fil. Båda utlöser nu ett fel; en bild som redan är i målformatet kopieras fortfarande som den är. (6c1fdf822)

  • png_write kontrollerar nu komprimerarens returvärde och komprimerar innan filen skapas, så att ett fel inte längre lämnar en tom fil efter sig. (557f52d66)

Image-modulen:

  • image.Image.get_pixel() med rgbtuple=True på BAYER- och YUV-bilder skrev den konverterade pixeln förbi en lokal stackvariabel vid ett anroparstyrt offset. (13f2a17b6)

  • gif.Gif.add_frame() blev av med en onåbar Bayer/YUV-konverteringsgren; endast GRAYSCALE- och RGB565-bilder accepteras, vilket Python-API:et redan krävde. (f20d99d96)

Protokoll:

  • Att registrera en dynamisk kanal när alla platser redan var upptagna orsakade en skrivning utanför gränserna; kanal-ID:t kontrolleras nu först, och de reserverade kanal-ID:na kontrolleras statiskt så att de ryms i kanaltabellen. (68f635d1f)

  • Dynamiska kanalobjekt överlevde en mjuk omstart i rotpekarna, så GC:n fortsatte skanna inaktuella heapblock från den föregående körningen; tabellen rensas nu vid init. (ef0ebb03b, e23641145)

Portar:

  • i.MX RT: lade till den saknade avinitieringen av CAN och Encoder vid mjuk omstart. (7cb9d3dc2)

Hårdvaru- och kortstöd#

  • OpenMV N6 — CAN är nu aktiverat (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — SPI-drivrutinen sdcard är infryst för microSD-sockeln på AE3 Battery Shield. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async infrusna (se Nya funktioner).

  • FLIR Lepton 3.1R / UW — känns igen av Lepton-drivrutinen på alla kort med Lepton-stöd.

  • PAG7936 — stopp för säker avstängning, val av gränssnitt vid körning, fix för exponering/förstärkning och BAYER-bildtagning på N6.

  • PS5520 — BAYER-bildtagning på N6 i inbyggda storlekar.

  • Simulator (MPS2_AN500) — nätverk.

  • Alla kort — kompatibilitetsmodulen sensor är infryst i varje korts manifest.

Brytande API-ändringar#

v5.0.1 medför inga brytande ändringar i API:erna för csi eller image. Skript som kördes på v5.0.0 körs oförändrade, med följande beteendeändringar.

sensor-modulen (behavior)#

Den inbyggda sensor-modulen (modules/py_csi.c) togs bort och ersattes av en fryst Python-modul som implementerar samma API ovanpå csi. Se sensor.

Commit: 5e3d40631

  • import sensor skriver ut WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead. i terminalen.

  • Det dolda csi.CSI-objektet skapas vid import, så en saknad kamera utlöser nu ett fel vid import sensor i stället för vid sensor.reset().

  • Dessa funktioner utlöser nu OSError eftersom csi saknar motsvarighet: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (De två *_extra_fb-funktionerna utlöste redan fel i v5.0.0.) Använd csi.CSI(delays=False) / csi.CSI(fflush=False) för de två sista.

  • Bildstorlekar som csi inte exporterar (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) är nu (w, h)-tupler som skickas vidare som anpassade upplösningar. get_framesize() returnerar tupeln som sattes så länge kameran fortfarande har den storleken, så att likhetsjämförelser mot konstanterna fortsätter att fungera.

  • ioctl() vidarebefordrar högst fyra argument efter begäran.

  • sleep() / shutdown() utlöser OSError vid fel som tidigare (csi-modulens RuntimeError översätts).

Migrera till csi — se migreringstabellen för v5.0.0.

Inläsning av bilder i bildbufferten (behavior)#

Funktioner som läser in en bild i bildbufferten — image.Image med copy_to_fb=True, image.Image.copy() / image.Image.scale() och to_*-konverteringarna med copy_to_fb=True, image.ImageIO.read(), fir.snapshot() och tof.snapshot() med copy_to_fb=True — brukade skicka den nya bilden till IDE-förhandsvisningen omedelbart, så att allt som ritades på den returnerade bilden aldrig syntes. De markerar nu bildbufferten som väntande och skriver ut den, med allt som ritats på den, precis innan nästa bild skriver över den — samma beteende som csi.CSI.snapshot().

Commits: 87b6db5ee, 7b1a35c2f, f773c740d

Loopar som läser en ström av bilder behöver ingen ändring och visar nu sina ritningar. Ett skript som läser in en enskild bild och stannar måste skriva ut den uttryckligen:

img = image.Image("example.bmp", copy_to_fb=True)
img.flush()          # new: send it to the IDE preview now
time.sleep_ms(1000)

ML-bibliotek (behavior)#

Påverkar bara kod som ärver från eller kopierar de medföljande efterbehandlarna. YoloV8 transponerar nu modellens utdata efter tröskling så att kvarvarande detekteringar lagras med en rad per ruta (bb[:, 4:]), i likhet med efterbehandlarna för Darknet och Edge Impulse, i stället för en kolumn per ruta (bb[4:, :]). De publika ((x, y, w, h), score)-resultaten är oförändrade.

Commits: c45f99cad, b5c7853f2

protocol-modulen (minor)#

protocol.poll() är tillbaka. v5.0.0 tog bort den när protokolluppgiften flyttades till timern; den återkommer som ett uttryckligt sätt att driva uppgiften för anpassade transporter. Inget annat ändrades — skript som aldrig anropade den påverkas inte.

Commit: c00c215f9

Bygg / verktyg (tooling)#

Inget av detta påverkar MicroPython-skript. py_image.c delades upp, där deskriptorobjekten (cascade, keypoints, LBP, keypoint match) flyttades till py_image_descriptor.c och statistikobjekten (similarity, statistics, percentile, threshold, histogram) till py_image_stats.c. Imlib-kodar-API:et anpassades till resten av imlib: jpeg_compress / png_compress returnerar 0 vid framgång och -1 vid fel, och jpeg_compress blev av med sitt realloc-argument (storleksändring styrs av buffertägarskap). OMV_PROTOCOL_MAX_CHANNELS blev OMV_PROTOCOL_CHANNEL_MAX i omv_protocol_channel.h, och portarna anropar nu py_protocol_init0() vid init. Kortdefinitionen OMV_PAG7936_MIPI_CSI2 är borta (gränssnittet väljs vid körning). CI-beroendeuppdateringar och en fix för tomma utgåvechangeloggar avrundar det hela. Se historiken i firmware-arkivet för detaljer som är relevanta för forkar.

Migreringschecklista#

  • Kör du fortfarande import sensor? Det fungerar, med en varning. Gå över till csi (v5.0.0-migreringen); ersätt disable_delays / disable_full_flush med konstruktorargumenten till csi.CSI() och ta bort get_fb- / autorotationsanrop.

  • Läser du in en enskild bild med copy_to_fb=True och förväntar dig att se den? Lägg till img.flush() efter inläsningen.

  • Har du kopierat YOLOv8-efterbehandlaren? Indexera de trösklade utdata radvis (bb[:, 4:]) i stället för kolumnvis.

  • Jämför du csi0.framesize() efter att ha satt en tupel? Den returnerar nu csi.CUSTOM.

  • Allt annat: flasha om och kör.