v5.0.1#

v5.0.1 adalah rilis pemeliharaan di atas v5.0.0 — modul sensor lama menjadi lapisan kompatibilitas Python di atas csi, citra yang dimuat ke buffer bingkai kini ditampilkan di pratinjau seperti bingkai kamera, encoder JPEG tidak lagi dibatasi output 1 MB dan menangani overflow dengan benar, dan ada sekumpulan perbaikan kamera, protokol, jaringan, dan pustaka ML. Rilis ini tidak membawa perubahan API yang merusak kompatibilitas untuk skrip yang ditulis terhadap csi; beberapa perubahan perilaku tercantum di bawah perubahan API yang merusak kompatibilitas.

Sorotan#

  • Modul sensor kini merupakan modul Python beku yang dibangun di atas csi. Modul ini mencetak peringatan deprekasi saat diimpor; beberapa fungsi yang tidak dapat didukung modul csi kini memunculkan OSError. Lihat perubahan modul sensor.

  • Citra yang dimuat ditampilkan di pratinjau seperti bingkai kamera. Citra yang ditempatkan di buffer bingkai dengan copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()) di-flush ke IDE — bersama apa pun yang digambar di atasnya — ketika citra berikutnya menimpa buffer bingkai, bukan seketika. Lihat perubahan pratinjau.

  • Perombakan encoder JPEG. Batas buffer output 1 MB dihilangkan (ukuran buffer ditentukan dari memori bebas), overflow pada jalur perangkat lunak maupun perangkat keras ditangani alih-alih menulis file terpotong, dan menyimpan citra terkompresi dengan ekstensi terkompresi lainnya kini memunculkan exception alih-alih menulis data sampah.

  • protocol.poll() baru dan enam widget CBOR baru (text, lineedit, pushbutton, spinbox, radio, waveform) untuk protocol.CBORChannel.

  • Post-processor YOLO Pro, dukungan FLIR Lepton 3.1R / UW, pembacaan burst IMU, CAN pada OpenMV N6, dan target simulator dengan kemampuan jaringan.

Fitur baru#

  • YoloPro — post-processor baru untuk model deteksi objek YOLO Pro dari Edge Impulse, beserta contoh yolo_pro_detector.py. (f3f150ebd, ea7bbb398)

  • protocol.poll() — menjalankan satu iterasi tugas protokol sesuai permintaan, untuk transport kustom yang tidak digerakkan oleh interupsi USB atau timer poll_ms. protocol.init() juga dapat dipanggil lagi untuk menginisialisasi ulang tumpukan. (c00c215f9, f849ffb1b)

  • Lebih banyak widget kanal CBOR — protocol.CBORChannel.add() mendapat text (string statis), lineedit (string yang dapat ditulis), pushbutton (aksi sesaat), spinbox (entri numerik bertahap), radio (grup opsi) dan waveform (deret waktu 1D dengan argumen sample_rate, series dan typecode; tetapkan byte sampel yang di-interleave untuk melakukan streaming). (8016d29ba)

  • csi.CUSTOM — csi.CSI.framesize() kini mengembalikan konstanta yang dapat digunakan setelah resolusi (w, h) kustom diatur, bukan integer anonim. (af8841654)

  • Pembacaan burst IMU — imu.__read_reg() menerima buffer opsional yang dapat ditulis dan mengisinya dari register berurutan dalam satu transaksi. (244ca480a)

  • FLIR Lepton 3.1R dan Lepton UW dikenali oleh driver Lepton, termasuk mode gain radiometriknya. (0fc356632)

  • Jaringan simulator — target QEMU MPS2_AN500 kini memiliki lwIP dan NIC mode pengguna, dengan requests, mqtt dan sensor yang dibekukan di dalamnya, serta unit test jaringan. (23546dfb1, 61d187305, 15096c3a2)

  • Contoh API yang kompatibel dengan OpenAI — openai_compatible.py mengambil snapshot JPEG dan mengirimkannya ke endpoint chat-completions untuk deskripsi pemandangan. (79033c6aa)

  • Contoh LoRa SX126x — driver lora-sx126x dari micropython-lib (dengan lora-sync / lora-async) dibekukan ke dalam firmware OpenMV RT1062, dengan contoh pengirim/penerima/ping-pong/stream citra untuk menyambungkan modul SX1261 atau SX1262 ke bus SPI. Ini adalah dukungan kontribusi komunitas; OpenMV tidak menjual perangkat keras LoRa. (19576e1b1)

