v5.0.0

v5.0.0 เป็นรุ่นหลักที่สำคัญ ไฮไลต์ของรุ่นนี้ได้แก่: การสร้าง OpenMV Protocol V2 ใหม่สำหรับการเชื่อมต่อโฮสต์, API กล้องแบบคลาสใหม่ csi ที่รองรับบอร์ดหลายกล้อง, เป้าหมาย simulator ที่รันได้จริง, การประมาณท่าทางด้วย MoveNet แบบโพสเดียว, MicroPython 1.28 และการแก้ไขกล้อง, ML และ ToF จำนวนมาก นอกจากนี้ยังมีการเปลี่ยนแปลง API ที่ไม่เข้ากันกับรุ่นก่อน — การเปลี่ยนแปลงที่ผู้ใช้มองเห็นได้ทั้งหมดตั้งแต่ v4.8.1 แสดงอยู่ด้านล่างพร้อมวิธีการย้ายโค้ด

ไฮไลต์

  • OpenMV Protocol V2. การเชื่อมต่อโฮสต์/IDE ถูกสร้างใหม่ตั้งแต่ต้น: มีการจัดเฟรม, ลำดับ, การตรวจสอบ CRC พร้อมช่องสัญญาณมัลติเพล็กซ์สำหรับ stdio, พรีวิวสตรีม และข้อมูลผู้ใช้ โมดูล protocol ใหม่ให้สคริปต์สร้างทรานสปอร์ตและช่องข้อมูลของตนเองได้ ดูเพิ่มเติมที่ the protocol module changes

  • API กล้องแบบคลาสด้วย csi ** .** import sensor กลายเป็น import csi / csi.CSI พร้อมรองรับหลายกล้องในตัว ดูเพิ่มเติมที่ the csi migration

  • เป้าหมาย Simulator. เฟิร์มแวร์สามารถสร้างและรันบน Arm FVP / QEMU simulator (MPS2/MPS3) รวมถึงการจำลอง NPU, ROMFS และ PSRAM — สคริปต์วิชันและ ML สามารถรันได้โดยไม่ต้องต่อฮาร์ดแวร์

  • การประมาณท่าทาง MoveNet. โพสต์โปรเซสเซอร์ MoveNet ใหม่พร้อมโมเดล movenet_singlepose_192.tflite ที่รวมมาด้วยบน OpenMV AE3 และ N6

  • MicroPython 1.28 และ ulab 6.12.0, เครื่องมือ ST Edge AI 4.0 และ OpenMV SDK ที่แยกออกมาภายนอก (ดูที่ the build / tooling changes)

