v4.8.0#

v4.8.0 เป็นรุ่นที่มีฟีเจอร์หลักสำคัญ ไฮไลต์ได้แก่: โมดูลกล้อง csi แบบคลาสใหม่พร้อมรองรับหลายกล้อง, บอร์ด OpenMV N6 (STM32N6) พร้อม Neural-ART NPU, แบ็กเอนด์การอนุมานด้วย NPU, โหมด RAW event ของกล้อง GenX320, โมดูล crc ใหม่, ไลบรารี ML post-processing ที่จัดใหม่, และ MicroPython 1.26 นอกจากนี้ยังลบ API เดิมบางส่วน ได้แก่ โมดูล buzzer และการควบคุม FLIR Lepton ในโมดูล fir — โปรดอ่านการเปลี่ยนแปลงที่ทำให้โค้ดเดิมใช้ไม่ได้ด้านล่าง

ไฮไลต์#

  • โมดูลกล้อง csi ใหม่ — API แบบคลาส csi.CSI พร้อมรองรับกล้องหลายตัวพร้อมกัน นำเสนอควบคู่กับโมดูล sensor เดิม

  • OpenMV N6 — บอร์ด STM32N6 พร้อม Neural-ART NPU, triple buffering, Soft-CSI และโมดูล ToF

  • การอนุมานด้วย NPU — แบ็กเอนด์ ST Neural-ART (STAI) สำหรับการอนุมานโมเดลที่เร่งด้วยฮาร์ดแวร์

  • โหมด event ของ GenX320 — เอาต์พุต RAW event พร้อม draw_event_histogram() สำหรับการเรนเดอร์กล้อง event

  • ML post-processing ที่จัดใหม่ — แพ็กเกจย่อยของผู้จำหน่าย (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) พร้อมตัวตรวจจับ BlazeFace / BlazePalm / มือและจุดสำคัญบนใบหน้าใหม่

  • โมดูล crc ใหม่ — CRC-16 / CRC-32 เร่งด้วยฮาร์ดแวร์

  • MicroPython อัปเดตเป็น 1.26.0

  • การเปลี่ยนแปลงที่ทำให้โค้ดเดิมใช้ไม่ได้: โมดูล buzzer และการควบคุม Lepton ในโมดูล fir ถูกลบออก (Lepton กลายเป็นกล้องปกติแล้ว) ดู การเปลี่ยนแปลง fir/Lepton และ การลบ buzzer

