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)