ฟีเจอร์ใหม่

  • โมดูล protocol — สร้างทรานสปอร์ตและช่องข้อมูลแบบกำหนดเองจาก Python: protocol.init(), protocol.register(), protocol.is_active() และคลาส protocol.ProtocolChannel พร้อม send_event(), รวมถึงค่าคงที่ CHANNEL_FLAG_* และ CHANNEL_ID_* ลายเซ็นสุดท้ายของ protocol.init() ถูกบันทึกใน the protocol module changes

  • protocol.CBORChannel — แพ็กเกจส่วนขยาย protocol แบบ frozen ที่ซีเรียลไลซ์ฟิลด์ที่มีชื่อเป็น CBOR พร้อมวิดเจ็ตแสดงผล (label, depth) และตัวควบคุมแบบโต้ตอบ (toggle, slider, select)

  • การตรวจสอบหน่วยความจำโฮสต์และสตรีม — คำสั่งโปรโตคอล SYS_MEMORY ใหม่เปิดเผยสถิติหน่วยความจำรันไทม์แบบต่อพูลให้ IDE และ ioctl สตรีม STREAM_SOURCE ใหม่ให้โฮสต์เลือกว่ากล้องใดจะป้อนพรีวิวบนบอร์ดหลายกล้อง (โปรโตคอลเวอร์ชัน 1.0.1)

  • สตรีมมิงหลายกล้องcsi.CSI รับอาร์กิวเมนต์ stream= ที่เลือกว่าเซนเซอร์ใดจะป้อนพรีวิว IDE; เฮดเดอร์เฟรมสตรีมตอนนี้มี FPS ที่ปรับสมูทด้วย EMA ทำให้ IDE แสดงอัตราเฟรมโดยไม่ต้องเรียก clock.fps() ดูเพิ่มเติมที่ the csi migration และ the csi follow-ups

  • เซนเซอร์อีเวนต์ GenX320 — ฟิลเตอร์ Spatio-Temporal Contrast ใหม่ (csi.IOCTL_GENX320_SET_STC พร้อมโหมด csi.GENX320_STC_DISABLE, csi.GENX320_STC_ONLY, csi.GENX320_STC_TRAIL_ONLY และ csi.GENX320_STC_TRAIL) และการอ่านอีเวนต์ดิบ (csi.IOCTL_GENX320_READ_EVENTS_RAW) พร้อมสคริปต์ตัวอย่างใหม่

  • MoveNet — โพสต์โปรเซสเซอร์ท่าทางเดี่ยว MediaPipe ใหม่ (kwargs threshold, nms_threshold, nms_sigma) ที่คืนค่า ((x, y, w, h), score, keypoints) พร้อมอาร์เรย์จุดสำคัญ COCO 17 ข้อต่อ; โมเดล movenet_singlepose_192.tflite และตัวอย่างถูกรวมมาด้วยบน AE3 และ N6

  • ml.utils.draw_predictions() — อาร์กิวเมนต์ scores= ใหม่แบบเลือกได้ที่เพิ่มความเชื่อมั่นต่อป้ายกำกับ, ฟอนต์และขอบกรอบปรับขนาดอัตโนมัติตามความกว้างภาพ และโหมด format="point" ใหม่ที่วาดเครื่องหมายกึ่งกลางสำหรับเครื่องตรวจจับ centerpoint/peak

  • คลาส display.TVDisplay ใหม่ (พร้อม ioctl() ทั่วไป) แทนที่โมดูล tv แบบเดี่ยว ดูเพิ่มเติมที่ the display module changes

  • เครื่องตรวจจับ find_line_segments() ใหม่ (ED-Lines) — ตอนนี้พร้อมใช้งานในทุกบิลด์ พร้อมอาร์กิวเมนต์ threshold= ใหม่ ดูเพิ่มเติมที่ the image module changes

การเปลี่ยนแปลงและการปรับปรุงอื่นๆ

  • MicroPython อัปเดตเป็น 1.28.0 จากฐาน v4.8.1 เพิ่มโหมด SD card ความเร็วสูงบน H5/H7/N6, การปรับนาฬิกา AHB5 ในโหมดประหยัดพลังงาน และพิน JTAG ที่ควบคุมได้เป็น GPIO บน OPENMV_AE3

  • ulab อัปเดตเป็น 6.12.0 — ตัวดำเนินการ % แบบเนทีฟบน ndarray (helper ml.utils.mod() ถูกลบออก; ดูที่ the ML library changes)

  • ST Edge AI tooling อัปเดตเป็น 4.0 — ส่งผลต่อการคอมไพล์และการติดตั้งโมเดล ST บนอุปกรณ์

  • ml.Model — อาร์กิวเมนต์คีย์เวิร์ด load_to_fb ถูกลบออก; หน่วยความจำโมเดลจัดการอัตโนมัติโดย unified allocator

  • image.Image.scale() ในตำแหน่งเดิม — การขยายภาพขึ้นในตำแหน่งเดิม (เช่น img.scale(x_scale=2.0, y_scale=2.0)) ตอนนี้จะขยายบัฟเฟอร์เฟรมให้พอดีแทนที่จะล้มเหลว

  • บัฟเฟอร์ stdio ขนาดใหญ่ขึ้น — บัฟเฟอร์ข้อความเริ่มต้นที่ส่งไปยัง IDE เพิ่มจาก 512 เป็น 1024 ไบต์บน OpenMV 2/3/4, Nicla Vision, AE3 และ N6 ทำให้การส่ง print() ขนาดใหญ่ไม่ถูกตัดทอน

  • การไหลของอีเวนต์โฮสต์ที่ราบรื่นขึ้น — อีเวนต์ stdout NOTIFY ที่ส่งไปยังโฮสต์ถูกจำกัดไม่เกินหนึ่งครั้งต่อการอ่านของโฮสต์แทนที่จะเป็นหนึ่งครั้งต่อ print() ที่ข้ามเครื่องหมายระดับ ring buffer

  • การดำเนินการยาวนานที่สามารถหยุดได้ — การวนซ้ำรอที่ยาวนานในการวาดภาพ, GPU (Nema/Dave2D) และ NPU ตอนนี้ให้บริการอีเวนต์ในช่วงเวลาที่แน่นอน ทำให้สคริปต์ตอบสนองต่อปุ่ม Stop ของ IDE ได้ระหว่างการทำงานหนัก