Perubahan dan peningkatan lainnya#

  • Penulisan ulang pustaka requests — respons chunked transfer didekode, argumen timeout (default 5 s) diekspos, isi JSON dan string diserialisasi/di-encode dengan benar, header di-parsing tanpa membedakan huruf besar/kecil dan baris status berdasarkan posisi, dict headers milik pemanggil disalin (sehingga auth tidak lagi bocor ke permintaan berikutnya), dan isi dibaca per blok ke dalam bytearray. (889f0b096)

  • mqtt mengimpor ssl secara lazy, sehingga modul ini dan koneksi biasa (non-TLS) berfungsi pada build tanpa dukungan SSL. (c2e0899e8)

  • Ukuran buffer output JPEG ditentukan dari memori bebas alih-alih batas tetap 1 MB; encoder memangkas buffer ke ukuran hasil encode sebelum citra ditulis, sehingga tangkapan sensor besar pada kualitas tinggi tidak lagi gagal. (aa1ca6776)

  • Pembersihan pasca-pemrosesan ML — pembuatan bounding box distandarkan di seluruh post-processor Darknet, Edge Impulse dan Ultralytics, dan output YOLOv8 ditransposisi setelah thresholding sehingga disimpan satu baris per deteksi seperti model lainnya. (b5c7853f2, c45f99cad)

  • Pematian aman PAG7936 — flag halt sensor baru menidurkan PAG7936 sebelum RESET/PWDN di-toggle, memperbaiki hang ketika sensor digunakan pada kabel ekstensi. Driver juga memilih set register MIPI CSI-2 atau paralelnya dari alamat I2C sensor saat runtime, bukan saat build. (10026530c, f6acf14ec, 5f0251c74)

  • Pengaturan tempo pemutaran ImageIO kini melayani event yang tertunda selama menunggu interval antar-bingkai alih-alih tidur dalam WFI. (a54790193)

  • Pembaruan submodul MicroPython — dukungan jaringan penuh pada port QEMU, machine.mem_backup pada STM32 melalui register backup SRAM/BKP, kontrol aliran perangkat keras SDIO tetap dinonaktifkan pada STM32F4, dan penggunaan ulang atribut MPU untuk wilayah non-cacheable. (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py menangkap melalui objek csi.CSI miliknya alih-alih modul sensor yang sudah tidak digunakan lagi, dan spasi impor pada contoh dinormalisasi. (68c866e7f, 9ceff4513)

Perbaikan bug#

Kamera dan sensor:

  • Mengatur dua resolusi (w, h) kustom berturut-turut membuat sensor tetap pada ukuran pertama sementara csi.CSI.width() / height() melaporkan yang kedua; jalur cepat "tidak ada perubahan" kini mengecualikan ukuran kustom. (cfbb70156)

  • csi.CSI.lens_correction() mem-parsing radi dan coef sebagai boolean, sehingga nilai yang diteruskan ke driver bukan nilai yang diberikan. (ab44b3a77)

  • PAG7936: mengatur eksposur dan gain secara berurutan saling menimpa (keduanya berbagi satu mode manual dan register read-back tertinggal satu bingkai); driver kini hanya mengisi awal register manual saat memasuki mode manual dan hanya menulis kontrol yang sedang diatur. (e7a18c0a0)

  • Tangkapan BAYER PAG7936 dan PS5520 pada OpenMV N6 gagal dengan "Failed to initialize the CSI interface" pada ukuran apa pun selain resolusi penuh, karena ISP N6 tidak dapat menskalakan ulang Bayer mentah. Sensor kini berjalan pada mode native yang sesuai dengan ukuran yang diminta untuk BAYER (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA tidak memiliki mode native dan tidak didukung). (fe6790055, b7622b245)

Encoding dan penyimpanan citra:

  • Encoder JPEG perangkat lunak: overflow buffer output selalu fatal karena jalur realloc dinonaktifkan; kini encoder memperbesar buffer (setengah ukurannya setiap kali) ketika buffer tersebut miliknya, mundur dengan bersih ketika memori habis, dan memangkas hasilnya. jpeg_write / mjpeg_write tidak lagi menulis buffer setelah encode gagal. (28e1110be)

  • Encoder JPEG perangkat keras (STM32): overflow mengembalikan citra yang ter-encode sebagian dengan ukuran alokasi, menghasilkan file terpotong tanpa penanda EOI (misalnya tangkapan 5 MP pada kualitas 100 dengan separuh bawah kosong). Kini encoder melaporkan overflow, membebaskan buffer saat gagal, dan memangkasnya saat berhasil. (22ce9619c)

  • Encoder VC8000 diam-diam menghasilkan chroma 4:2:0 untuk setiap permintaan; subsampling non-4:2:0 kini beralih ke codec HW yang mendukungnya. (71f2be7f2)

  • image.Image.save() pada citra PNG sebagai .jpg menulis hingga 1 MB heap yang belum diinisialisasi, dan pada citra JPEG sebagai .png menulis file kosong. Keduanya kini memunculkan exception; citra yang sudah dalam format target tetap disalin apa adanya. (6c1fdf822)

  • png_write kini memeriksa nilai kembalian kompresor dan mengompresi sebelum membuat file, sehingga kegagalan tidak lagi meninggalkan file kosong. (557f52d66)

Modul image:

  • image.Image.get_pixel() dengan rgbtuple=True pada citra BAYER dan YUV menulis piksel hasil konversi melewati variabel lokal stack pada offset yang dikendalikan pemanggil. (13f2a17b6)

  • gif.Gif.add_frame() menghapus cabang konversi Bayer/YUV yang tidak terjangkau; hanya citra GRAYSCALE dan RGB565 yang diterima, sebagaimana sudah diberlakukan oleh API Python. (f20d99d96)

Protokol:

  • Mendaftarkan kanal dinamis ketika semua slot sudah terpakai menyebabkan penulisan di luar batas; ID kanal kini diperiksa terlebih dahulu, dan ID kanal yang dicadangkan di-assert secara statis agar muat dalam tabel kanal. (68f635d1f)

  • Objek kanal dinamis bertahan setelah soft reset dalam root pointer, sehingga GC terus memindai blok heap usang dari run sebelumnya; tabel kini dibersihkan saat init. (ef0ebb03b, e23641145)

Port:

  • i.MX RT: menambahkan de-inisialisasi CAN dan Encoder yang sebelumnya hilang saat soft reset. (7cb9d3dc2)

Dukungan perangkat keras dan papan#

  • OpenMV N6 — CAN kini diaktifkan (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — driver SPI sdcard dibekukan ke dalam firmware untuk soket microSD pada AE3 Battery Shield. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async dibekukan ke dalam firmware (lihat Fitur baru).

  • FLIR Lepton 3.1R / UW — dikenali oleh driver Lepton pada semua papan yang mendukung Lepton.

  • PAG7936 — halt pematian aman, pemilihan antarmuka saat runtime, perbaikan eksposur/gain, dan tangkapan BAYER pada N6.

  • PS5520 — tangkapan BAYER pada N6 dengan ukuran native.

  • Simulator (MPS2_AN500) — jaringan.

  • Semua papan — modul kompatibilitas sensor dibekukan ke dalam manifest setiap papan.

Perubahan API yang merusak kompatibilitas#

v5.0.1 tidak membawa perubahan yang merusak kompatibilitas pada API csi maupun image. Skrip yang berjalan pada v5.0.0 tetap berjalan tanpa perubahan, dengan perubahan perilaku berikut.

Modul sensor (perilaku)#

Modul sensor native (modules/py_csi.c) dihapus dan digantikan oleh modul Python beku yang mengimplementasikan API yang sama di atas csi. Lihat sensor.

Commit: 5e3d40631

  • import sensor mencetak WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead. ke terminal.

  • Objek csi.CSI tersembunyi dibuat saat impor, sehingga kamera yang tidak ada kini memunculkan error pada import sensor dan bukan pada sensor.reset().

  • Fungsi-fungsi ini kini memunculkan OSError karena csi tidak memiliki padanannya: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (Kedua fungsi *_extra_fb sudah memunculkan error di v5.0.0.) Gunakan csi.CSI(delays=False) / csi.CSI(fflush=False) untuk dua fungsi terakhir.

  • Ukuran bingkai yang tidak diekspor oleh csi (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2) kini berupa tuple (w, h) yang diteruskan sebagai resolusi kustom. get_framesize() mengembalikan tuple yang diatur selama kamera masih pada ukuran tersebut, sehingga pemeriksaan kesetaraan terhadap konstanta tetap berfungsi.

  • ioctl() meneruskan paling banyak empat argumen setelah request.

  • sleep() / shutdown() memunculkan OSError saat gagal seperti sebelumnya (RuntimeError dari csi diterjemahkan).

Migrasikan ke csi — lihat tabel migrasi v5.0.0.

Pemuatan citra ke buffer bingkai (perilaku)#

Fungsi-fungsi yang memuat citra ke buffer bingkai — image.Image dengan copy_to_fb=True, image.Image.copy() / image.Image.scale() dan konversi to_* dengan copy_to_fb=True, image.ImageIO.read(), fir.snapshot() dan tof.snapshot() dengan copy_to_fb=True — sebelumnya langsung mendorong citra baru ke pratinjau IDE, sehingga apa pun yang digambar pada citra yang dikembalikan tidak pernah terlihat. Kini fungsi-fungsi tersebut menandai buffer bingkai sebagai tertunda dan mem-flush-nya, bersama semua yang digambar di atasnya, tepat sebelum citra berikutnya menimpanya — perilaku yang sama seperti csi.CSI.snapshot().

Commit: 87b6db5ee, 7b1a35c2f, f773c740d

Loop yang membaca aliran citra tidak memerlukan perubahan dan kini menampilkan gambarnya. Skrip yang memuat satu citra lalu berhenti harus mem-flush-nya secara eksplisit:

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

Pustaka ML (perilaku)#

Hanya memengaruhi kode yang membuat subkelas dari atau menyalin post-processor bawaan. YoloV8 kini mentransposisi output model setelah thresholding sehingga deteksi yang lolos disimpan satu baris per kotak (bb[:, 4:]), sesuai dengan post-processor Darknet dan Edge Impulse, bukan satu kolom per kotak (bb[4:, :]). Hasil publik ((x, y, w, h), score) tidak berubah.

Commit: c45f99cad, b5c7853f2

Modul protocol (kecil)#

protocol.poll() kembali hadir. v5.0.0 menghapusnya ketika tugas protokol dipindahkan ke timer; fungsi ini kembali sebagai cara eksplisit untuk menggerakkan tugas tersebut bagi transport kustom. Tidak ada hal lain yang berubah — skrip yang tidak pernah memanggilnya tidak terpengaruh.

Commit: c00c215f9

Build / tooling (tooling)#

Tidak ada yang memengaruhi skrip MicroPython. py_image.c dipecah, dengan objek deskriptor (cascade, keypoints, LBP, keypoint match) dipindahkan ke py_image_descriptor.c dan objek statistik (similarity, statistics, percentile, threshold, histogram) ke py_image_stats.c. API encoder imlib diselaraskan dengan bagian imlib lainnya: jpeg_compress / png_compress mengembalikan 0 jika berhasil dan -1 jika error, dan jpeg_compress kehilangan argumen realloc-nya (pengubahan ukuran dibatasi oleh kepemilikan buffer). OMV_PROTOCOL_MAX_CHANNELS menjadi OMV_PROTOCOL_CHANNEL_MAX di omv_protocol_channel.h, dan port kini memanggil py_protocol_init0() saat init. Define papan OMV_PAG7936_MIPI_CSI2 dihilangkan (antarmuka dipilih saat runtime). Pembaruan dependensi CI dan perbaikan changelog rilis kosong melengkapinya. Lihat riwayat repositori firmware untuk detail yang relevan bagi fork.

Daftar periksa migrasi#

  • Masih menggunakan import sensor? Masih berfungsi, dengan peringatan. Beralihlah ke csi (migrasi v5.0.0); ganti disable_delays / disable_full_flush dengan argumen konstruktor csi.CSI() dan hapus panggilan get_fb / auto-rotation.

  • Memuat satu citra dengan copy_to_fb=True dan berharap melihatnya? Tambahkan img.flush() setelah memuat.

  • Menyalin post-processor YOLOv8? Indeks output hasil thresholding berdasarkan baris (bb[:, 4:]), bukan berdasarkan kolom.

  • Membandingkan csi0.framesize() setelah mengatur tuple? Kini mengembalikan csi.CUSTOM.

  • Selebihnya: flash ulang dan jalankan.