ผู้เขียนบทความ :
1.นายพันธ์เทวะ อุบล COE#16
2.นายปรเมศวร์ สมนุกิจ COE#16
3.นายกษิดิศ เยาว์นุ่น COE#16
4.นายดนุเดช จันทร์ดำ COE#16
คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์
วิชา : การโปรแกรมคอมพิวเตอร์ขั้นสูง
1.ความเป็นมา
ปัจจุบันการสื่อสารนั้นเป็นสิ่งสำคัญต่อการใช้ชีวิตของมนุษย์ซึ่งไม่สามารถขาดไปได้จากการใช้ชีวิตในยุคสมัยปัจจุบัน การสื่อสารเป็นเหมือนสิทธิ์พื้นฐานของการเป็นมนุษย์อารยชนที่มนุษย์ทุกคนควรเข้าถึงได้ แต่สำหรับผู้ที่มีความบกพร่องของการได้ยินนั้นไม่สามารถสื่อสารได้ปกติจึงเหมือนบุคคลเหล่านี้ได้ถูกพรากความเป็นมนุษย์ไป แต่การมีอยู่ของภาษามือนั้นทำให้การสื่อสารของผู้มีความบกพร่องของการได้ยินนั้นเป็นไปได้อีกครั้ง แต่ปัญหาของภาษามือนั้นคือการที่เป็นภาษาที่คนกลุ่มน้อยเท่านั้นที่จะเรียนรู้และทำความเข้าใจภาษานี้หากไม่เป็นผู้มีความบกพร่องของการได้ยินเอง จึงทำให้การที่คนที่ไม่มีความรู้ในภาษามือเกิดปัญหาในการสื่อสารกับผู้มีความบกพร่องของการได้ยิน
ซึ่งด้วยเหตุนี้จึงทำให้ผู้จัดทำได้สร้างระบบแปลภาษามือโปรแกรมแปลภาษามือเบื้องต้นด้วยการประมวณผลภาพ python เพื่อแก้ปัญหานี้ การใช้การประมวณผลภาพของ python เพื่อแปลภาษามือได้นั้นเนื่องจากภาษามือนั้นประกอบไปด้วยตำแหน่งของมือ การเคลื่อนไหวของมือและท่าทางของมือเพื่อประกอบเป็นคำออกมา ซึ่งการใช้ระบบประมวณผลภาพที่สามารถตรวจจับการเปลี่ยนแปลงต่างของมือจึงทำให้สามารถแปลข้อมูลต่าง ๆ นั้นเป็นภาษาที่ผู้ใช้เข้าใจได้
2.วัตถุประสงค์
เพื่อพัฒนาระบบแปลภาษามือโดยใช้การประมวณผลภาพผ่านโปรแกรม Python
3.ขอบเขตการโปรเจค
3.1.สามารถแปลภาษามือขั้นพื้นฐานได้
3.2.สามารถจับการเคลื่อนไหวของมือได้อย่างแม่นยำ
3.3.ใช้ภาษาPythonในการประมวลผลภาพและแปลภาษามือ
4.ประโยช์นที่คิดว่าจะได้รับ
4.1.ได้ศึกษาและเข้าใจในการเขียนโค๊ด Python เพื่อนำมาปรุยก์ใช้
4.2.สามารถพัฒนาจากโครงงานนี้ได้ในอนาคตมากยิ่งขึ้น
4.3.สามารถพัฒนาทักษะให้กับผู้เรียนได้
5. ความรู้ที่เกี่ยวข้อง
โปรแกรมนี้ใช้โมดูลและไลบรารีหลายตัวเพื่อช่วยในการพัฒนาและทำงานของโปรแกรมได้อย่างมีประสิทธิภาพ โดยรายละเอียดของแต่ละโมดูลและไลบรารีที่สำคัญมีดังนี้:
5.1. csv
– ใช้ในการอ่านและเขียนข้อมูลในรูปแบบไฟล์ CSV (Comma-Separated Values) ซึ่งเป็นรูปแบบข้อมูลที่นิยมใช้ในการจัดเก็บข้อมูลที่มีโครงสร้างอย่างง่าย เช่น ค่าตำแหน่งจุดของมือที่ได้จาก MediaPipe โปรแกรมนี้ใช้โมดูล csv
ในการบันทึกค่าตำแหน่งของมือในแต่ละเฟรมลงในไฟล์ CSV เพื่อใช้วิเคราะห์และตรวจสอบผลในภายหลัง หรือใช้เป็นข้อมูลสำหรับฝึกโมเดลการแปลภาษามือ
5.2. copy
– โมดูลนี้ใช้สำหรับการสร้างสำเนาของออบเจ็กต์ใน Python โปรแกรมนี้อาจต้องใช้การสร้างสำเนาข้อมูลที่ได้จากการตรวจจับตำแหน่งของจุดบนมือในแต่ละเฟรมเพื่อนำไปใช้วิเคราะห์หรือเปรียบเทียบในกรณีที่มีการเปลี่ยนแปลงค่า หรือเมื่อทำงานกับข้อมูลหลายชุดพร้อมกัน การใช้โมดูล copy
โดยเฉพาะวิธีการ deepcopy
ช่วยให้โปรแกรมสร้างสำเนาที่ไม่เชื่อมโยงกับออบเจ็กต์ต้นฉบับ ทำให้สามารถปรับเปลี่ยนข้อมูลได้โดยไม่กระทบกับข้อมูลเดิม
5.3. argparse
– ใช้สำหรับจัดการการรับพารามิเตอร์จากบรรทัดคำสั่ง (Command Line Arguments) เพื่อเพิ่มความยืดหยุ่นในการทำงานของโปรแกรม ตัวอย่างเช่น ผู้ใช้อาจระบุไฟล์วิดีโอหรือกล้องที่ต้องการใช้ในการรับภาพ หรือระบุโหมดการทำงานของโปรแกรมเช่น โหมดการทดสอบ หรือโหมดแปลภาษามือแบบเรียลไทม์ argparse
ช่วยให้โปรแกรมสามารถรับพารามิเตอร์เหล่านี้ได้ง่ายและเป็นระบบ
5.4. itertools
– ไลบรารีนี้มีเครื่องมือมากมายสำหรับการทำงานกับข้อมูลในรูปแบบ iterable ซึ่งโปรแกรมนี้อาจใช้ itertools
เพื่อสร้างชุดข้อมูลที่ซับซ้อนจากข้อมูลที่ตรวจจับได้ เช่น การจับคู่ตำแหน่งของจุดต่างๆ บนมือในรูปแบบต่างๆ เพื่อนำไปวิเคราะห์ หรือการวนลูปเพื่อเปรียบเทียบค่าตำแหน่งของจุดในหลายๆ เฟรม
5.5. collections
– ประกอบด้วยโครงสร้างข้อมูลแบบพิเศษเพื่อจัดการข้อมูล – Counter
: ใช้สำหรับนับจำนวนของออบเจ็กต์หรือค่าที่ปรากฏใน iterable ซึ่งจะมีประโยชน์ในการนับจำนวนครั้งของการเคลื่อนไหวมือแต่ละรูปแบบ เช่น การนับจำนวนการโบกมือหรือการแสดงสัญลักษณ์ซ้ำๆ – deque
: ใช้เป็นโครงสร้างข้อมูลแบบคิว (Queue) ที่มีประสิทธิภาพสูงในการเข้าถึงหรือแก้ไขข้อมูลทั้งจากด้านหน้าและด้านหลัง ทำให้เหมาะสำหรับการเก็บค่าตำแหน่งของมือในหลายช่วงเวลาเพื่อใช้ในการวิเคราะห์เฟรมต่อเฟรม (Frame-by-Frame)
5.6. cv2 (OpenCV)
– OpenCV เป็นไลบรารีสำหรับการประมวลผลภาพและวิดีโอที่มีฟังก์ชันหลากหลาย โปรแกรมนี้ใช้ OpenCV เพื่อรับภาพจากกล้องหรือไฟล์วิดีโอ การประมวลผลภาพที่ได้มา และการวาดจุดที่ MediaPipe ตรวจจับได้ลงบนเฟรมภาพ รวมถึงการแสดงผลภาพแบบเรียลไทม์ ตัวอย่างการใช้งาน เช่น การวาดจุดตำแหน่งของข้อนิ้วและปลายนิ้วลงบนภาพวิดีโอ และการติดตามการเคลื่อนไหวของมือเพื่อนำไปแปลเป็นสัญลักษณ์ภาษามือ
5.7. numpy
– ไลบรารีที่ทรงพลังสำหรับการคำนวณเชิงตัวเลขและการจัดการข้อมูลในรูปแบบของอาเรย์ (Array) โปรแกรมนี้ใช้ numpy
ในการจัดเก็บและคำนวณค่าตำแหน่งของจุดบนมือที่ได้รับจาก MediaPipe ฟังก์ชันของ numpy
เช่น การคำนวณค่าระยะห่างระหว่างจุด การคำนวณมุมหรือการคำนวณเชิงเวกเตอร์ ช่วยให้โปรแกรมสามารถวิเคราะห์ตำแหน่งและลักษณะการเคลื่อนไหวของมือได้อย่างแม่นยำและรวดเร็ว
5.8. mediapipe
– MediaPipe เป็นไลบรารีที่พัฒนาโดย Google สำหรับการตรวจจับและติดตามตำแหน่งของจุดต่างๆ บนร่างกาย เช่น ใบหน้า มือ และร่างกาย โปรแกรมนี้ใช้ MediaPipe Hand เพื่อตรวจจับจุดบนมือโดยเฉพาะ เช่น ข้อนิ้ว ข้อมือ และปลายนิ้ว ซึ่งเป็นข้อมูลสำคัญในการวิเคราะห์การแปลภาษามือ การใช้ MediaPipe ทำให้โปรแกรมสามารถทำงานได้แบบเรียลไทม์และมีความแม่นยำสูง
5.9. PIL (Python Imaging Library)
– PIL เป็นไลบรารีสำหรับการสร้างและปรับแต่งภาพ โปรแกรมนี้ใช้ PIL เพื่อเพิ่มข้อความลงบนภาพที่แสดงผลในแบบเรียลไทม์ เช่น การแสดงข้อความที่แปลจากภาษามือที่ตรวจจับได้ เพื่อให้ผู้ใช้งานสามารถเห็นผลลัพธ์ในทันที ฟังก์ชันของ PIL ช่วยให้สามารถจัดรูปแบบ ขนาด และตำแหน่งของข้อความได้ตามต้องการ
สรุป
โค้ดนี้จะเกี่ยวข้องกับการประมวลผลภาพจากกล้องหรือวิดีโอแบบเรียลไทม์ ซึ่งใช้ OpenCV และ Mediapipe ในการตรวจจับและติดตามวัตถุหรือส่วนของมือ เพื่อทำการแปลจากท่าทางของมือที่ได้เป็นคำใดๆที่มีตำแหน่งใกล้เคียงกับมือที่ตรวจจับได้บนหน้าจอ
6. การดำเนินงาน
ผังงานการทำงานของระบบ
7. วิธีการใช้งานโปรแกรม
- เริ่มการเรียกใช้โปรแกรม Python
- 1.การใช้งานโปรแกรม
- 1.1เปิดโฟลเดอร์ไฟล์ของโปรแกรมในvscode
- 1.2เปิดโปรแกรมด้วย python app.py ในterminal ของ vscode
- 1.3สามารถเริ่มใช้โปรแกรมได้เลยเมื่อหน้าต่างโปรแกรมขึ้นมาบนหน้าจอ
- 2.การฝึกคำใหม่ให้โปรแกรม
- 2.1ก่อนแรกเปิดโปรแกรมด้วย python app.py ในterminal ของ vscode
- 2.2จากนั้นให้กดปุ่ม k เพื่อเปิดโหมดการบันทึก
- 2.3ทำการกดปุ่มเลขที่เราต้องการเพื่อบันทึกท่าทางมือสำหรับตัวเลขนั้น
- 2.4จากนั้นข้อมูลท่าทางจะถูกบันทึกลงในไฟล์ keypoint.csv
- 2.5หลังจากนั้นให้เราไปที่ไฟล์ keypoint_classifier_lable.csv เพื่อทำการเพิ่มความหมายของท่าทางที่เราบันทึกไปโดยคำแรกจะเริ่มที่เลข 0
- 2.6จากนั้นให้เปิดไฟล์ keypoint_clssification.ipynb ใน jupyterlab แล้วแก้ไขจำนวน NUM_CLASS เท่ากับจำนวนท่าทางที่เรามี
- 2.7หลังจากนั้นก็ทำการ restart kernal and run all cells ก็จะทำการเริ่มการฝึกคำใหม่ให้โปรแกรม
- 2.8เมื่อกระบวนการเสร็จสิ้นแล้วคำใหม่ที่ถูกฝึกจะสามารถใช้ได้ในโปรแกรมเลยทันที
8. การทดลอง
ทดลองนำระบบแปลภาษามือเบื้องต้นด้วยการประมวณผลภาพ python ให้ทำงานโดยรับเข้าวิดีโอจากWEBCAM โดยทำการทดลองทั้งหมด 20 คำ โดยทำการทดสอบคำละ3ครั้ง
8.1 ผลการทดลอง
9 เทคนิกการประยุคเพื่อเพิ่มประสิทธิภาพมากขึ้น
การประยุกต์เทคนิคเพื่อเพิ่มประสิทธิภาพของโปรแกรมแปลภาษามือเบื้องต้นด้วย Python โปรแกรมแปลภาษามือที่พัฒนาขึ้นใช้ MediaPipe สำหรับตรวจจับตำแหน่งจุดต่างๆ ของมือและทำการแปลเป็นคำที่ใกล้เคียงที่สุด อย่างไรก็ตาม โปรแกรมยังมีข้อจำกัดในการตรวจจับการเคลื่อนไหวของมือและตำแหน่งของมือบนร่างกาย ซึ่งเป็นปัจจัยสำคัญในการแปลภาษามือให้แม่นยำยิ่งขึ้น รายงานนี้เสนอเทคนิคและแนวทางการพัฒนาเพิ่มเติมเพื่อปรับปรุงความสามารถและประสิทธิภาพของโปรแกรม ดังนี้
9.1. การเพิ่มความสามารถในการตรวจจับการเคลื่อนไหวของมือ ปัญหาปัจจุบัน: โปรแกรมสามารถตรวจจับเพียงตำแหน่งจุดต่างๆ ของมือได้เท่านั้น แต่ยังไม่สามารถตรวจจับและแปลการเคลื่อนไหวของมือได้ เช่น การเคลื่อนไหวไปทางซ้าย-ขวา การหมุนข้อมือ หรือการโบกมือขึ้น-ลง แนวทางการพัฒนา: การวิเคราะห์เฟรมต่อเฟรม: บันทึกค่าตำแหน่งจุดต่างๆ ของมือในหลายเฟรมและวิเคราะห์การเปลี่ยนแปลงตำแหน่งเพื่อระบุทิศทางและลักษณะการเคลื่อนไหว การวิเคราะห์ข้อมูลลำดับเวลา (Time Series Analysis): ใช้เทคนิคการวิเคราะห์ข้อมูลที่เกิดขึ้นในลำดับเวลาเพื่อจดจำและระบุรูปแบบการเคลื่อนไหวของมือ เช่น การหมุนมือหรือการกวาดมือในทิศทางต่างๆ
9.2. การตรวจจับตำแหน่งของมือบนร่างกาย ปัญหาปัจจุบัน: โปรแกรมไม่สามารถระบุได้ว่ามืออยู่ในตำแหน่งใดบนร่างกาย เช่น ใกล้ใบหน้า อก หรือเอว ซึ่งมีผลต่อความหมายของภาษามือ แนวทางการพัฒนา: การใช้ MediaPipe Holistic Model: MediaPipe Holistic สามารถตรวจจับทั้งใบหน้า มือ และร่างกายได้พร้อมกัน การใช้งานโมเดลนี้จะทำให้โปรแกรมสามารถวิเคราะห์ตำแหน่งของมือในความสัมพันธ์กับส่วนต่างๆ ของร่างกายได้ การวิเคราะห์ตำแหน่งสัมพัทธ์: สร้างระบบวิเคราะห์ตำแหน่งสัมพัทธ์ของมือกับจุดสำคัญอื่นๆ ของร่างกาย เช่น หัว ไหล่ หรือเอว เพื่อระบุว่ามืออยู่ในตำแหน่งใด และใช้ข้อมูลเหล่านี้ในการแปลภาษามือ
9.3. การใช้ Machine Learning เพื่อเพิ่มประสิทธิภาพ ปัญหาปัจจุบัน: โปรแกรมอาจยังไม่สามารถแปลภาษามือได้อย่างแม่นยำเมื่อมีการเปลี่ยนแปลงตำแหน่งหรือการเคลื่อนไหว แนวทางการพัฒนา: การเก็บรวบรวมข้อมูลเพิ่มเติม: บันทึกการเคลื่อนไหวภาษามือในหลายรูปแบบและตำแหน่งเพื่อนำไปใช้ฝึกโมเดล Machine Learning ที่มีความซับซ้อน เช่น Recurrent Neural Networks (RNN) หรือ Long Short-Term Memory (LSTM) เพื่อให้โปรแกรมสามารถจดจำรูปแบบที่ซับซ้อนมากขึ้น การใช้ Transfer Learning: ใช้โมเดลที่ฝึกมาแล้วบนฐานข้อมูลขนาดใหญ่เพื่อช่วยให้การฝึกของโปรแกรมเร็วขึ้นและมีความแม่นยำสูงขึ้น
9.4. การเพิ่มข้อมูล (Data Augmentation) ปัญหาปัจจุบัน: การฝึกโมเดล Machine Learning ต้องการข้อมูลที่หลากหลาย แต่การเก็บข้อมูลจริงในปริมาณมากอาจใช้เวลาและทรัพยากร แนวทางการพัฒนา: การใช้เทคนิค Data Augmentation: ใช้การเพิ่มข้อมูลเสมือนจริง เช่น การหมุนมือ การปรับเปลี่ยนแสงและเงา หรือการเพิ่มการเคลื่อนไหวเสมือน เพื่อเพิ่มปริมาณและความหลากหลายของข้อมูลให้เพียงพอต่อการฝึกโมเดล การพัฒนาในแนวทางเหล่านี้จะทำให้โปรแกรมสามารถตรวจจับและแปลความหมายของภาษามือได้อย่างมีประสิทธิภาพมากขึ้น และสามารถนำไปประยุกต์ใช้ในสถานการณ์จริงที่มีความซับซ้อนมากกว่าเดิมได้อย่างมีประสิทธิภาพ
10. สรุปผลและข้อเสนอแนะ
10.1 สรุปผล: จากการทดลองพบว่า โปรแกรมแปลภาษามือเบื้องต้นที่ใช้การประมวลผลภาพด้วย Python สามารถตรวจจับและแปลภาษามือในระดับพื้นฐานได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม โปรแกรมยังคงมีข้อจำกัดในกรณีที่ท่าทางภาษามือมีความใกล้เคียงกันมาก ทำให้ระบบอาจแปลผิดพลาดได้ นอกจากนี้ หากมือถูกบดบังหรือบังส่วนหนึ่ง จะทำให้การตรวจจับไม่สมบูรณ์ ส่งผลให้ผลลัพธ์ไม่ถูกต้องเช่นกัน
10.2ข้อเสนอแนะ: ประยุกต์ระบบให้สามารถตรวจจับการเคลื่อนไหวและตรวจจับตำแหน่งของมือบนร่างกายได้ เพื่อเพิ่มประสิทธิภาพและความแม่นยำของโปรแกรมในการแปลภาษามือ
11. ข้อมูลอ้างอิง
11.1 รหัสต้นฉบับ
KazuhitoTakahashi(2566).hand gesture recognition using mediapipe จาก https://github.com/Kazuhito00/hand-gesture-recognition-using-mediapipe
11.2 วิดีโอที่เกี่ยวข้อง
https://www.youtube.com/watch?v=a99p_fAr6e4&list=PL0FM467k5KSyt5o3ro2fyQGt-6zRkHXRv
11.3 ฐานข้อมูลภาษามือไทย
https://www.th-sl.com/?openExternalBrowser=1&fbclid=IwY2xjawF23eBleHRuA2FlbQIxMAABHZers8EytYpU3viF8RsJgBpcVYCngc6CguEcG0GweHoB-aLbB1CGJTntFA_aem_5MDDis5F677B1oTX-SladA