การแก้ไขข้อบกพร่อง

กล้องและเซนเซอร์:

  • find_apriltags() ไม่ทำให้ผลลัพธ์เสียหายบนบอร์ด D-cache/GPU (N6, AE3) อีกต่อไป และตอนนี้ทำงานบน AE3 ได้

  • แก้ไขการส่งออกภาพ Bayer จาก STM32 N6 ISP หลังจากเปลี่ยนรูปแบบพิกเซล

  • แก้ไขการบลอว์เอาต์การปรับสมดุลขาวอัตโนมัติสีเขียวบนฉากที่สว่างและกรณี AWB-stats เฟรมแรกที่ไม่ได้กำหนดค่าเริ่มต้น; เพิ่มการจำกัดแกมม่า STM32 ISP (32 เป็น 63) เพื่อช่วง gamma/contrast/brightness ที่กว้างขึ้น

  • การรับแสงอัตโนมัติ PS5520 ไม่แกว่งในแสงสว่างอีกต่อไป; พฤติกรรม AEC/AGC ของ PAG7936 ถูกปรับปรุงใหม่ (การควบคุมรวม, การแก้ไขเพดานค่าเกน)

  • การอัปโหลดเฟิร์มแวร์โฟกัสอัตโนมัติ OV5640 คืนค่าแล้วบน Portenta/Nicla (การแก้ไข MIMXRT I2C SUSPEND)

  • แก้ไขการหยุดชะงักของการจับภาพกล้องเมื่อจำกัดอัตราเฟรมร่วมกับการจับภาพ JPEG (STM32)

  • การอ่าน csi.IOCTL_GENX320_READ_EVENTS_RAW ของ GenX320 ไม่ทำให้พรีวิว IDE ผิดพลาดอีกต่อไป

  • FLIR Lepton csi.IOCTL_LEPTON_SET_MODE ผ่าน csi.CSI.ioctl() ตอนนี้ทำงานได้เมื่อเรียกด้วยอาร์กิวเมนต์เดียว

การประมวลผลภาพ:

  • แก้ไขการผสมอัลฟ่าของ draw_image() / blend() เมื่อใช้มาสก์

  • แก้ไขการเรียงลำดับบิต PNG เข้ารหัส/ถอดรหัส 1 บิต (BINARY) และการถอดรหัสระดับสีเทาจาก 1 บิต

  • แก้ไขข้อมูลเมตาระยะเวลา/FPS ของการบันทึก mjpeg.Mjpeg

  • แก้ไข stack overflow ของการถอดรหัส JPEG ซอฟต์แวร์บนบอร์ดที่มีสแต็กขนาดเล็ก (OpenMV M7)

  • แก้ไขการตรวจจับรูปแบบไฟล์ JPEG/PNG อัตโนมัติบนโฮสต์ที่ไม่ใช่ ARM (simulator)

Time-of-Flight:

  • tof.read_depth() ไม่ raise ข้อผิดพลาดเมื่อเกิดข้อผิดพลาดชั่วคราวในการวัดระยะอีกต่อไป และกู้คืนอัตโนมัติจากความผิดพลาดของบัส; ค่า timeout เริ่มต้นของ tof.read_depth() / tof.snapshot() ตอนนี้เป็น 100 ms (ดูที่ the tof changes)

  • แก้ไขความเสียหายของข้อมูลความลึกหลายโซนของ VL53L5CX / VL53L8CX

