7.12. ตัวประมวลผลหลัง (Post-processors)¶
โครงข่ายการตรวจจับไม่ได้ส่งออกกรอบโดยตรง แต่ส่งออกเทนเซอร์หนึ่งตัวหรือมากกว่า ซึ่งเค้าโครงขึ้นอยู่กับสถาปัตยกรรมที่โมเดลได้รับการฝึก -- เทนเซอร์สองมิติของการทำนายผู้สมัครสำหรับตัวตรวจจับในตระกูล YOLO คู่เทนเซอร์ (boxes, scores) สำหรับตัวตรวจจับ MediaPipe หรือรายการพิกัด keypoint แบบแบนสำหรับโครงข่ายท่าทาง แอปพลิเคชันไม่สามารถอ่านสิ่งเหล่านี้ได้โดยตรง สิ่งที่ต้องการ -- รายการกรอบ รายการ keypoint ข้อมูลแบ่งตามคลาส -- ต้อง ถอดรหัส ออกจากเทนเซอร์ดิบ
ตัวถอดรหัสนั้นคือ ตัวประมวลผลหลัง (post-processor) โมดูล ml.postprocessing จัดกลุ่มพวกมันตาม ecosystem ต้นทาง
7.12.1. Darknet¶
ml.postprocessing.darknet ถอดรหัสโมเดลจากยุค YOLO ดั้งเดิม YOLO v2 แนะนำแนวคิด grid และ anchor ที่ตัวตรวจจับรุ่นหลังส่วนใหญ่รับช่วงต่อในรูปแบบใดรูปแบบหนึ่ง ดังนั้นเค้าโครง v2 จึงเป็นจุดเริ่มต้นที่ชัดเจนที่สุด
YOLO v2 เริ่มต้นด้วยการแบ่งภาพอินพุตออกเป็นตารางหยาบ -- เค้าโครง 13x13 สำหรับอินพุต 416 พิกเซลมาตรฐาน เล็กกว่าสำหรับโมเดลขนาดเล็ก -- และฝึกโครงข่ายให้แต่ละเซลล์ตารางรับผิดชอบการตรวจจับวัตถุที่มีจุดศูนย์กลางอยู่ภายในเซลล์นั้น เค้าโครงเชิงพื้นที่ของเทนเซอร์ขาออกสะท้อนเค้าโครงของอินพุต ตำแหน่งหนึ่งในขาออกต่อหนึ่งเซลล์ในภาพ
ที่แต่ละเซลล์ตาราง โครงข่ายไม่ได้ทำนายกรอบจากอากาศ แต่เลือกจากรูปร่างอ้างอิงที่กำหนดไว้ล่วงหน้าหลายรูปร่างที่เรียกว่า anchor -- คู่ (width, height) คงที่ที่ได้มาจากการคลัสเตอร์ขนาดกรอบในชุดฝึกเพื่อครอบคลุมวัตถุทั่วไปที่โมเดลคาดว่าจะเห็น งานของโครงข่ายที่แต่ละเซลล์คือการทำนาย สำหรับแต่ละ anchor ออฟเซ็ตเล็กน้อยของจุดศูนย์กลางกรอบภายในเซลล์ สเกลบนความกว้างและความสูงของ anchor คะแนน objectness (ความน่าจะเป็นที่มีบางอย่างอยู่) และเวกเตอร์ความน่าจะเป็นต่อคลาส ตาราง 13x13 พร้อม 5 anchor เริ่มต้นและ 20 คลาส จะส่งออก 13 * 13 * 5 * (4 + 1 + 20) = 21,125 ตัวเลขต่อการอนุมานหนึ่งครั้ง
YoloV2 ถอดรหัสเค้าโครงนั้น โดยวนซ้ำเซลล์ ใช้ออฟเซ็ตและสเกลของแต่ละ anchor เพื่อกู้คืนพิกัดกรอบสัมบูรณ์ รวม objectness กับความน่าจะเป็นต่อคลาสเพื่อได้คะแนนต่อคลาส กำหนดค่าขีดแบ่ง และผลักผู้รอดพ้นไปยัง NMS คลาสนี้รับอาร์กิวเมนต์ตัวสร้าง anchors= เมื่อโมเดลถูกฝึกกับตาราง anchor แบบกำหนดเอง และใช้ค่าเริ่มต้นในตัวหากไม่มี ตัวแปรที่ปรับแต่งสำหรับชุดคลาสเฉพาะมาในโมดูลย่อยเดียวกัน
7.12.2. Ultralytics¶
ml.postprocessing.ultralytics ถอดรหัส YOLO รุ่นใหม่ YoloV8 อ่านขาออก column-major ที่แต่ละคอลัมน์เป็นการทำนาย anchor หนึ่งรายการที่มีพิกัดกรอบและเวกเตอร์คะแนนต่อคลาส -- ช่อง objectness ที่ขาออก YOLO รุ่นก่อนมีถูกตัดออกใน v8 และคะแนนคลาสยืนอยู่คนเดียว YOLOv8 walkthrough อธิบายการถอดรหัสทีละเทนเซอร์ Ultralytics รุ่นเก่ากว่ามาในโมดูลย่อยเดียวกันสำหรับโมเดลที่ฝึกกับเค้าโครงของพวกมัน
7.12.3. MediaPipe¶
ml.postprocessing.mediapipe ถอดรหัสตระกูลอุปกรณ์น้ำหนักเบาของ Google BlazeFace คือตัวตรวจจับใบหน้าที่ครอบคลุมใน hello-blazeface ซึ่งเป็นตัวตรวจจับแบบ anchor ที่รวดเร็วซึ่งส่งออกกรอบและพิกัด landmark หกจุดต่อใบหน้า ส่งคืนเป็น tuple (box, score, keypoints) พร้อม landmark ที่แนบมากับแต่ละกรอบแทนที่จะเป็นรายการขาออกแยกต่างหาก โมเดลการตรวจจับมือ landmark และท่าทางจากตระกูลเดียวกันมาพร้อมกันและมีรูปร่างการส่งคืนแบบ attached-keypoint เหมือนกัน
7.12.4. การเลือกตัวที่เหมาะสม¶
ตัวประมวลผลหลังที่ถูกต้องถูกกำหนดโดยสถาปัตยกรรมที่โมเดลได้รับการฝึก ไม่ใช่โดยสิ่งที่แอปพลิเคชันต้องการ ไฟล์ .tflite ของ YOLOv8 จะถอดรหัสได้ถูกต้องผ่าน YoloV8 เท่านั้น ไฟล์ .tflite ของ BlazeFace ผ่าน BlazeFace เท่านั้น การเลือกตัวประมวลผลหลังเป็นส่วนหนึ่งของการเลือกโมเดล เมื่อสถาปัตยกรรมของโมเดลไม่มีตัวแทนในตัวประมวลผลหลังที่ส่งมา การเขียนของตัวเอง นั้นทำได้ไม่ยาก
โครงข่ายการจำแนกประเภทเป็นข้อยกเว้น เทนเซอร์ขาออกเดียวของพวกมันคือสิ่งที่แอปพลิเคชันต้องการอยู่แล้ว -- รายการคะแนนต่อคลาส -- และไม่ต้องการตัวประมวลผลหลัง การโหลดโมเดลโดยไม่มี postprocess= และอ่านผลลัพธ์การทำนายเป็น ndarray แบบแบนคือแนวทางที่ถูกต้อง ตามที่ tensor I/O ครอบคลุมไว้