ฟีเจอร์ใหม่#

  • โมดูลกล้อง csi ใหม่ — ออบเจกต์ csi.CSI แบบคลาสพร้อมรองรับกล้องพร้อมกันหลายตัว (สูงสุดสามตัวบน N6), สแนปช็อตแบบ non-blocking, ขนาดเฟรม (w, h) กำหนดเองได้, และ print() / repr ที่ให้ข้อมูลครบถ้วน นำเสนอควบคู่กับโมดูล sensor เดิม (ไม่ใช่ตัวแทนแบบ drop-in)

  • crccrc.crc16() และ crc.crc32() เร่งด้วยฮาร์ดแวร์พร้อม software fallback บน OpenMV N6 และ AE3

  • image.Image.draw_image() ได้รับคีย์เวิร์ด transform= ใหม่ (เมทริกซ์ ndarray float 2 มิติสำหรับการบิดเบือนแบบ affine/perspective เร่งด้วย GPU บน STM32 และ Alif) โดย transform เดียวกันนี้ใช้ได้ในการแปลงภาพด้วย

  • draw_event_histogram() — เรนเดอร์ฮิสโตแกรมของกล้อง event

  • โหมด RAW event ของ GenX320csi.IOCTL_GENX320_SET_MODE พร้อม csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, ค่าคงที่ประเภท event และสคริปต์ตัวอย่างใหม่

  • ML — แบ็กเอนด์ NPU ST Neural-ART (STAI); ml.Model ได้รับคีย์เวิร์ด postprocess= (post-processor ทำงานอัตโนมัติภายใน predict() แม้ไม่มี callback); ml.postprocessing ถูกจัดใหม่เป็นแพ็กเกจย่อยของผู้จำหน่าย ได้แก่ ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo), และ ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — ชื่อแบบ snake_case เดิมยังคงเป็น alias; เพิ่ม ml.utils.draw_keypoints() และ ml.utils.draw_skeleton(); โมเดล ROMFS ที่รวมมาเพิ่มขึ้น (BlazeFace, YOLO-LC, YOLOv8n, landmark ของฝ่ามือ/มือ/ใบหน้า)

  • audio — อินพุตไมโครโฟนดิจิทัล MDF บน STM32N6

  • จอแสดงผล — ไดรเวอร์ SSD1351 OLED และตัวอย่าง; คอนโทรลเลอร์ SPIDisplay สามารถแทนที่คำสั่ง init ได้; ตัวสร้าง SPI display ได้รับคีย์เวิร์ด hmirror / vflip

  • Profiler บนอุปกรณ์ — ตัวนับรอบ/เหตุการณ์ SysTick + Armv8.1-M PMU พร้อม instrumentation ระดับฟังก์ชัน อ่านได้ผ่านลิงก์ debug (pyopenmv ได้รับการรองรับ profiling และสัญลักษณ์ ELF)

  • รองรับ sensor ใหม่ — PixArt PS5520; FLIR BOSON บน OpenMV H7 Plus; GenX320 auto-detect

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

  • MicroPython อัปเดตเป็น 1.26.0

  • การเริ่มต้นกล้อง — นาฬิกา sensor ถูกแยกออกจากสถานะ CSI, การตรวจจับกล้องตอนบูตเร็วขึ้น (ลองการกำหนดค่าที่ใช้บ่อยที่สุดก่อน) และนาฬิกาเริ่มต้นของ OpenMV 3 OV7725 ได้รับการแก้ไขแล้ว

  • คุณภาพภาพ — การแก้ไข gamma ด้วย software ISP (Alif และ STM32) และการแก้ไขพิกเซลเสีย (STM32) เปิดใช้งานโดยค่าเริ่มต้น; sensor PAG7936 และ PS5520 ได้รับการควบคุม auto-white-balance

  • ประสิทธิภาพimage.Image.to_ndarray() เร่งด้วย Helium SIMD และ FOMO post-processor ถูก vectorize ด้วย ulab

  • ไดรเวอร์ FLIR Lepton เขียนใหม่ เพื่อรับเฟรมแบบ asynchronous ในเบื้องหลัง — การหมุน/transpose ใช้งานได้แล้ว, การวาดขยายแบบ bilinear และการ reset เร็วขึ้น

  • ปริมาณงาน Capture — i.MX RT1062 CSI ใช้ DMA offload เต็มรูปแบบแล้ว และ STM32 N6 มี draw_image() ด้วย hardware-GPU

การแก้ไขบัก#

กล้องและ sensor:

  • แก้ไขโหมด RGB565 / GRAYSCALE / BAYER / YUV422 บน sensor STM32, PAJ6100 บน OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565 และการกำหนดค่า mono / RGB-YUV ของ N6 CSI; กล้องทดสอบซอฟต์แวร์ตอนนี้ reset ได้อย่างแน่นอน

  • Auto-white-balance ไม่ทำให้ภาพเป็นสีเขียวอีกต่อไปที่อัตราเฟรมต่ำหรือแปรผัน (ค่าเฉลี่ยเคลื่อนที่ 250 มิลลิวินาทีแทนการสุ่มตัวอย่างทุก 100 เฟรม) และแก้ไขการกะพริบของความสว่าง PS5520 แล้ว

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

  • แก้ไขข้อบกพร่องในการเรนเดอร์เส้น; image.Image.flush() ตอนนี้ flush บัฟเฟอร์ JPEG ของภาพที่ถูกเรียก; Normalization ตอนนี้ใช้ mean/stdev กับ float input; การจัดสรรภาพจากไฟล์ได้รับการแก้ไขแล้ว