ML และระบบ:

  • NPU ถูกล้างข้อมูลอย่างถูกต้องเมื่อการอนุมานถูกหยุดบน N6

  • การปลุกจาก deep-sleep / standby ถูกคืนค่าบน N6; การค้างของ AE3 เมื่อกระโดดไปยัง bootloader ได้รับการแก้ไขแล้ว

  • แก้ไขหน่วยความจำรั่วไหลเมื่อ soft-reset (STM32 Nema GPU) และบัฟเฟอร์เฟรมเสริมที่ถูกเก็บกวาดก่อนเวลา

  • ช่องโปรโตคอล Python แบบกำหนดเองตอนนี้รอดชีวิตผ่าน soft-reboot, ทรานสปอร์ต USB กู้คืนจากการรีเซ็ตบัส / endpoint ที่ค้าง และการรบกวนอินเทอร์รัปต์ USB SOF ได้รับการแก้ไขแล้ว

ฮาร์ดแวร์และการรองรับบอร์ด

  • OpenMV N6 — เปิดใช้งาน Ethernet (เครือข่ายแบบสาย); NPU AXI SRAM (1.75 MB) รวมเข้ากับพูลชั่วคราวที่แชร์เพื่อ RAM มากขึ้นระหว่างการอนุมาน; การปลุกจาก deep-sleep/standby; โมเดล TFLite และ Haar cascades ที่รวมมาใน ROMFS

  • OpenMV AE3 — โมเดลและ cascades ที่รวมมาใน ROMFS; cbor2 ถูก frozen เข้าไปในเฟิร์มแวร์

  • Alif (AE3, N6) — การปลุก machine.RTC แบบใช้พลังงานต่ำ

  • AprilTags ความละเอียดสูงfind_apriltags() ที่ความละเอียดเซนเซอร์เต็มบน AE3, Arduino Giga และ Arduino Portenta H7

  • เป้าหมาย Simulator — MPS2_AN500 / MPS3_AN547 (Arm FVP / QEMU) พร้อมการจำลอง NPU, ROMFS และ PSRAM

การเปลี่ยนแปลง API ที่ไม่เข้ากันกับรุ่นก่อน

การเปลี่ยนแปลง API ที่ผู้ใช้มองเห็นได้ระหว่าง v4.8.1 และ v5.0.0 ขอบเขต: C-modules ของ Python ใน modules/ และไลบรารี Python ใน scripts/libraries/

การเปลี่ยนแปลงแต่ละอย่างถูกแท็กด้วยผลกระทบ:

  • major — สคริปต์ส่วนใหญ่ต้องการการแก้ไข

  • minor — API แคบ; มีผลต่อเฉพาะสคริปต์ที่ใช้งาน

  • behavior — API เหมือนเดิม ผลลัพธ์ต่างกัน; ตรวจสอบสคริปต์ที่ปรับแต่งไว้อีกครั้ง

  • tooling — มีผลต่อการสร้างจากซอร์สโค้ด / การ fork ต้นน้ำเท่านั้น

การเปลี่ยนแปลงถูกจัดกลุ่มตามผลกระทบตามลำดับนั้น — major ก่อน จากนั้น minor, behavior และ tooling หากต้องการย้ายโค้ดเพียงอย่างเดียว ข้ามไปที่ migration checklist ที่ท้ายสำหรับรายการสิ่งที่ต้องทำแบบย่อ แต่ละ commit hash ลิงก์ไปยัง diff บน GitHub

sensor ถูกแทนที่ด้วย csi (major)

ตัวอย่างทางการทั้งหมดถูกเขียนใหม่เพื่อแทนที่ import sensor ด้วย import csi API ฟังก์ชันระดับโมดูลแบบเดิม (sensor.reset(), sensor.set_pixformat(), ...) ถูกแทนที่ด้วย API แบบคลาส csi.CSI ซึ่งรองรับบอร์ดที่มีหลายกล้อง (csi0, csi1, ...) และจำเป็นสำหรับฟีเจอร์ใหม่ทั้งหมด (kwarg stream=, การสตรีมหลายเซนเซอร์, ...)

qstr sensor ยังคงเชื่อมต่อใน modules/py_csi.c สำหรับการสร้างเฟิร์มแวร์ที่เข้ากันได้ย้อนหลัง แต่จะไม่ได้รับฟีเจอร์ใหม่ และตัวอย่าง, เอกสาร และโค้ดไลบรารีทั้งหมดตอนนี้ใช้ csi

Commits: 945c5853c, 61f835b7e

