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 ที่ไวต่อเวลาอีกครั้ง (การเปลี่ยนแปลงนาฬิกา)