7.16. สรุป¶
บทนี้ได้อธิบายส่วนประกอบต่าง ๆ ของ ml ที่แอปพลิเคชัน OpenMV ต้องใช้เมื่อมีขั้นตอนการอนุมานเป็นส่วนหนึ่งของไปป์ไลน์:
แนวคิด -- โครงข่ายประสาทเทียมคืออะไรในเชิงคณิตศาสตร์ (กองของตัวดำเนินการที่ฝึกได้ซึ่งแปลงเทนเซอร์หนึ่งไปยังอีกเทนเซอร์หนึ่ง) การเรียนรู้ของเครื่องเปลี่ยนแปลงอะไรเมื่อเทียบกับการประมวลผลภาพแบบคลาสสิก (อัลกอริทึมสรุปที่มนุษย์เขียนหายไป แทนที่ด้วยน้ำหนักที่เรียนรู้จากข้อมูลที่มีป้ายกำกับ) และโปรแกรมสาธิตเริ่มต้นที่รันตัวตรวจจับใบหน้าด้วยโค้ด Python เพียงไม่กี่บรรทัด
โมดูล ml -- อ็อบเจกต์
ml.Modelและคุณสมบัติสำหรับตรวจสอบเทนเซอร์อินพุตและเอาต์พุต พาธของไฟล์โมเดลที่รองรับ และตำแหน่งที่ไฟล์เหล่านั้นอยู่: พาร์ติชัน ROMFS แบบอ่านอย่างเดียวสำหรับการรันโดยตรงจากแฟลช หรือระบบไฟล์ MicroPython อื่น ๆ เมื่อโมเดลสามารถคัดลอกเข้า RAM ได้ในเวลาโหลดไปป์ไลน์การอนุมาน -- สามขั้นตอนที่
predict()รันตามลำดับ (ประมวลผลล่วงหน้า, ส่งเข้าเอนจิน, ประมวลผลหลัง) ตัวจัดการNormalizationสำหรับขั้นตอนแรก ตัวจัดการหลังประมวลผลสำหรับขั้นตอนที่สาม และคณิตศาสตร์การหาปริมาณที่เชื่อมเทนเซอร์จำนวนเต็มที่กล้องรันกลับไปยังตัวเลขค่าจริงที่โครงข่ายถูกฝึกมาเอนจินการอนุมาน -- TFLM (ตัวแปลความหมายตัวดำเนินการที่กล้องส่วนใหญ่ใช้), CMSIS-NN (ไลบรารีเคอร์เนล SIMD ที่อยู่ใต้มันบน Cortex-M) และ NPU (Arm's Ethos-U55 บน AE3 ที่จับคู่กับ Vela offline compiler, ST's Neural-ART บน N6 ที่จับคู่กับ STAI และ STEdgeAI) เอนจินถูกกำหนดโดยกล้อง สคริปต์ไม่ได้เลือกเอง
การถอดรหัสเอาต์พุต -- ตัวประมวลผลหลังที่แปลงเทนเซอร์เอาต์พุตดิบให้เป็นกรอบล้อมรอบ จุดสำคัญ หรือรายการแยกตามคลาส คลาส
NMSที่ยุบผู้สมัครที่ทับซ้อนกัน การอธิบาย YOLOv8 ที่แสดงวิธีทำให้การถอดรหัสรวดเร็วโดยกรองด้วยค่าขีดแบ่งก่อนการคำนวณย้อนกลับ และโปรโตคอลสำหรับเขียนตัวถอดรหัสเองเมื่อแคตตาล็อกไม่ครอบคลุมโมเดล
7.16.1. สิ่งที่พร้อมใช้งานแล้ว¶
สามสิ่งที่บทนี้เตรียมความพร้อมไว้:
การโหลดโมเดลที่ฝึกแล้วและรัน ทุกอย่างใน
/rom/ใช้งานได้โดยไม่ต้องเตรียมการเพิ่มเติม ส่วนสิ่งที่ส่งมาจากภายนอกเป็น.tfliteที่เข้ากันได้จะใช้งานได้หลังจากที่เครื่องมือออฟไลน์สำหรับกล้องเป้าหมาย (Vela สำหรับ AE3, STEdgeAI สำหรับ N6) ได้สร้างเลย์เอาต์ที่ถูกต้องแล้วการถอดรหัสเทนเซอร์เอาต์พุตใด ๆ เมื่อสถาปัตยกรรมอยู่ในแคตตาล็อก การเลือกตัวประมวลผลหลังที่เหมาะสมทำได้อย่างเป็นระบบ:
YoloV8สำหรับโมเดล YOLOv8,BlazeFaceสำหรับ BlazeFace และอื่น ๆ เมื่อไม่มีในแคตตาล็อก โปรโตคอล writing-your-own ครอบคลุมข้อตกลง และ YOLOv8 walkthrough เป็นเอกสารอ้างอิงที่ชัดเจนที่สุดที่ควรคัดลอกจากการวิเคราะห์ประสิทธิภาพ โมเดลที่รันที่ 30 FPS บน NPU อาจรันที่ 3 FPS บน Cortex-M7 อัตราส่วนขึ้นอยู่กับว่ากล้องสามารถยกส่วนใดของโครงข่ายออกจาก CPU ได้มากเพียงใด การหาปริมาณ การวางบน ROMFS การคอมไพล์ NPU และความครอบคลุมของตัวดำเนินการของเอนจินเป้าหมายคือสี่ตัวแปร และบทนี้ได้อธิบายแต่ละอย่างไว้แล้ว
7.16.2. การฝึกโมเดลของคุณเอง¶
บทนี้เริ่มต้นจากไฟล์ .tflite ที่ผ่านการฝึกมาแล้ว การสร้างไฟล์ดังกล่าวสำหรับงานที่กำหนดเอง -- ชุดคลาสวัตถุใหม่หรือตัวจำแนกที่สร้างขึ้นเพื่อวัตถุประสงค์เฉพาะ -- ไม่ได้หมายความว่าต้องสร้าง pipeline การฝึกด้วยมือ: บริการโฮสต์สองรายการครอบคลุมวงจรทั้งหมดตั้งแต่การรวบรวมและติดป้ายกำกับข้อมูลผ่านการฝึกไปจนถึงการส่งออกโมเดลที่กล้องสามารถโหลดได้
Edge Impulse -- แพลตฟอร์ม embedded-ML แบบครบวงจร บันทึกข้อมูลจากกล้อง ติดป้ายกำกับ ฝึกโมเดล และส่งออกไฟล์
.tfliteที่ผ่านการ quantize แล้วซึ่งพร้อมใช้งานกับเอนจินอนุมานของ OpenMVRoboflow -- การจัดการชุดข้อมูลและการใส่คำอธิบายประกอบพร้อมการฝึกแบบโฮสต์มุ่งเน้นการตรวจจับวัตถุ ส่งออกโมเดล YOLOv8 ที่ตัวประมวลผลภายหลัง
YoloV8ถอดรหัสได้โดยตรง
7.16.3. ML ผสานกับส่วนอื่น ๆ ของกล้อง¶
การอนุมานแทบไม่เคยรันแบบโดดเดี่ยว โมดูล image ถ่ายภาพและประมวลผลล่วงหน้าเฟรม โมดูล ml รันโครงข่าย และ ulab.numpy ทำงานตัวเลขใด ๆ ที่ทั้งสองฝั่งไม่มีฟังก์ชันในตัว สคริปต์การตรวจจับทั่วไปรวมทั้งสามส่วน: ถ่ายภาพด้วย csi ปรับเฟรมเพิ่มเติมด้วย image รัน predict() ประมวลผลผลลัพธ์ด้วยโมดูลที่เหมาะสมจาก ml.postprocessing และใช้ ulab.numpy สำหรับคณิตศาสตร์เฉพาะทางที่แอปพลิเคชันต้องการเพิ่มเติมจากกรอบล้อมรอบที่ตัวประมวลผลหลังส่งคืนมา ทั้งสามโมดูลใช้โมเดลหน่วยความจำเดียวกัน ขอบเขตระหว่างกันคือ zero-copy ในทุกที่ที่เป็นไปได้