โมดูลไปยังคลาส

ก่อน (sensor):

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

หลัง (csi):

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

คู่ setter/getter ย่อรวมเป็น combined accessor

ใน API ใหม่ เมธอดที่เรียก โดยไม่มี อาร์กิวเมนต์จะคืนค่าปัจจุบัน; เรียก พร้อมค่า จะตั้งค่านั้น คำนำหน้า set_*/get_* หายไป ชื่อเมธอดยังลบคำต่อท้าย ing ที่ซ้ำซ้อน (windowingwindow) คอลัมน์ API ใหม่ลิงก์ไปยังเอกสารอ้างอิง

sensor (เก่า)

csi.CSI (ใหม่)

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()

ฟังก์ชันที่ไม่มีสิ่งเทียบเท่าโดยตรง

sensor (ถูกลบ)

สิ่งที่ควรใช้แทน

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

image.Image (w, h, pixfmt) — ภาพที่จัดสรรบนฮีปปกติ ไม่ใช้การแบ่ง framebuffer สำหรับบัฟเฟอร์ผู้ใช้อีกต่อไป

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

csi.CSI.snapshot() — skip-frames รวมเข้าใน snapshot ผ่านอาร์กิวเมนต์ time= / frames=

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

ย้ายเข้าไปในตัวสร้าง csi.CSI: csi.CSI(delays=False) / csi.CSI(fflush=False)

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

ถูกลบ ภาพที่คืนโดย csi.CSI.snapshot() คือแฮนเดิลหลัก

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers() — อาร์กิวเมนต์ expand ถูกลบ (ดูที่ the csi follow-ups)

ใหม่บน csi.CSI

  • csi.CSI(stream=True|False) — ตัวเลือกในเวลาสร้างที่กำหนดว่า CSI ใดจะป้อน preview framebuffer (แทนที่ kwarg update= ต่อ snapshot ดูที่ the csi follow-ups)

  • csi.CSI(cid=N) / csi.devices() — รองรับ multi-CSI สำหรับบอร์ดที่มีเซนเซอร์ภาพมากกว่าหนึ่งตัว

โมดูล image — การปรับปรุงลายเซ็นครั้งใหญ่ (major)

โมดูล image มีการเปลี่ยนแปลง API ที่กว้างที่สุดรองจาก csi — ลายเซ็นการวาด, ออบเจ็กต์ผลลัพธ์ และเครื่องตรวจจับหลายตัวล้วนเปลี่ยนแปลง

อาร์กิวเมนต์พิกัดต้องเป็น tuple

modules/py_image.c ถูกเขียนใหม่บน mp_arg_parse_all เมธอดการวาด/พิกเซลทั้งหมดที่เคยรับ x, y, ... แบบตำแหน่งแยกกัน ตอนนี้ต้องรับพิกัดเหล่านั้นในรูป tuple เดียว

Commits: d18bbc472, 0c60c94b9 (PR #3061)

ก่อน

หลัง

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)

ทั้งหมดเป็นเมธอดของ image.Image

ออบเจ็กต์ผลลัพธ์ถูกแปลงเป็น attrtuple

ประเภทเหล่านี้ตอนนี้เป็นออบเจ็กต์ attrtuple ของ MicroPython: similarity, statistics, percentile, threshold, line, circle, rect, qrcode, apriltag, datamatrix, barcode, displacement, kptmatch การเข้าถึง attribute โดยไม่มีวงเล็บเป็นรูปแบบมาตรฐานตอนนี้

Commit: 3399d302e

ก่อน (แบบเมธอด):

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

หลัง (แบบ attribute):

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

blob และ histogram ไม่เปลี่ยนแปลง — ยังคงใช้ประเภทที่มีอยู่และตัวเข้าถึง () (attrtuple ไม่สามารถแสดงค่าที่คำนวณแบบ lazy ของ blob หรือตัวเข้าถึงที่รับอาร์กิวเมนต์ของ histogram ได้)

การเปลี่ยนชื่อพารามิเตอร์ haar ของ find_features

image.Image.find_features()scale_factor= ถูกเปลี่ยนชื่อเป็น scale=

Commit: be4c5cd73

get_regression — ตอนนี้ robust เสมอ, เพิ่ม target_size