การ capture ของกล้อง:

  • แก้ไขความเสียหายของภาพร้ายแรงบนการถ่ายโอนแบบ non-JPEG (frame interrupt เปิดใช้งานเฉพาะในโหมด JPEG เท่านั้น), รองรับ JPEG mode-3 และการล็อกของ DMA line-size และ small-buffer บน STM32; การซิงค์ VOSPI / Lepton เชื่อถือได้มากขึ้น โดยเฉพาะบน N6

เบ็ดเตล็ด:

  • omv.board_id() คืนค่า UID ที่ถูกต้องบน RT1060; YoloV2 ไม่ crash เมื่อสร้างโดยไม่ระบุ anchors อีกต่อไป

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

  • OpenMV N6 — STM32N6 พร้อม Neural-ART NPU, triple buffering, SPI LCD/TV output, Soft-CSI, โมดูล tof และโมเดล ROMFS ที่รวมมา

  • Arduino GIGA — เอาต์พุตจอแสดงผล MIPI DSI

  • Sensor ใหม่ — PixArt PS5520; FLIR BOSON บน OpenMV H7 Plus; GenX320 auto-detect

  • OpenMV Pure Thermal — FLIR Lepton กลายเป็น sensor กล้อง (รอง) ปกติแล้ว

  • Alif AE3 — การแก้ไข gamma ด้วย software ISP, โมดูล crc และการแก้ไข SPI

การเปลี่ยนแปลง API ที่ทำให้โค้ดเดิมใช้ไม่ได้#

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

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

  • major — สคริปต์ส่วนใหญ่ที่ใช้มันต้องแก้ไข

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

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

  • tooling — ส่งผลเฉพาะเครื่องมือ host / การ build จากซอร์ส

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

FLIR Lepton ย้ายออกจากโมดูล fir (major)#

FLIR Lepton ตอนนี้ถูกขับเคลื่อนเป็น sensor กล้องปกติแทนที่จะผ่านโมดูล fir การควบคุม Lepton ถูกลบออกจาก fir: ประเภท FIR_LEPTON และเมธอด radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() และ trigger_ffc() ถูกลบออก ให้ capture Lepton เหมือนกล้องอื่น ๆ (ปรากฏเป็น sensor รองบน OpenMV Pure Thermal); ตัวอย่าง Pure Thermal ถูกเขียนใหม่เป็น API ใหม่ sensor fir ที่ไม่ใช่ Lepton (Grid-EYE, MLX, AMG8833) ไม่มีการเปลี่ยนแปลง

Commits: bacfb7aeb, 117710566, 592a22902, 1a614202e

โมดูล buzzer ถูกลบออก (minor)#

โมดูล buzzer ถูกลบออกจาก port STM32 และ i.MX RT ให้ขับ buzzer ด้วย machine.PWM แทน; เพิ่มตัวอย่าง buzzer Pure Thermal โดยใช้ PWM

Commits: ccb947924, 444120f2d

omv.disable_fb() ถูกลบออก (minor)#

ฟังก์ชัน omv.disable_fb() ถูกลบออก; การสตรีมบัฟเฟอร์เฟรมถูกควบคุมผ่าน camera API แล้ว สคริปต์ desktop RPC เดิมที่อาศัยมันก็ถูกลบออกด้วย

Commits: 84c3db58a, 6fe99051c

csi เป็นโมดูลใหม่ — API ยังไม่ถูกตรึง (minor)#

โมดูล csi ถูกนำเสนอใน v4.8.0 และ API มีการพัฒนาระหว่างการออกรุ่น: csi.fb() ถูกลบออก และ csi.CSI.snapshot() (image=...) ตอนนี้ต้องการภาพที่ แก้ไขได้ และวาด/ปรับขนาดเฟรมที่ capture ลงในภาพนั้นแทนการ deep copy แบบ raw ผู้ที่รับรุ่นใหม่ของโมดูลนี้ก่อนใครควรทดสอบใหม่; sensor API เดิมไม่ได้รับผลกระทบ

Commits: 0bc0385eb, 8cd7a309f

โหมดสตรีมและ close() ของ image.ImageIO (minor)#

