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
sensorkini merupakan modul Python beku yang dibangun di atascsi. Modul ini mencetak peringatan deprekasi saat diimpor; beberapa fungsi yang tidak dapat didukung modulcsikini memunculkanOSError. 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) untukprotocol.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 contohyolo_pro_detector.py. (f3f150ebd, ea7bbb398)protocol.poll()— menjalankan satu iterasi tugas protokol sesuai permintaan, untuk transport kustom yang tidak digerakkan oleh interupsi USB atau timerpoll_ms.protocol.init()juga dapat dipanggil lagi untuk menginisialisasi ulang tumpukan. (c00c215f9, f849ffb1b)Lebih banyak widget kanal CBOR —
protocol.CBORChannel.add()mendapattext(string statis),lineedit(string yang dapat ditulis),pushbutton(aksi sesaat),spinbox(entri numerik bertahap),radio(grup opsi) danwaveform(deret waktu 1D dengan argumensample_rate,seriesdantypecode; 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_AN500kini memiliki lwIP dan NIC mode pengguna, denganrequests,mqttdansensoryang dibekukan di dalamnya, serta unit test jaringan. (23546dfb1, 61d187305, 15096c3a2)Contoh API yang kompatibel dengan OpenAI —
openai_compatible.pymengambil snapshot JPEG dan mengirimkannya ke endpoint chat-completions untuk deskripsi pemandangan. (79033c6aa)Contoh LoRa SX126x — driver
lora-sx126xdari micropython-lib (denganlora-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, argumentimeout(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, dictheadersmilik pemanggil disalin (sehinggaauthtidak lagi bocor ke permintaan berikutnya), dan isi dibaca per blok ke dalambytearray. (889f0b096)mqttmengimporsslsecara 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
ImageIOkini melayani event yang tertunda selama menunggu interval antar-bingkai alih-alih tidur dalamWFI. (a54790193)Pembaruan submodul MicroPython — dukungan jaringan penuh pada port QEMU,
machine.mem_backuppada 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.pymenangkap melalui objekcsi.CSImiliknya alih-alih modulsensoryang 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 sementaracsi.CSI.width()/height()melaporkan yang kedua; jalur cepat "tidak ada perubahan" kini mengecualikan ukuran kustom. (cfbb70156)csi.CSI.lens_correction()mem-parsingradidancoefsebagai 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_writetidak 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.jpgmenulis hingga 1 MB heap yang belum diinisialisasi, dan pada citra JPEG sebagai.pngmenulis file kosong. Keduanya kini memunculkan exception; citra yang sudah dalam format target tetap disalin apa adanya. (6c1fdf822)png_writekini memeriksa nilai kembalian kompresor dan mengompresi sebelum membuat file, sehingga kegagalan tidak lagi meninggalkan file kosong. (557f52d66)
Modul image:
image.Image.get_pixel()denganrgbtuple=Truepada 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
sdcarddibekukan ke dalam firmware untuk soket microSD pada AE3 Battery Shield. (a258f4814)OpenMV RT1062 —
lora-sx126x/lora-sync/lora-asyncdibekukan 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
sensordibekukan 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 sensormencetakWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead.ke terminal.Objek
csi.CSItersembunyi dibuat saat impor, sehingga kamera yang tidak ada kini memunculkan error padaimport sensordan bukan padasensor.reset().Fungsi-fungsi ini kini memunculkan
OSErrorkarenacsitidak memiliki padanannya:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (Kedua fungsi*_extra_fbsudah memunculkan error di v5.0.0.) Gunakancsi.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()memunculkanOSErrorsaat gagal seperti sebelumnya (RuntimeErrordaricsiditerjemahkan).
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.
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 kecsi(migrasi v5.0.0); gantidisable_delays/disable_full_flushdengan argumen konstruktorcsi.CSI()dan hapus panggilanget_fb/ auto-rotation.Memuat satu citra dengan
copy_to_fb=Truedan berharap melihatnya? Tambahkanimg.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 mengembalikancsi.CUSTOM.Selebihnya: flash ulang dan jalankan.