image.Image.get_regression() ตอนนี้ ใช้ การถดถอยแบบ robust (Theil-Sen) เสมอ เส้นทาง least-squares แบบเร็วเก่าถูกลบออก ดังนั้นคีย์เวิร์ด robust= หายไป — สิ่งที่เคยต้องใช้ robust=True ตอนนี้เป็นพฤติกรรมเดียวเท่านั้น kwarg target_size=(w, h) ใหม่ (ค่าเริ่มต้น (80, 60)) ปรับขนาด ROI ลงก่อน Theil-Sen fit แบบ O(N^2) เพื่อให้รันบนขนาดภาพที่เหมาะสมเสมอ; จุดปลายเส้นที่ฟิตได้ถูกแมปกลับไปยังพิกัดต้นทาง ตัวอย่าง linear_regression_robust.py ถูกลบและ linear_regression_fast.py ถูกเปลี่ยนชื่อเป็น linear_regression.py

Commits: c7c2e69a0, 0ff2afa72

find_line_segments — อัลกอริทึมใหม่

image.Image.find_line_segments() — เครื่องตรวจจับ LSD เก่าถูกแทนที่ด้วย ED-Lines และได้รับ kwarg threshold=50 ใหม่ ผลลัพธ์ของสคริปต์ที่ปรับแต่งไว้ก่อนหน้าจะแตกต่างกัน

Commits: 87da2a7b7, 2c47b5735

ไลบรารี AprilTag ถูกแทนที่

image.Image.find_apriltags() — เครื่องตรวจจับ AprilTag ถูกแทนที่ด้วยการใช้งานใหม่ ชุด family เปลี่ยนไป:

ถูกลบ

เพิ่มใหม่

image.TAG25H7, image.ARTOOLKIT

image.TAGCIRCLE21H7, image.TAGCIRCLE49H12, image.TAGCUSTOM48H12, image.TAGSTANDARD41H12, image.TAGSTANDARD52H13

Commit: e813bada7

การติดตาม csi (minor)

การติดตามขนาดเล็กของ csi บน the csi migration

snapshot(update=...) ถูกลบ

kwarg update บน csi.CSI.snapshot() หายไปแล้ว เพื่อป้องกันไม่ให้อุปกรณ์ CSI ป้อน preview framebuffer ให้ออกจากการเลือกในเวลาสร้าง:

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

Commits: 9a8077827, 26b79a2c5

อาร์กิวเมนต์ expand ของ framebuffers() ถูกลบ

csi.CSI.framebuffers() — อาร์กิวเมนต์ตำแหน่งที่สาม (expand) หายไปแล้ว ลายเซ็นตอนนี้คือ framebuffers([count])

Commit: 86cb3a5de

โมดูล protocol (minor)

มีผลเฉพาะสคริปต์ที่ขับเคลื่อนลิงก์โฮสต์โดยตรง ดู protocol

timer_ms เปลี่ยนชื่อเป็น poll_ms

protocol.init() — อาร์กิวเมนต์ timer_ms ถูกเปลี่ยนชื่อเป็น poll_ms

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

Commits: 8a0635e8c, 95a290607

protocol.poll() ถูกลบ

งาน protocol ถูกกำหนดเวลาภายในตอนนี้ การเรียก protocol.poll() จะ raise AttributeError

Commit: 8a0635e8c

อาร์กิวเมนต์ config soft_reboot ถูกลบ

protocol.init() — อาร์กิวเมนต์ soft_reboot หายไปแล้ว ทรานสปอร์ตปัจจุบันทั้งหมดทนต่อ soft-reboot ดังนั้นพฤติกรรมนี้จึงเป็นแบบไม่มีเงื่อนไขตอนนี้

Commit: 0bf766aa2

โมดูล display (minor)

ผลลัพธ์ทีวีตอนนี้ผ่านออบเจ็กต์ display.TVDisplay แทนโมดูล tv แบบเดี่ยว display ยังได้รับ ioctl() ทั่วไป

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

โมดูล tof (behavior)

API เหมือนเดิม; ค่าเริ่มต้นและการจัดการข้อผิดพลาดเปลี่ยนแปลง ดู tof

ค่า timeout เริ่มต้นเปลี่ยนแปลง

