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()สำหรับการเรนเดอร์กล้อง eventML 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)crc—crc.crc16()และcrc.crc32()เร่งด้วยฮาร์ดแวร์พร้อม software fallback บน OpenMV N6 และ AE3image.Image.draw_image()ได้รับคีย์เวิร์ดtransform=ใหม่ (เมทริกซ์ndarrayfloat 2 มิติสำหรับการบิดเบือนแบบ affine/perspective เร่งด้วย GPU บน STM32 และ Alif) โดย transform เดียวกันนี้ใช้ได้ในการแปลงภาพด้วยdraw_event_histogram()— เรนเดอร์ฮิสโตแกรมของกล้อง eventโหมด RAW event ของ GenX320 —
csi.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/vflipProfiler บนอุปกรณ์ — ตัวนับรอบ/เหตุการณ์ 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) ไม่มีการเปลี่ยนแปลง
โมดูล buzzer ถูกลบออก (minor)#
โมดูล buzzer ถูกลบออกจาก port STM32 และ i.MX RT ให้ขับ buzzer ด้วย machine.PWM แทน; เพิ่มตัวอย่าง buzzer Pure Thermal โดยใช้ PWM
omv.disable_fb() ถูกลบออก (minor)#
ฟังก์ชัน omv.disable_fb() ถูกลบออก; การสตรีมบัฟเฟอร์เฟรมถูกควบคุมผ่าน camera API แล้ว สคริปต์ desktop RPC เดิมที่อาศัยมันก็ถูกลบออกด้วย
csi เป็นโมดูลใหม่ — API ยังไม่ถูกตรึง (minor)#
โมดูล csi ถูกนำเสนอใน v4.8.0 และ API มีการพัฒนาระหว่างการออกรุ่น: csi.fb() ถูกลบออก และ csi.CSI.snapshot() (image=...) ตอนนี้ต้องการภาพที่ แก้ไขได้ และวาด/ปรับขนาดเฟรมที่ capture ลงในภาพนั้นแทนการ deep copy แบบ raw ผู้ที่รับรุ่นใหม่ของโมดูลนี้ก่อนใครควรทดสอบใหม่; sensor API เดิมไม่ได้รับผลกระทบ
โหมดสตรีมและ close() ของ image.ImageIO (minor)#
image.ImageIO — อาร์กิวเมนต์ mode ตอนนี้รับเฉพาะตัวพิมพ์เล็ก 'r' / 'w' (ตัวพิมพ์ใหญ่จะถูกปฏิเสธพร้อมข้อความแสดงข้อผิดพลาดที่อัปเดต) และการเปิดด้วย 'w' จะ truncate/สร้างไฟล์ใหม่เสมอแทนที่จะรักษาสตรีมที่มีอยู่ ImageIO.close() ตอนนี้ทำงานแบบ idempotent (การปิดสตรีมที่ปิดแล้วจะไม่ raise) และคืนค่า None แทนออบเจกต์สตรีม
ค่าที่ส่งกลับของ 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 สำหรับรายละเอียด
รายการตรวจสอบการย้าย#
สำหรับการย้ายไปยัง v4.8.0 อย่างสะอาด งานทั่วไปคือ:
หากคุณใช้ FLIR Lepton ผ่าน
firให้เปลี่ยนไปใช้การ capture เป็น sensor กล้อง (การเปลี่ยนแปลง fir/Lepton)แทนที่การใช้
buzzerด้วยmachine.PWM(การลบ buzzer)ลบการเรียก
omv.disable_fb()(การลบ omv.disable_fb())สำหรับ
image.ImageIO: ใช้ตัวพิมพ์เล็ก'r'/'w'และคาดหวังว่า'w'จะ truncate (การเปลี่ยนแปลง ImageIO)สำหรับ callback ML post-process กำหนดเอง: dequantize การอ้างอิง raw tensor เอง หรืออาศัยเส้นทาง float เริ่มต้น (การเปลี่ยนแปลง callback)
ตรวจสอบสคริปต์ใด ๆ ที่ขับนาฬิกา sensor สำหรับการ capture ที่ไวต่อเวลาอีกครั้ง (การเปลี่ยนแปลงนาฬิกา)