image.ImageIO — อาร์กิวเมนต์ mode ตอนนี้รับเฉพาะตัวพิมพ์เล็ก 'r' / 'w' (ตัวพิมพ์ใหญ่จะถูกปฏิเสธพร้อมข้อความแสดงข้อผิดพลาดที่อัปเดต) และการเปิดด้วย 'w' จะ truncate/สร้างไฟล์ใหม่เสมอแทนที่จะรักษาสตรีมที่มีอยู่ ImageIO.close() ตอนนี้ทำงานแบบ idempotent (การปิดสตรีมที่ปิดแล้วจะไม่ raise) และคืนค่า None แทนออบเจกต์สตรีม

Commits: 715c4cbba, 21ceec422

ค่าที่ส่งกลับของ BlazeFace / BlazePalm (minor)#

post-processor BlazeFace และ BlazePalm (ใหม่ในรุ่นนี้) ตอนนี้คืนรายการกรอบล้อมรอบเดียวแทนรายการต่อคลาสเต็ม — ผู้เรียกจะ index ผลลัพธ์โดยตรงแทน [0]

Commit: 75e16b573

ML post-processor callback รับ raw tensor (behavior)#

callback post-process ของ ml.Model predict() ตอนนี้รับการอ้างอิง output-tensor แบบ raw (quantized) แทน ndarray float ที่แปลงล่วงหน้า — เพื่อหลีกเลี่ยงการใช้หน่วยความจำหมดบนโมเดลขนาดใหญ่ หากไม่มี callback ระบุ ndarray float ยังคงถูกส่งกลับ callback กำหนดเองต้อง dequantize tensor เอง (post-processor ในตัวทำสิ่งนี้อยู่แล้ว)

Commit: 84e6ee650

นาฬิกา sensor แยกจากสถานะ CSI (behavior)#

นาฬิกา sensor ตอนนี้เป็นอิสระจากสถานะ CSI set_clock / set_frequency กำหนดค่านาฬิกาใหม่เฉพาะเมื่อความถี่ที่ร้องขอต่างจากค่าที่ยอมรับได้ และ get_clk_frequency รับ boolean เพื่อคืนความถี่ที่แน่นอน (แทนค่าที่กำหนด) นาฬิกาเริ่มต้นคือ 24 MHz บน OpenMV N6 และ AE3 ดังนั้นไม่จำเป็นต้องเรียก set_clock() ตอนบูต สคริปต์ที่สลับนาฬิกาสำหรับการ capture ที่ไวต่อเวลาควรตรวจสอบสมมติฐานใหม่

Commits: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

โปรโตคอล USB debug และ firmware target (tooling)#

ไม่มีสิ่งใดนี้ส่งผลต่อสคริปต์ MicroPython คำสั่ง USBDBG ที่ล้าสมัย (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) ถูกลบออก และคำสั่งที่ไม่รองรับจาก IDE รุ่นเก่าตอนนี้ถูก flush แทนการ crash บอร์ด TinyUSB เมื่อเชื่อมต่อ; firmware target UVC STM32 เดิมถูกลบออก เครื่องมือ host เก่าควรอัปเดต; ดูประวัติ firmware repository สำหรับรายละเอียด

Commits: 90bd11e93, 657c9a632, 35182f035

รายการตรวจสอบการย้าย#

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

  1. หากคุณใช้ FLIR Lepton ผ่าน fir ให้เปลี่ยนไปใช้การ capture เป็น sensor กล้อง (การเปลี่ยนแปลง fir/Lepton)

  2. แทนที่การใช้ buzzer ด้วย machine.PWM (การลบ buzzer)

  3. ลบการเรียก omv.disable_fb() (การลบ omv.disable_fb())

  4. สำหรับ image.ImageIO: ใช้ตัวพิมพ์เล็ก 'r'/'w' และคาดหวังว่า 'w' จะ truncate (การเปลี่ยนแปลง ImageIO)

  5. สำหรับ callback ML post-process กำหนดเอง: dequantize การอ้างอิง raw tensor เอง หรืออาศัยเส้นทาง float เริ่มต้น (การเปลี่ยนแปลง callback)

  6. ตรวจสอบสคริปต์ใด ๆ ที่ขับนาฬิกา sensor สำหรับการ capture ที่ไวต่อเวลาอีกครั้ง (การเปลี่ยนแปลงนาฬิกา)