tof.read_depth() และ tof.snapshot() (เรียกด้วย timeout=-1) ตอนนี้ค่าเริ่มต้นเป็น 100 ms แทนการรอไม่มีที่สิ้นสุด ส่งค่าที่ใหญ่กว่าอย่างชัดเจนหากต้องการพฤติกรรมเดิม

Commit: b6772b80d

การกู้คืนอัตโนมัติ

ไดรเวอร์ตอนนี้ hard-reset บัส I2C และเซนเซอร์เมื่อเกิดข้อผิดพลาดในการวัดระยะ/timeout ตัวอย่างไม่เรียก tof.reset() ใน exception handler อีกต่อไป — โค้ดผู้ใช้ที่ทำการกู้คืนแบบ manual ควรลบออก (จะขัดแย้งกับการกู้คืนอัตโนมัติใหม่)

Commits: b6772b80d, 80ffaa5c3

ไลบรารี ML (behavior)

API เหมือนเดิม ตัวเลขต่างกัน — ตรวจสอบ ML pipeline ที่ปรับแต่งไว้อีกครั้ง

การประมวลผลล่วงหน้าตอนนี้ stretch แทน letterbox

Normalization ตอนนี้ใช้ image.SCALE_ASPECT_IGNORE (stretch) แทน image.SCALE_ASPECT_EXPAND (letterbox) การโพสต์โปรเซส NMS ยังเปลี่ยนไปใช้การปรับขนาด x/y แบบอิสระ

Note

ผลกระทบ. เครื่องตรวจจับแบบ YOLO และ keypoint regressor โดยทั่วไปดีขึ้น ตัวอย่าง BlazeFace, BlazePalm, FaceLandmarks และ HandLandmarks ตอนนี้ต้องการการครอบตัดสี่เหลี่ยมจัตุรัสแบบ manual บน input ROI — สคริปต์ตัวอย่างถูกอัปเดตแล้ว; โค้ดผู้ใช้แบบกำหนดเองต้องทำเช่นเดียวกัน

Commit: 68dc29a33

helper ml.utils.mod() ถูกลบ

ulab 6.12.0 รองรับ % บน ndarray แบบเนทีฟ โค้ดที่ import mod จาก ml.utils ต้องใช้ a % b แทน

Commits: 35ece5728, 82fbd858c

การสร้าง / tooling (tooling)

ไม่มีสิ่งใดที่ส่งผลต่อสคริปต์ MicroPython การสร้างเฟิร์มแวร์จากซอร์สโค้ดตอนนี้ต้องการ OpenMV SDK ภายนอก (1.6.0, เดิมอยู่ใน tree) เครื่องมือสร้างใน tree หลายตัวถูกลบออกและ N6 ย้ายไปยัง TinyUSB stack; การ fork ต้นน้ำควรตรวจสอบประวัติ firmware repository — โดยเฉพาะลายเซ็น file_open() ที่ลบอาร์กิวเมนต์ buffered ออก

รายการตรวจสอบการย้ายโค้ด

สำหรับการย้ายโค้ดไปยัง v5.0.0 อย่างสะอาด งานทั่วไปคือ:

  1. แทนที่ import sensor ด้วย import csi; csi0 = csi.CSI() และแปลงการเรียก set_*/get_* ทุกครั้งไปยัง accessor ของ csi.CSI (the csi migration)

  2. ห่อหุ้มอาร์กิวเมนต์พิกัดของ img.draw_*, get_pixel() และ set_pixel() ด้วย tuple (the image module changes)

  3. ลบ () จาก attrtuple result accessor หากต้องการรูปแบบใหม่ที่เป็นสำนวน หรือปล่อยรูปแบบเก่าไว้เนื่องจาก attrtuple ยังรองรับ accessor แบบ callable (the image module changes)

  4. ตรวจสอบ find_line_segments(), get_regression() และการเลือก family ของ find_apriltags() (the image module changes)

  5. เปลี่ยนชื่อ timer_mspoll_ms ในการเรียก protocol.init(); ลบ protocol.poll() และ soft_reboot= (the protocol module changes)

  6. สำหรับ ML workflow: ตรวจสอบโมเดลที่ต้องการ input แบบ letterboxed อีกครั้ง (the ML library changes)