v5.0.0

v5.0.0 adalah rilis besar. Fitur utamanya: OpenMV Protocol V2 yang dibangun ulang untuk koneksi host, API kamera csi berbasis kelas yang dapat diskalakan ke papan multi-kamera, target simulator yang dapat dijalankan, estimasi pose tunggal MoveNet, MicroPython 1.28, dan banyak perbaikan kamera, ML, dan ToF. Rilis ini juga membawa sejumlah perubahan API yang merusak kompatibilitas — setiap perubahan yang terlihat pengguna sejak v4.8.1 tercantum di bawah, beserta cara migrasinya.

Sorotan

  • OpenMV Protocol V2. Koneksi host/IDE dibangun ulang dari awal: dibingkai, diurutkan, diperiksa CRC, dengan kanal terpisah untuk stdio, pratinjau stream, dan data pengguna. Modul protocol baru memungkinkan skrip membuat transport dan kanal data sendiri. Lihat perubahan modul protocol.

  • API kamera csi berbasis kelas. import sensor menjadi import csi / csi.CSI, dengan dukungan multi-kamera bawaan. Lihat migrasi csi.

  • Target simulator. Firmware kini dapat dibangun dan dijalankan di bawah simulator Arm FVP / QEMU (MPS2/MPS3), termasuk emulasi NPU, ROMFS, dan PSRAM — skrip visi mesin dan ML dapat berjalan tanpa perangkat keras terpasang.

  • Estimasi pose MoveNet. Post-processor MoveNet baru beserta model movenet_singlepose_192.tflite yang disertakan pada OpenMV AE3 dan N6.

  • MicroPython 1.28 dan ulab 6.12.0, ST Edge AI 4.0 tooling, serta OpenMV SDK yang dieksternalisasi (lihat perubahan build / tooling).

Fitur baru

Perubahan dan peningkatan lainnya

  • MicroPython diperbarui ke 1.28.0 dari basis v4.8.1. Menambahkan mode kartu SD kecepatan tinggi pada H5/H7/N6, clocking AHB5 dalam mode daya rendah, dan pin JTAG yang dapat dikontrol sebagai GPIO pada OPENMV_AE3.

  • ulab diperbarui ke 6.12.0 — operator % bawaan pada ndarray (pembantu ml.utils.mod() dihapus; lihat perubahan pustaka ML).

  • ST Edge AI tooling diperbarui ke 4.0 — memengaruhi kompilasi dan deployment model ST pada perangkat.

  • ml.Model — argumen kata kunci load_to_fb dihapus; memori model ditangani secara otomatis oleh pengalokasi terpadu.

  • image.Image.scale() di tempat — melakukan penskalaan citra ke atas di tempat (misalnya img.scale(x_scale=2.0, y_scale=2.0)) kini memperbesar buffer bingkai agar sesuai, bukan gagal.

  • Buffer stdio yang lebih besar — buffer teks default ke IDE bertambah dari 512 menjadi 1024 byte pada OpenMV 2/3/4, Nicla Vision, AE3, dan N6, sehingga ledakan print() yang lebih besar tidak terpotong.

  • Aliran event host yang lebih halus — event NOTIFY stdout ke host dibatasi maksimum satu per pembacaan host, bukan satu per print() yang melewati tanda air ring buffer.

  • Operasi panjang yang dapat diinterupsi — loop tunggu gambar-panjang, GPU (Nema/Dave2D), dan NPU kini melayani event pada interval yang deterministik, sehingga skrip tetap responsif terhadap tombol Stop IDE selama pekerjaan berat.

Perbaikan bug

