จึงทดลองปรับปรุงการออกแบบตามลักษณะการใช้ Multiprocessing โดยแบ่งเป็น 4 Process และแต่ละ Process จะทำงานแบบ Pipeline ดังนี้
1. Update ID แยกมาจาก update_old_id ใช้สำหรับปรับค่า old_id ที่ใช้ในการเปรียบเทียบกับข้อมูลตัวปัจจุบัน
2. Image Processing ปรับปรุงมาจาก get_contours โดยจะทำการเก็บภาพ depth image มาประมวลผลทั้ง gaussian blur, erode, dilate, threshold และหา contour ของภาพทำการใส่เข้า queue และส่งไปที่ process ถัดไป
3. Blob Tracking เป็นการรวมกันของ blob_tracking และ blob_buffer เพื่อนำ contour จาก image processing มาทำการใส่ blob_id และเก็บ centroid ของ blob สำหรับใช้คำนวณหาการเคลื่อนที่
4. Check Gesture and Mapping เป็นการรวมกันของ check_gesture และ keymapping เข้าด้วยกัน โดยจะนำ centroid ของ blob ตัวก่อนหน้าและตัวปัจจุบันมาทำการคำนวณหาทิศทางการเคลื่อนที่ และนำผลที่ได้ไปใช้ในการ map เข้ากับคำสั่งที่เราต้องการ
1. Update ID แยกมาจาก update_old_id ใช้สำหรับปรับค่า old_id ที่ใช้ในการเปรียบเทียบกับข้อมูลตัวปัจจุบัน
2. Image Processing ปรับปรุงมาจาก get_contours โดยจะทำการเก็บภาพ depth image มาประมวลผลทั้ง gaussian blur, erode, dilate, threshold และหา contour ของภาพทำการใส่เข้า queue และส่งไปที่ process ถัดไป
3. Blob Tracking เป็นการรวมกันของ blob_tracking และ blob_buffer เพื่อนำ contour จาก image processing มาทำการใส่ blob_id และเก็บ centroid ของ blob สำหรับใช้คำนวณหาการเคลื่อนที่
4. Check Gesture and Mapping เป็นการรวมกันของ check_gesture และ keymapping เข้าด้วยกัน โดยจะนำ centroid ของ blob ตัวก่อนหน้าและตัวปัจจุบันมาทำการคำนวณหาทิศทางการเคลื่อนที่ และนำผลที่ได้ไปใช้ในการ map เข้ากับคำสั่งที่เราต้องการ
หลังจากทำการทดสอบดูพบว่าส่วนของการตรวจจับภาพนั้นไม่ทำงาน แต่กลับแสดงผลเพียงการทำ update_id และ keymap
จากปัญหาที่เกิดขึ้น จึงได้ทำการทดลองตรวจสอบเวลาการทำงานของทั้ง 4 ฟังค์ชันในรูปแบบการเรียกใช้ฟังค์ชันแบบไม่ต้องใช้ process พบว่าเวลาการทำงานของ image processing และ blob tracking นั้นใช้เวลาในการทำงานเป็นหน่วย millisecond ซึ่งมากกว่า update id และ keymap ซึ่งใช้เวลาในการทำงานเป็นหน่วย microsecond
จากผลเวลาดังกล่าวจึงได้ทำการสันนิษฐานปัญหาที่เกิดขึ้นว่า
- เนื่องจากเวลาการทำงานที่ต่างกันทำให้ข้อมูลตัวแปรต่างๆนั้นเกิดความคลาดเคลื่อนไปเพราะมีตัวแปรหลายตัวที่เป็น Global variable ทำให้ตัวแปรตัวเดียวกันถูกเรียกใช้พร้อมกันมากกว่า 1 ฟังก์ชัน เมื่อมีการเปลี่ยนแปลงค่าของตัวแปรในฟังค์ชันแรก ตัวแปรตัวเดียวกันในฟังค์ชันที่ 2 จึงถูกเปลี่ยนค่าไปด้วย
จึงทำการตรวจสอบตัวแปรที่ใช้ในทุกๆฟังค์ชันของ Process จะพบว่า มีตัวแปรที่เกี่ยวโยงกัน คือ blobs, blob_buffers, old_id และ blob_movement ซึ่งตัวแปรทั้ง 4 ตัวนี้จะใช้งานร่วมกันระหว่าง 3 Processes คือ Update ID, Image Processing และ Check Gesture ทำให้เมื่อแยกกันทำงานส่งผลตัวแปลแต่ละตัวเกิดความคลาดเคลื่อนไป และในขณะเดียวกัน contours ที่ใช้สำหรับสร้าง blobs นั้นมีการใช้เพียงแค่ 2 Processes คือ Image Processing และ Blob Tracking
จากผลที่ได้ จึงทำการปรับเปลี่ยนโครงสร้างภายใน Process ใหม่ โดยที่แบ่งเป็น 2 Processes คือ Image Processing และกลุ่มของฟังค์ชันเรียงตามลำดับการทำงานคือ Update ID, Blob Tracking และ Check Gesture และใช้ Queue ในการส่งผ่านตัวแปร contours ระหว่าง Process ขณะที่ทำงานเป็น Pipeline
และเมื่อทำการรันโปรแกรมอีกครั้งพบว่าการตรวจจับสามารถทำงานได้
จึงมาทำกาารตรวจสอบประสิทธิภาพการทำงานระหว่างรุ่นต้นแบบและรุ่นปรับปรุงซึ่งค่าที่นำมาเทียบกัน คือ fps ที่คำนวณจากจำนวนของ frame หารด้วยผลต่างของ time.clock() ซึ่งเป็นเวลาที่ใช้ในการประมวลผลของ CPU โดยได้ผลดังนี้
จะพบว่า fps ที่เก็บได้นั้นของรุ่นปรับปรุงจะมีความเร็วการทำงานที่สูงมากเมื่อเทียบกับการทำงานของรุ่นต้นแบบ
นอกจากผลของ fps แล้ว ได้ทำการตรวจสอบผลอีกจุดคือ used_time ที่ใช้ในการประมวลผลโดยเก็บเวลาจาก time.clock() ของทั้ง 2 วิธี โดยมีผลดังนี้
จะสังเกตได้ว่าเวลาการทำงานที่ใช้ไปของรุ่นปรับปรุงนั้นต่างกันกว่า 1000 เท่าเมื่อเทียบกับรุ่นต้นแบบ ซึ่งผลที่ได้นี้เป็นผลจากการทดลองบน Ubuntu ของ Lenovo Z580 และจะนำผลจาก Raspberry Pi มาอัพเดตในหัวข้อถัดไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น