7.4. การโหลดโมเดล

ml.Model อ่านไฟล์โมเดลจากแฟลช แยกวิเคราะห์โมเดล จัดสรร RAM ที่โครงข่ายต้องการระหว่างการอนุมาน และส่งคืนออบเจ็กต์ที่บรรจุทุกสิ่งที่สคริปต์ส่วนที่เหลือต้องรู้เกี่ยวกับโครงข่ายที่โหลดแล้ว

7.4.1. Constructor

Constructor รับเส้นทางและตัวประมวลผลหลัง (post-processor) แบบเสริม:

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

โมเดลบน /rom/ (ระบบไฟล์ที่อยู่ในแฟลช) จะถูกอ่านจากตำแหน่งเดิม: น้ำหนักของโครงข่ายยังคงอยู่ในแฟลชและโมเดลที่โหลดแล้วใช้ RAM เฉพาะขนาดของ tensor arena เท่านั้น โมเดลบน /sdcard/ จะถูกคัดลอกเข้า RAM เมื่อโหลด ดังนั้นค่าใช้จ่ายรวมคือขนาดไฟล์โมเดลบวกกับ tensor arena ทั้งสองเส้นทางใช้งานได้ โดยต้องพิจารณาการแลกเปลี่ยนด้าน RAM

หากมีไฟล์ .txt ในไดเรกทอรีเดียวกันที่มีชื่อฐานเหมือนกัน เนื้อหาของไฟล์นั้นจะถูกโหลดเข้า labels โดยอัตโนมัติ คีย์เวิร์ด postprocess= ลงทะเบียน callable ที่ predict() จะเรียกใช้หลังจากการอนุมานแต่ละครั้ง

7.4.2. คุณสมบัติแบบอ่านอย่างเดียว

โมเดลที่โหลดแล้วจะเปิดเผยชุดคุณสมบัติแบบอ่านอย่างเดียวจำนวนเล็กน้อย ซึ่งอธิบายโครงข่ายโดยไม่ต้องรันโครงข่าย

ไฟล์และหน่วยความจำ.

  • len -- ขนาดไฟล์โมเดลบนดิสก์ หน่วยเป็นไบต์

  • ram -- ขนาดของ tensor arena ที่โครงข่ายต้องการสำหรับการกระตุ้นค่ากลางระหว่างการอนุมาน หน่วยเป็นไบต์

เทนเซอร์อินพุต.

  • input_shape -- รายการของ tuple หนึ่งรายการต่อเทนเซอร์อินพุต ระบุรูปร่างที่โครงข่ายคาดหวัง โครงข่ายการมองเห็นจะมีอินพุตหนึ่งตัวที่มีรูปร่าง (1, H, W, C)

  • input_dtype -- รายการของรหัส dtype แบบอักขระเดี่ยว ('b' int8, 'B' uint8, 'h' int16, 'H' uint16, 'f' float32) หนึ่งรายการต่ออินพุต

  • input_scale และ input_zero_point -- พารามิเตอร์การ quantization ที่แปลงระหว่างอินพุตที่มีค่าจริงที่โครงข่ายถูกฝึกมาและการแทนค่าจำนวนเต็มที่ cam รันเทียบกัน

เทนเซอร์เอาต์พุต. เป็นภาพสะท้อนของชุดอินพุต: output_shape, output_dtype, output_scale, output_zero_point โครงข่ายการตรวจจับผลิตเทนเซอร์เอาต์พุตสองหรือสามตัว (กล่อง คะแนนความเชื่อมั่น บางครั้งมีความน่าจะเป็นของคลาส) โครงข่ายการจำแนกประเภทผลิตเทนเซอร์หนึ่งตัว

ข้อมูลเพิ่มเติม. labels คือรายการชื่อคลาสที่โหลดจากไฟล์ .txt ในไดเรกทอรีเดียวกัน หรือ None postprocess คือตัวประมวลผลหลังที่ลงทะเบียนไว้ หรือ None

7.4.3. การตรวจสอบ BlazeFace

การโหลดโมเดล BlazeFace ที่มาพร้อมเครื่องและพิมพ์คุณสมบัติแต่ละอย่างจะให้ตัวเลขจริง:

import ml
from ml.postprocessing.mediapipe import BlazeFace

model = ml.Model("/rom/blazeface_front_128.tflite",
                 postprocess=BlazeFace())

print("file size:    ", model.len, "bytes")
print("tensor arena: ", model.ram, "bytes")
print("input shape:  ", model.input_shape)
print("input dtype:  ", model.input_dtype)
print("input scale:  ", model.input_scale)
print("input zp:     ", model.input_zero_point)
print("output shape: ", model.output_shape)
print("output dtype: ", model.output_dtype)
print("output scale: ", model.output_scale)
print("output zp:    ", model.output_zero_point)

ตัวเลขเหล่านี้ระบุอินเทอร์เฟซของโครงข่ายอย่างชัดเจน: เทนเซอร์อินพุต int8 ขนาด (1, 128, 128, 3) หนึ่งตัว และเอาต์พุต int8 สองตัว -- ตัวหนึ่งสำหรับค่าสัมประสิทธิ์การถดถอยของกรอบล้อมรอบ อีกตัวสำหรับคะแนนความเชื่อมั่นต่อ anchor พารามิเตอร์การ quantization อธิบายว่าค่า int8 เหล่านั้นแมปกับค่า float จริงที่โครงข่ายถูกฝึกมาอย่างไร ตัวประมวลผลหลังใช้พารามิเตอร์เหล่านั้นเพื่อยกเลิก quantization ก่อนถอดรหัสกรอบล้อมรอบ

คุณสมบัติแต่ละอย่างเป็นแหล่งความจริงเดียวสำหรับสิ่งที่มันอธิบาย สคริปต์อ่าน input_shape เพื่อทราบว่าต้องบันทึกที่ความละเอียดใด อ่าน output_scale และ output_zero_point เพื่อถอดรหัสเทนเซอร์ด้วยตนเอง และอ่าน labels สำหรับชื่อคลาสที่อ่านได้โดยมนุษย์ -- ไม่มีการฮาร์ดโค้ด ไม่มีการสันนิษฐาน