Kamera dan sensor:

  • find_apriltags() tidak lagi merusak hasil pada papan D-cache/GPU (N6, AE3), dan kini berfungsi pada AE3.

  • Memperbaiki output citra Bayer dari STM32 N6 ISP setelah beralih format piksel.

  • Memperbaiki ledakan auto-white-balance hijau pada adegan cerah dan kasus statistik AWB bingkai pertama yang tidak diinisialisasi; meningkatkan batas gamma STM32 ISP (32 menjadi 63) untuk rentang gamma/kontras/kecerahan yang lebih luas.

  • Auto-exposure PS5520 tidak lagi berosilasi dalam cahaya terang; perilaku AEC/AGC PAG7936 dirombak (kontrol gabungan, plafon gain yang dikoreksi).

  • Unggahan firmware autofokus OV5640 dipulihkan pada Portenta/Nicla (perbaikan MIMXRT I2C SUSPEND).

  • Memperbaiki deadlock pengambilan kamera saat batas laju bingkai dikombinasikan dengan pengambilan JPEG (STM32).

  • Pembacaan csi.IOCTL_GENX320_READ_EVENTS_RAW GenX320 tidak lagi mengacak pratinjau IDE.

  • csi.IOCTL_LEPTON_SET_MODE FLIR Lepton melalui csi.CSI.ioctl() kini berfungsi saat dipanggil dengan satu argumen.

Pemrosesan citra:

  • Memperbaiki blending alpha draw_image() / blend() saat mask disertakan.

  • Memperbaiki urutan bit encode/decode PNG 1-bit (BINARY) dan dekoding skala abu-abu dari 1-bit.

  • Memperbaiki metadata durasi/FPS perekaman mjpeg.Mjpeg.

  • Memperbaiki stack overflow dekode JPEG perangkat lunak pada papan dengan tumpukan kecil (OpenMV M7).

  • Memperbaiki deteksi otomatis format file JPEG/PNG pada host non-ARM (simulator).

Time-of-Flight:

ML dan sistem:

  • NPU dibersihkan dengan benar saat inferensi diinterupsi pada N6.

  • Wakeup deep-sleep / standby dipulihkan pada N6; hang jump-to-bootloader pada AE3 diperbaiki.

  • Memperbaiki kebocoran memori pada soft-reset (STM32 Nema GPU) dan buffer bingkai tambahan yang dikumpulkan terlalu dini.

  • Kanal protokol Python kustom kini bertahan dari soft-reboot, transport USB pulih dari reset bus / endpoint yang macet, dan banjir interupsi USB SOF diperbaiki.

Dukungan perangkat keras dan papan

  • OpenMV N6 — Ethernet diaktifkan (jaringan kabel); NPU AXI SRAM (1,75 MB) digabungkan ke pool transien bersama untuk lebih banyak RAM di antara inferensi; wakeup deep-sleep/standby; model TFLite dan Haar cascade yang disertakan dalam ROMFS.

  • OpenMV AE3 — model dan cascade yang disertakan dalam ROMFS; cbor2 dibekukan ke dalam firmware.

  • Alif (AE3, N6) — wakeup machine.RTC daya rendah.

  • AprilTags resolusi tinggifind_apriltags() dengan resolusi sensor penuh pada AE3, Arduino Giga, dan Arduino Portenta H7.

  • Target simulator — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), dengan emulasi NPU, ROMFS, dan PSRAM.

Perubahan API yang merusak kompatibilitas

Perubahan API yang terlihat pengguna antara v4.8.1 dan v5.0.0. Cakupan: modul C Python di modules/ dan pustaka Python di scripts/libraries/.

Setiap perubahan diberi tag dampaknya:

  • besar — sebagian besar skrip perlu diedit.

  • kecil — API yang sempit; hanya memengaruhi skrip yang menggunakannya.

  • perilaku — API sama, hasil berbeda; periksa ulang skrip yang telah disetel.

  • tooling — hanya memengaruhi pembangunan dari sumber / fork downstream.

Perubahan dikelompokkan berdasarkan dampak dalam urutan tersebut — besar lebih dulu, kemudian kecil, perilaku, dan tooling. Jika Anda hanya ingin memindahkan kode Anda, langsung ke daftar periksa migrasi di akhir untuk daftar tugas yang ringkas. Setiap hash commit tertaut ke diff-nya di GitHub.

sensor digantikan oleh csi (besar)

Setiap contoh resmi ditulis ulang untuk mengganti import sensor dengan import csi. API fungsional lama di tingkat modul (sensor.reset(), sensor.set_pixformat(), ...) digantikan oleh API berbasis kelas csi.CSI, yang dapat diskalakan secara alami ke papan dengan beberapa kamera (csi0, csi1, ...) dan diperlukan untuk semua fitur baru (kwarg stream=, streaming multi-sensor, ...).

