ระดับเนื้อหา: Overview / Implementation considerations
หลักการและการเลือกใช้
Python เป็นภาษาสำหรับจัดการภาพ ข้อมูล และเรียก runtime ของโมเดล งานคำนวณหนักมักทำในไลบรารี native เช่น NumPy หรือ OpenCV จึงต้องวัดทั้ง pipeline ไม่สรุปความเร็วจากตัวภาษา
ผู้อ่านทั่วไปอาจมอง Python เป็นตัวประสานงาน ตั้งแต่เปิดภาพ ตรวจความสมบูรณ์ เรียกวิธีวิเคราะห์ จนจัดผลให้ระบบอื่นเข้าใจ ไลบรารีคือชุดคำสั่งที่นำกลับมาใช้ได้ ส่วน runtime คือส่วนที่ประมวลผลโมเดล การเลือกภาษาอย่างเดียวไม่บอกว่าระบบจะตอบเร็วหรือทนต่อภาพเสียได้ เพราะยังมีขั้นรับส่งและตรวจข้อมูลอีกหลายส่วน
Array คือกลุ่มข้อมูลที่มีรูปร่างและชนิดค่า เช่น ภาพที่มีความสูง ความกว้าง และช่องสี Dtype ระบุชนิดตัวเลข ส่วน shape ระบุขนาดแต่ละแกน วิศวกรควรทำสัญญาการรับส่งระหว่างขั้นให้ชัด โดยเฉพาะ RGB กับ BGR ที่เรียงช่องสีต่างกัน รวมถึงค่าพิกเซลก่อนและหลังปรับสเกล เพื่อป้องกันผลผิดแบบเงียบที่ยังคำนวณต่อได้
เลื่อนแผนภาพซ้าย–ขวาเพื่อดูรายละเอียดครบทุกส่วน
ตัวอย่างในบริบทอุตสาหกรรม
ตัวอย่างเชิงออกแบบ: โปรแกรมอ่านภาพเกจ ตรวจขนาดและสี ส่งโมเดล แล้วคืนค่า หน่วย timestamp และสถานะ no-read เป็น schema เดียวกันก่อนส่งระบบข้อมูล
สมมติกล้องส่งภาพไม่ครบในบางครั้ง โปรแกรมควรแยกภาพเสียจากกรณีภาพสมบูรณ์แต่อ่านเข็มไม่ได้ การคืนค่าศูนย์แทนทั้งสองกรณีทำให้ผู้รับเข้าใจว่าเกจอยู่ที่ศูนย์จริง ควรคืนสถานะและเหตุผลประกอบ โดย timestamp หมายถึงเวลาถ่ายหรือเวลารับที่ระบุชัด ไม่ใช้เวลาส่งผลแทนเวลาของเหตุการณ์โดยไม่บอกความต่าง
วิศวกรใช้ภาพอ้างอิงขนาดเล็กตรวจตั้งแต่การเปิดแฟ้ม การสลับสี การตัดบริเวณ ไปจนถึงรูปแบบผล หากแปลง array ระหว่างไลบรารี ให้ตรวจว่ามีการคัดลอกหรือใช้หน่วยความจำร่วม เพราะการแก้ภาพในขั้นหนึ่งอาจเปลี่ยนข้อมูลของอีกขั้น ควรเก็บภาพต้นทางแยกจากภาพแสดงผล และไม่ให้ข้อผิดพลาดการส่งข้อความทำให้ข้อมูลการอ่านถูกบันทึกซ้ำโดยไร้ตัวระบุ
ขั้นตอนศึกษาและทดลอง
- 1 แยกส่วนรับภาพ preprocessing inference และส่งออกให้ทดสอบได้
- 2 ตรึง dependency และตรวจ dtype, RGB/BGR, shape ด้วยภาพ fixture
- 3 เพิ่ม timeout และการจัดการกล้องขาดการเชื่อมต่อโดยไม่ใช้ค่าค้างเป็นค่าใหม่
วิธีประเมินและนิยามผล
ทดสอบหน่วยของการแปลงค่ากับ integration test จากภาพถึง schema วัดเวลาส่วน I/O และ inference แยกกัน พร้อมทดสอบหน่วยความจำเมื่อรันต่อเนื่อง
การทดสอบหน่วยดูคำสั่งส่วนเล็ก เช่น การแปลงมุมเป็นค่า ส่วนการทดสอบเชื่อมต่อดูหลายส่วนทำงานร่วมกัน เช่น ภาพเข้าแล้วได้หน่วยและสถานะถูกต้อง ต้องมีทั้งกรณีปกติ ภาพว่าง รูปร่างผิด และค่าที่ไม่สามารถคำนวณได้ ไม่ตรวจแค่ตัวเลขสุดท้าย เพราะเวลาหรือสถานะผิดก็ทำให้ผู้ใช้ผลตีความเหตุการณ์ผิดได้เช่นกัน
แยกวัดเวลารอภาพ เวลาเตรียมข้อมูล และเวลาประมวลผลเพื่อหาคอขวดจริง ตรวจหน่วยความจำหลังทำงานซ้ำว่ามีภาพหรือคิวค้างสะสมหรือไม่ แล้วทดสอบการฟื้นเมื่อการเชื่อมต่อกลับมาโดยใช้ข้อมูลจำลองที่ควบคุมได้ การตรึงเวอร์ชันไลบรารีช่วยทำซ้ำการทดสอบ แต่ยังต้องตรวจผลเมื่อปรับรุ่นเพราะชนิดค่าและพฤติกรรมการแปลงอาจเปลี่ยน
ข้อจำกัดและกรณีผิดพลาด
การวนพิกเซลใน Python และการคัดลอก array อาจเป็นคอขวด ส่วน GIL ไม่ได้หมายความว่างาน native ทุกชนิดทำขนานไม่ได้
GIL เป็นกลไกควบคุมการทำงานของตัวแปลภาษาในบางรูปแบบการใช้งาน ไม่ใช่ข้อสรุปว่าส่วนคำนวณทุกชนิดใช้หลายแกนไม่ได้ การเพิ่มเธรดอาจช่วยงานรอรับส่งแต่ไม่ช่วยส่วนที่แย่งทรัพยากรเดียวกัน ควรวัดเส้นทางจริงก่อนปรับวิธีขนาน และตรวจว่าการเพิ่มผู้ทำงานไม่ทำให้ภาพสลับลำดับหรือใช้ผลของภาพเก่ากับเวลาใหม่
การจัดการข้อผิดพลาดแบบจับทั้งหมดแล้วคืนค่าปกติทำให้ระบบดูไม่ล้มแต่ซ่อนปัญหา ควรจำแนกข้อผิดพลาดที่ลองใหม่ได้กับข้อผิดพลาดของข้อมูลหรือการตั้งค่า การเพิ่มการบันทึกช่วยวินิจฉัยแต่เพิ่มการใช้พื้นที่และความเสี่ยงข้อมูลส่วนบุคคล จึงต้องกำหนดการเก็บและปิดบังข้อมูล พร้อมไม่บันทึกรหัสผ่านหรือรายละเอียดลับลงในข้อความตรวจระบบ
รายการตรวจสอบก่อนนำไปใช้
- มี lockfile หรือเวอร์ชัน dependency ชัดหรือไม่
- ตรวจภาพเสียและ NaN หรือไม่
- log ปิดบังข้อมูลส่วนบุคคลและไม่บรรจุ secret หรือไม่