v5.0.0¶
v5.0.0 là một bản phát hành lớn. Những điểm nổi bật: liên kết máy chủ OpenMV Protocol V2 được xây dựng lại, API camera csi dựa trên lớp mở rộng cho các bo mạch đa camera, mục tiêu simulator có thể chạy được, ước lượng tư thế đơn MoveNet, MicroPython 1.28, và nhiều bản sửa lỗi camera, ML, và ToF. Bản này cũng có một số thay đổi API không tương thích ngược — mọi thay đổi hiển thị với người dùng kể từ v4.8.1 được liệt kê bên dưới, cùng với hướng dẫn di chuyển chi tiết.
Điểm nổi bật¶
OpenMV Protocol V2. Liên kết máy chủ/IDE được xây dựng lại từ đầu: có khung, có thứ tự, kiểm tra CRC, với các kênh ghép kênh cho stdio, xem trước luồng, và dữ liệu người dùng. Một module
protocolmới cho phép các tập lệnh tạo transport và kênh dữ liệu riêng. Xem các thay đổi module protocol.API camera
csidựa trên lớp.import sensortrở thànhimport csi/csi.CSI, với hỗ trợ đa camera gốc. Xem hướng dẫn di chuyển csi.Mục tiêu Simulator. Firmware hiện xây dựng và chạy trong simulator Arm FVP / QEMU (MPS2/MPS3), bao gồm giả lập NPU, ROMFS, và PSRAM — các tập lệnh thị giác và ML có thể chạy mà không cần phần cứng.
Ước lượng tư thế MoveNet. Bộ xử lý hậu kỳ
MoveNetmới cùng với mô hìnhmovenet_singlepose_192.tfliteđi kèm trên OpenMV AE3 và N6.MicroPython 1.28 và ulab 6.12.0, công cụ ST Edge AI 4.0, và OpenMV SDK được tách ra ngoài (xem các thay đổi build / tooling).
Tính năng mới¶
Module
protocol— tạo transport và kênh dữ liệu tùy chỉnh từ Python:protocol.init(),protocol.register(),protocol.is_active(), và một lớpprotocol.ProtocolChannelvớisend_event(), cùng các hằng sốCHANNEL_FLAG_*vàCHANNEL_ID_*. Chữ kýprotocol.init()cuối cùng được ghi lại trong các thay đổi module protocol.protocol.CBORChannel— một gói mở rộngprotocolđóng băng, tuần tự hóa các trường có tên sang CBOR với các widget hiển thị (nhãn, độ sâu) và điều khiển tương tác (toggle, slider, select).Kiểm tra bộ nhớ và luồng máy chủ — lệnh protocol
SYS_MEMORYmới hiển thị số liệu thống kê bộ nhớ runtime theo từng pool cho IDE, và ioctl luồngSTREAM_SOURCEmới cho phép máy chủ chọn camera nào cấp nguồn cho xem trước trên các bo mạch đa camera (phiên bản protocol 1.0.1).Streaming đa camera —
csi.CSInhận đối sốstream=chọn cảm biến nào cấp nguồn cho xem trước IDE; tiêu đề khung hình luồng hiện mang FPS được làm mịn bằng EMA để IDE hiển thị tốc độ khung hình mà không cần soạn codeclock.fps(). Xem hướng dẫn di chuyển csi và các cập nhật csi.Cảm biến sự kiện GenX320 — bộ lọc Spatio-Temporal Contrast mới (
csi.IOCTL_GENX320_SET_STCvới các chế độcsi.GENX320_STC_DISABLE,csi.GENX320_STC_ONLY,csi.GENX320_STC_TRAIL_ONLY, vàcsi.GENX320_STC_TRAIL) và đọc sự kiện thô (csi.IOCTL_GENX320_READ_EVENTS_RAW), cùng với các tập lệnh ví dụ mới.MoveNet— bộ xử lý hậu kỳ tư thế đơn MediaPipe mới (kwargsthreshold,nms_threshold,nms_sigma) trả về((x, y, w, h), score, keypoints)với mảng điểm đặc trưng COCO 17 khớp; mô hìnhmovenet_singlepose_192.tflitevà ví dụ được đóng gói trên AE3 và N6.ml.utils.draw_predictions()— đối sốscores=tùy chọn mới thêm độ tin cậy theo nhãn, phông chữ và nét vẽ hộp hiện tự động điều chỉnh theo chiều rộng ảnh, và chế độformat="point"mới vẽ điểm trung tâm cho bộ phát hiện điểm trung tâm/đỉnh.Lớp
display.TVDisplaymới (vớiioctl()chung) thay thế moduletvđộc lập. Xem các thay đổi module display.Bộ phát hiện
find_line_segments()mới (ED-Lines) — hiện có trên tất cả các bản build, với đối sốthreshold=mới. Xem các thay đổi module image.
Các thay đổi và cải tiến khác¶
MicroPython được cập nhật lên 1.28.0 từ cơ sở v4.8.1. Thêm chế độ thẻ SD tốc độ cao trên H5/H7/N6, clocking AHB5 ở chế độ công suất thấp, và các chân JTAG có thể điều khiển như GPIO trên OPENMV_AE3.
ulab được cập nhật lên 6.12.0 — toán tử
%gốc trên ndarray (helperml.utils.mod()bị xóa; xem các thay đổi thư viện ML).Công cụ ST Edge AI được cập nhật lên 4.0 — ảnh hưởng đến biên dịch và triển khai mô hình ST trên thiết bị.
ml.Model— đối số từ khóaload_to_fbđã bị xóa; bộ nhớ mô hình được xử lý tự động bởi bộ cấp phát thống nhất.image.Image.scale()tại chỗ — việc phóng to ảnh tại chỗ (ví dụimg.scale(x_scale=2.0, y_scale=2.0)) hiện mở rộng bộ đệm khung hình thay vì thất bại.Bộ đệm stdio lớn hơn — bộ đệm văn bản mặc định đến IDE tăng từ 512 lên 1024 byte trên OpenMV 2/3/4, Nicla Vision, AE3, và N6, vì vậy các lần
print()lớn hơn không bị cắt ngắn.Luồng sự kiện máy chủ mượt mà hơn — các sự kiện NOTIFY stdout đến máy chủ được giới hạn tối đa một lần mỗi lần đọc máy chủ thay vì một lần mỗi lần
print()vượt qua ngưỡng ring buffer.Các thao tác dài có thể ngắt — các vòng lặp chờ vẽ ảnh dài, GPU (Nema/Dave2D), và NPU hiện phục vụ sự kiện trên một khoảng thời gian xác định, vì vậy các tập lệnh vẫn phản hồi nút Dừng IDE trong quá trình làm việc nặng.
Sửa lỗi¶
Camera và cảm biến:
find_apriltags()không còn làm hỏng kết quả trên các bo mạch D-cache/GPU (N6, AE3), và hiện hoạt động trên AE3.Đã sửa đầu ra ảnh Bayer từ STM32 N6 ISP sau khi chuyển đổi định dạng điểm ảnh.
Đã sửa hiện tượng bão hòa cân bằng trắng tự động màu xanh lá trong cảnh sáng và trường hợp AWB-stats khung hình đầu chưa khởi tạo; tăng ngưỡng gamma ISP STM32 (32 lên 63) để có phạm vi gamma/độ tương phản/độ sáng rộng hơn.
Tự động phơi sáng PS5520 không còn dao động trong ánh sáng mạnh; hành vi AEC/AGC của PAG7936 đã được làm lại (điều khiển kết hợp, trần độ khuếch đại được sửa).
Đã khôi phục tải firmware autofocus OV5640 trên Portenta/Nicla (sửa lỗi MIMXRT I2C SUSPEND).
Đã sửa deadlock chụp ảnh camera khi giới hạn tốc độ khung hình kết hợp với chụp JPEG (STM32).
Các lần đọc
csi.IOCTL_GENX320_READ_EVENTS_RAWcủa GenX320 không còn làm rối xem trước IDE.FLIR Lepton
csi.IOCTL_LEPTON_SET_MODEquacsi.CSI.ioctl()hiện hoạt động khi được gọi với một đối số duy nhất.
Xử lý ảnh:
Đã sửa pha trộn alpha
draw_image()/blend()khi cung cấp mặt nạ.Đã sửa thứ tự bit mã hóa/giải mã PNG 1-bit (BINARY) và giải mã thang xám từ 1-bit.
Đã sửa metadata thời lượng/FPS ghi âm
mjpeg.Mjpeg.Đã sửa tràn ngăn xếp giải mã JPEG bằng phần mềm trên các bo mạch ngăn xếp nhỏ (OpenMV M7).
Đã sửa tự động phát hiện định dạng tệp JPEG/PNG trên các máy chủ không phải ARM (simulator).
Time-of-Flight:
tof.read_depth()không còn raise lỗi trên các lỗi đo thoáng qua và tự phục hồi từ lỗi bus; thời gian chờ mặc địnhtof.read_depth()/tof.snapshot()hiện là 100 ms (xem các thay đổi tof).Đã sửa lỗi hỏng dữ liệu độ sâu đa vùng VL53L5CX / VL53L8CX.
ML và hệ thống:
NPU được dọn dẹp đúng cách khi suy luận bị ngắt trên N6.
Khôi phục wakeup deep-sleep / standby trên N6; lỗi treo khi nhảy đến bootloader trên AE3 đã được sửa.
Đã sửa rò rỉ bộ nhớ khi soft-reset (STM32 Nema GPU) và bộ đệm khung hình phụ bị thu hồi sớm.
Các kênh protocol Python tùy chỉnh hiện tồn tại sau khi khởi động lại mềm, transport USB phục hồi từ bus reset / endpoint bị stall, và lỗi tràn ngắt USB SOF đã được sửa.
Phần cứng và hỗ trợ bo mạch¶
OpenMV N6 — Ethernet được kích hoạt (mạng có dây); NPU AXI SRAM (1,75 MB) được gộp vào pool thoáng dùng chung để có nhiều RAM hơn giữa các lần suy luận; wakeup deep-sleep/standby; các mô hình TFLite và Haar cascade đi kèm trong ROMFS.
OpenMV AE3 — các mô hình và cascade đi kèm trong ROMFS;
cbor2được đóng băng vào firmware.Alif (AE3, N6) — wakeup
machine.RTCcông suất thấp.AprilTags độ phân giải cao —
find_apriltags()ở toàn độ phân giải cảm biến trên AE3, Arduino Giga, và Arduino Portenta H7.Mục tiêu Simulator — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU), với giả lập NPU, ROMFS, và PSRAM.
Thay đổi API không tương thích ngược¶
Các thay đổi API hiển thị với người dùng giữa v4.8.1 và v5.0.0. Phạm vi: C-module Python trong modules/ và thư viện Python trong scripts/libraries/.
Mỗi thay đổi được gắn nhãn theo mức độ tác động:
major — hầu hết các tập lệnh cần chỉnh sửa.
minor — API hẹp; chỉ ảnh hưởng đến các tập lệnh đã sử dụng nó.
behavior — cùng API, kết quả khác nhau; hãy kiểm tra lại các tập lệnh đã tinh chỉnh.
tooling — chỉ ảnh hưởng đến việc build từ nguồn / fork downstream.
Các thay đổi được nhóm theo mức độ tác động theo thứ tự đó — major trước, sau đó minor, behavior, và tooling. Nếu bạn chỉ muốn chuyển đổi code, hãy chuyển đến danh sách kiểm tra di chuyển ở cuối để có danh sách to-do ngắn gọn. Mỗi hash commit liên kết đến diff của nó trên GitHub.
sensor được thay thế bởi csi (major)¶
Mọi ví dụ chính thức đã được viết lại để bỏ import sensor thay bằng import csi. API chức năng cấp module cũ (sensor.reset(), sensor.set_pixformat(), ...) được thay thế bởi API csi.CSI dựa trên lớp, mở rộng tự nhiên cho các bo mạch có nhiều camera (csi0, csi1, ...) và được yêu cầu cho tất cả các tính năng mới (kwarg stream=, streaming đa cảm biến, ...).
Qstr sensor vẫn được kết nối trong modules/py_csi.c cho các bản build firmware tương thích ngược, nhưng nó sẽ không có tính năng mới, và tất cả ví dụ, tài liệu và code thư viện hiện giả định csi.
Module sang lớp
Trước (sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
Sau (csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
Các cặp setter/getter được gộp thành accessor kết hợp
Trong API mới, một phương thức được gọi không có đối số trả về giá trị hiện tại; được gọi với một giá trị thì đặt giá trị đó. Tiền tố set_*/get_* đã biến mất. Tên phương thức cũng mất hậu tố ing ở những chỗ thừa (windowing → window). Cột API mới liên kết đến tài liệu tham chiếu.
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Các hàm không có tương đương trực tiếp
|
Thay thế bằng gì |
|---|---|
|
|
|
|
|
Đã chuyển vào hàm khởi tạo |
|
|
|
Đã xóa. Ảnh được trả về bởi |
|
|
Mới trên csi.CSI
csi.CSI(stream=True|False)— bộ chọn tại thời điểm khởi tạo chọn CSI nào cấp nguồn cho bộ đệm khung hình xem trước (thay thế kwargupdate=theo từng ảnh chụp, xem các cập nhật csi).csi.CSI(cid=N)/csi.devices()— hỗ trợ đa CSI cho các bo mạch có nhiều hơn một cảm biến ảnh.
Module image — cải tổ chữ ký (major)¶
Module image có thay đổi API rộng nhất sau csi — chữ ký vẽ, đối tượng kết quả, và một số bộ phát hiện đều thay đổi.
Đối số tọa độ phải là tuple
modules/py_image.c đã được viết lại trên đầu mp_arg_parse_all. Tất cả các phương thức vẽ / điểm ảnh trước đây nhận các đối số vị trí x, y, ... riêng biệt giờ yêu cầu các tọa độ đó được đóng gói vào một tuple duy nhất.
Commits: d18bbc472, 0c60c94b9 (PR #3061)
Trước |
Sau |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tất cả đều là phương thức của image.Image.
Các đối tượng kết quả được chuyển thành attrtuple
Các kiểu này hiện là đối tượng attrtuple MicroPython: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch. Truy cập thuộc tính không có dấu ngoặc đơn hiện là dạng chuẩn.
Commit: 3399d302e
Trước (theo kiểu phương thức):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
Sau (theo kiểu thuộc tính):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob và histogram không thay đổi — chúng giữ các kiểu hiện có và accessor () (attrtuple không thể biểu đạt các giá trị tính toán trễ của blob hoặc các accessor nhận đối số của histogram).
Đổi tên tham số haar của find_features
image.Image.find_features() — scale_factor= đã được đổi tên thành scale=.
Commit: be4c5cd73
get_regression — luôn robust, thêm target_size
image.Image.get_regression() hiện luôn sử dụng hồi quy robust (Theil-Sen). Đường dẫn bình phương tối thiểu nhanh cũ đã bị xóa, vì vậy từ khóa robust= đã biến mất — những gì trước đây yêu cầu robust=True giờ là hành vi duy nhất. Kwarg target_size=(w, h) mới (mặc định (80, 60)) thu nhỏ ROI theo diện tích trước khi thực hiện Theil-Sen O(N^2) để nó luôn chạy trên kích thước ảnh hợp lý; các điểm cuối đường thẳng được ánh xạ trở lại tọa độ gốc. Ví dụ linear_regression_robust.py đã bị xóa và linear_regression_fast.py được đổi tên thành linear_regression.py.
find_line_segments — thuật toán mới
image.Image.find_line_segments() — bộ phát hiện LSD cũ được thay thế bằng ED-Lines, và có thêm kwarg threshold=50 mới. Đầu ra của các tập lệnh đã tinh chỉnh trước đó sẽ khác nhau.
Thư viện AprilTag được thay thế
image.Image.find_apriltags() — bộ phát hiện AprilTag đã được thay thế bằng một triển khai mới. Bộ family đã thay đổi:
Đã xóa |
Đã thêm |
|---|---|
|
|
Commit: e813bada7
Cập nhật module csi (minor)¶
Các cập nhật csi nhỏ hơn trên đầu hướng dẫn di chuyển csi.
snapshot(update=...) đã bị xóa
Kwarg update trên csi.CSI.snapshot() đã biến mất. Để giữ thiết bị CSI không cấp nguồn cho bộ đệm khung hình xem trước, hãy từ chối tại thời điểm khởi tạo:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
Đối số expand của framebuffers() đã bị xóa
csi.CSI.framebuffers() — đối số vị trí thứ ba (expand) đã biến mất; chữ ký hiện là framebuffers([count]).
Commit: 86cb3a5de
Module protocol (minor)¶
Chỉ ảnh hưởng đến các tập lệnh điều khiển liên kết máy chủ trực tiếp. Xem protocol.
timer_ms được đổi tên thành poll_ms
protocol.init() — đối số timer_ms đã được đổi tên thành poll_ms.
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() đã bị xóa
Tác vụ protocol hiện được lên lịch nội bộ. Các lời gọi đến protocol.poll() sẽ raise AttributeError.
Commit: 8a0635e8c
Đối số config soft_reboot đã bị xóa
protocol.init() — đối số soft_reboot đã biến mất. Tất cả transport hiện tại chịu được soft-reboot, vì vậy hành vi hiện là vô điều kiện.
Commit: 0bf766aa2
Module display (minor)¶
Đầu ra TV hiện đi qua đối tượng display.TVDisplay thay vì module tv độc lập. display cũng có thêm ioctl() chung.
Module tof (behavior)¶
API như cũ; các giá trị mặc định và xử lý lỗi đã thay đổi. Xem tof.
Thay đổi thời gian chờ mặc định
tof.read_depth() và tof.snapshot() (được gọi với timeout=-1) hiện mặc định là 100 ms thay vì chờ vô thời hạn. Truyền một giá trị lớn hơn rõ ràng nếu bạn cần hành vi cũ.
Commit: b6772b80d
Tự động phục hồi
Driver hiện hard-reset bus I2C và cảm biến khi có lỗi đo/timeout. Các ví dụ không còn gọi tof.reset() trong trình xử lý ngoại lệ — code người dùng thực hiện phục hồi thủ công nên xóa nó đi (nó sẽ xung đột với tính năng tự phục hồi mới).
Thư viện ML (behavior)¶
API như cũ, kết quả số khác — hãy kiểm tra lại bất kỳ pipeline ML nào đã tinh chỉnh.
Tiền xử lý hiện kéo dài thay vì letterbox
Normalization hiện sử dụng image.SCALE_ASPECT_IGNORE (kéo dài) thay vì image.SCALE_ASPECT_EXPAND (letterbox). Hậu xử lý NMS cũng chuyển sang tỷ lệ x/y độc lập.
Ghi chú
Tác động. Các bộ phát hiện kiểu YOLO và bộ hồi quy điểm đặc trưng thường được cải thiện. Các ví dụ BlazeFace, BlazePalm, FaceLandmarks, và HandLandmarks hiện yêu cầu crop vuông thủ công trên ROI đầu vào — các tập lệnh ví dụ đã được cập nhật; code người dùng tùy chỉnh phải làm tương tự.
Commit: 68dc29a33
Helper ml.utils.mod() đã bị xóa
ulab 6.12.0 hỗ trợ % trên ndarray natively. Code đã import mod từ ml.utils phải sử dụng a % b.
Build / tooling (tooling)¶
Điều này không ảnh hưởng đến các tập lệnh MicroPython. Việc build firmware từ nguồn hiện yêu cầu OpenMV SDK bên ngoài (1.6.0, trước đây nằm trong cây). Một số công cụ build trong cây đã bị xóa và N6 chuyển sang stack TinyUSB; các fork downstream nên xem lại lịch sử firmware repository — đặc biệt là chữ ký file_open() bỏ đối số buffered.
Danh sách kiểm tra di chuyển¶
Để chuyển đổi sạch sang v5.0.0, công việc thông thường là:
Thay
import sensorbằngimport csi; csi0 = csi.CSI()và dịch mọi lời gọiset_*/get_*sang accessorcsi.CSItương ứng (hướng dẫn di chuyển csi).Đóng gói các đối số tọa độ cho
img.draw_*,get_pixel(), vàset_pixel()vào tuple (các thay đổi module image).Bỏ
()khỏi các accessor kết quả attrtuple nếu bạn muốn dạng mới thông thường, hoặc giữ nguyên phong cách cũ vì attrtuple vẫn hỗ trợ accessor có thể gọi được (các thay đổi module image).Kiểm tra
find_line_segments(),get_regression(), và bất kỳ lựa chọn familyfind_apriltags()nào (các thay đổi module image).Đổi tên
timer_ms→poll_mstrong các lời gọiprotocol.init(); xóaprotocol.poll()vàsoft_reboot=(các thay đổi module protocol).Đối với các workflow ML: xem lại bất kỳ mô hình nào cần đầu vào letterboxed (các thay đổi thư viện ML).