Qstr sensor masih terhubung di modules/py_csi.c untuk build firmware yang kompatibel mundur, tetapi tidak akan mendapatkan fitur baru, dan semua contoh, dokumentasi, serta kode pustaka kini mengasumsikan csi.

Commit: 945c5853c, 61f835b7e

Modul ke kelas

Sebelum (sensor):

import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()

Setelah (csi):

import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()

Pasangan setter/getter diciutkan menjadi accessor gabungan

Dalam API baru, metode yang dipanggil tanpa argumen mengembalikan nilai saat ini; dipanggil dengan nilai akan mengaturnya. Prefiks set_*/get_* dihapus. Nama metode juga kehilangan sufiks ing di mana itu redundan (windowingwindow). Kolom API baru tertaut ke dokumentasi referensi.

sensor (lama)

csi.CSI (baru)

set_pixformat(fmt) / get_pixformat()

pixformat([fmt])

set_framesize(sz) / get_framesize()

framesize([sz])

set_framerate(fps) / get_framerate()

framerate([fps])

set_windowing(roi) / get_windowing()

window([roi])

set_framebuffers(n) / get_framebuffers()

framebuffers([n])

set_gainceiling(g)

gainceiling([g])

set_brightness(v)

brightness([v])

set_contrast(v)

contrast([v])

set_saturation(v)

saturation([v])

set_quality(v)

quality([v])

set_colorbar(b)

colorbar([b])

set_special_effect(e)

special_effect([e])

set_lens_correction(...)

lens_correction(...)

set_hmirror(b) / get_hmirror()

hmirror([b])

set_vflip(b) / get_vflip()

vflip([b])

set_transpose(b) / get_transpose()

transpose([b])

set_auto_rotation(b) / get_auto_rotation()

auto_rotation([b])

set_auto_gain(b, [db, ceiling]) / get_gain_db()

auto_gain(...) / gain_db()

set_auto_exposure(b, [us]) / get_exposure_us()

auto_exposure(...) / exposure_us()

set_auto_whitebal(b, [rgb]) / get_rgb_gain_db()

auto_whitebal(...) / rgb_gain_db()

set_auto_blc(b, [regs]) / get_blc_regs()

auto_blc(...) / blc_regs()

set_color_palette(p) / get_color_palette()

color_palette([p])

set_frame_callback(cb)

frame_callback(cb)

set_vsync_callback(cb)

vsync_callback(cb)

get_id()

cid()

Fungsi tanpa padanan langsung

sensor (dihapus)

Yang harus digunakan sebagai gantinya

sensor.alloc_extra_fb(w, h, pixfmt) / sensor.dealloc_extra_fb()

image.Image (w, h, pixfmt) — citra yang dialokasikan di heap biasa. Buffer bingkai tidak lagi diukir untuk buffer pengguna.

sensor.skip_frames(time=..., frames=...)

csi.CSI.snapshot() — skip-frames dilipat ke dalam snapshot melalui argumen time= / frames=-nya.

sensor.disable_delays(...) / sensor.disable_full_flush(...)

Dipindahkan ke konstruktor csi.CSI: csi.CSI(delays=False) / csi.CSI(fflush=False).

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

Dihapus. Citra yang dikembalikan oleh csi.CSI.snapshot() adalah handle kanonik.

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — argumen expand dihapus (lihat tindak lanjut csi).

Baru pada csi.CSI

  • csi.CSI(stream=True|False) — selektor waktu konstruksi yang memilih CSI mana yang mengumpankan buffer bingkai pratinjau (menggantikan kwarg update= per-snapshot, lihat tindak lanjut csi).

  • csi.CSI(cid=N) / csi.devices() — dukungan multi-CSI untuk papan dengan lebih dari satu sensor citra.

Modul image — perombakan tanda tangan (besar)

Modul image mengalami perubahan API terluas setelah csi — tanda tangan gambar, objek hasil, dan beberapa detektor semuanya berubah.

Argumen koordinat harus berupa tuple

modules/py_image.c ditulis ulang di atas mp_arg_parse_all. Semua metode gambar/piksel yang sebelumnya menerima argumen posisional x, y, ... terpisah kini mengharuskan koordinat tersebut dikemas ke dalam satu tuple.

Commit: d18bbc472, 0c60c94b9 (PR #3061)

Sebelum

Setelah

img.draw_arrow(x0, y0, x1, y1, color=...)

img.draw_arrow((x0, y0, x1, y1), color=...)

img.draw_line(x0, y0, x1, y1, ...)

img.draw_line((x0, y0, x1, y1), ...)

img.draw_cross(x, y, ...)

img.draw_cross((x, y), ...)

img.draw_circle(x, y, r, ...)

img.draw_circle((x, y, r), ...)

img.draw_rectangle(x, y, w, h, ...)

img.draw_rectangle((x, y, w, h), ...)

img.draw_string(x, y, "txt", ...)

img.draw_string((x, y), "txt", ...)

img.draw_ellipse(x, y, rx, ry, rot, ...)

img.draw_ellipse((x, y, rx, ry, rot), ...)

img.flood_fill(x, y, ...)

img.flood_fill((x, y), ...)

img.get_pixel(x, y, rgbtuple=...)

img.get_pixel((x, y), rgbtuple=...)

img.set_pixel(x, y, color)

img.set_pixel((x, y), color)

Semua adalah metode dari image.Image.

Objek hasil dikonversi ke attrtuple

Tipe-tipe ini kini merupakan objek attrtuple MicroPython: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Akses atribut tanpa tanda kurung kini menjadi bentuk kanonik.

Commit: 3399d302e

Sebelum (gaya metode):

img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())

Setelah (gaya atribut):

img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)

blob dan histogram tidak berubah — keduanya tetap menggunakan tipe yang ada dan accessor () (sebuah attrtuple tidak dapat mengekspresikan nilai yang dihitung secara malas dari blob atau accessor bertargumen dari histogram).

Penggantian nama parameter haar find_features

image.Image.find_features()scale_factor= diubah namanya menjadi scale=.

Commit: be4c5cd73

get_regression — kini selalu robust, target_size ditambahkan

image.Image.get_regression() kini selalu menggunakan regresi robust (Theil-Sen). Jalur least-squares cepat lama dihapus, sehingga kata kunci robust= dihilangkan — yang dulu membutuhkan robust=True kini menjadi satu-satunya perilaku. Kwarg target_size=(w, h) baru (default (80, 60)) melakukan penskalaan area ROI ke bawah sebelum fit Theil-Sen O(N^2) sehingga selalu berjalan pada ukuran citra yang wajar; titik akhir garis yang difit dipetakan kembali ke koordinat sumber. Contoh linear_regression_robust.py dihapus dan linear_regression_fast.py diganti nama menjadi linear_regression.py.

Commit: c7c2e69a0, 0ff2afa72

find_line_segments — algoritma baru

image.Image.find_line_segments() — detektor LSD lama digantikan oleh ED-Lines, dan mendapatkan kwarg threshold=50 baru. Output skrip yang sebelumnya disetel akan berbeda.

Commit: 87da2a7b7, 2c47b5735

Pustaka AprilTag diganti

image.Image.find_apriltags() — detektor AprilTag diganti dengan implementasi baru. Set family berubah:

Commit: e813bada7

Tindak lanjut modul csi (kecil)

Tindak lanjut csi yang lebih kecil di atas migrasi csi.

snapshot(update=...) dihapus

Kwarg update pada csi.CSI.snapshot() dihilangkan. Untuk mencegah perangkat CSI mengumpankan buffer bingkai pratinjau, nonaktifkan saat konstruksi:

csi0 = csi.CSI(stream=False)                  # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img)  # was: ...(update=False, ...)

Commit: 9a8077827, 26b79a2c5

Argumen expand framebuffers() dihapus

csi.CSI.framebuffers() — argumen posisional ketiga (expand) dihilangkan; tanda tangannya kini framebuffers([count]).

Commit: 86cb3a5de

Modul protocol (kecil)

Hanya memengaruhi skrip yang mengendalikan tautan host secara langsung. Lihat protocol.

timer_ms diganti nama menjadi poll_ms

protocol.init() — argumen timer_ms diganti namanya menjadi poll_ms.

protocol.init(..., poll_ms=10)   # was: timer_ms=10

Commit: 8a0635e8c, 95a290607

protocol.poll() dihapus

Tugas protokol dijadwalkan secara internal sekarang. Panggilan ke protocol.poll() akan memunculkan AttributeError.

Commit: 8a0635e8c

Argumen konfigurasi soft_reboot dihapus

protocol.init() — argumen soft_reboot dihilangkan. Semua transport saat ini mentoleransi soft-reboot, sehingga perilakunya kini tidak bersyarat.

Commit: 0bf766aa2

Modul display (kecil)

Output TV kini melalui objek display.TVDisplay sebagai ganti modul tv yang berdiri sendiri. display juga mendapatkan ioctl() generik.

Commit: f0accb389, 1a5a87121, 920c097a0, 9eac55098

Modul tof (perilaku)

API sama seperti sebelumnya; default dan penanganan error berubah. Lihat tof.

Timeout default berubah

tof.read_depth() dan tof.snapshot() (dipanggil dengan timeout=-1) kini default ke 100 ms alih-alih menunggu tanpa batas. Berikan nilai yang lebih besar secara eksplisit jika Anda memerlukan perilaku lama.

Commit: b6772b80d

Pemulihan otomatis

Driver kini melakukan hard-reset pada bus I2C dan sensor pada error ranging/timeout. Contoh tidak lagi memanggil tof.reset() di handler exception mereka — kode pengguna yang melakukan pemulihan manual harus menghapusnya (akan bertentangan dengan pemulihan otomatis baru).

Commit: b6772b80d, 80ffaa5c3

Pustaka ML (perilaku)

API sama, angka berbeda — periksa ulang pipeline ML yang telah disetel.

Preprocessing kini meregangkan alih-alih letterbox

Normalization kini menggunakan image.SCALE_ASPECT_IGNORE (regang) alih-alih image.SCALE_ASPECT_EXPAND (letterbox). Post-processing NMS juga beralih ke penskalaan x/y independen.

Catatan

Dampak. Detektor gaya YOLO dan regressor titik kunci umumnya meningkat. Contoh BlazeFace, BlazePalm, FaceLandmarks, dan HandLandmarks kini memerlukan pemotongan persegi manual pada ROI input — skrip contoh telah diperbarui; kode pengguna kustom harus melakukan hal yang sama.

Commit: 68dc29a33

Pembantu ml.utils.mod() dihapus

ulab 6.12.0 mendukung % pada ndarray secara bawaan. Kode yang mengimpor mod dari ml.utils harus menggunakan a % b.

Commit: 35ece5728, 82fbd858c

Build / tooling (tooling)

Tidak ada yang memengaruhi skrip MicroPython. Membangun firmware dari sumber kini memerlukan OpenMV SDK eksternal (1.6.0, sebelumnya dalam pohon). Beberapa alat build dalam pohon dihapus dan N6 beralih ke tumpukan TinyUSB; fork downstream harus meninjau riwayat repositori firmware — terutama tanda tangan file_open() yang menghapus argumen buffered-nya.

Daftar periksa migrasi

Untuk port bersih ke v5.0.0, pekerjaan tipikal adalah:

  1. Ganti import sensor dengan import csi; csi0 = csi.CSI() dan terjemahkan setiap panggilan set_*/get_* ke accessor csi.CSI-nya (migrasi csi).

  2. Bungkus argumen koordinat ke img.draw_*, get_pixel(), dan set_pixel() dalam tuple (perubahan modul image).

  3. Hapus () dari accessor hasil attrtuple jika Anda menginginkan bentuk idiomatik baru, atau biarkan gaya lama apa adanya karena attrtuple masih mendukung accessor yang dapat dipanggil (perubahan modul image).

  4. Audit find_line_segments(), get_regression(), dan pilihan family find_apriltags() mana pun (perubahan modul image).

  5. Ganti nama timer_mspoll_ms dalam panggilan protocol.init(); hapus protocol.poll() dan soft_reboot= (perubahan modul protocol).

  6. Untuk alur kerja ML: tinjau ulang model yang memerlukan input letterboxed (perubahan pustaka ML).