ในสมัยก่อน การตรวจจับลักษณะของมือแบบเรียลไทม์ที่มีประสิทธิภาพนั้นเป็นงานที่ท้าทายอย่างยิ่งสำหรับ Computer Vision เพราะหลาย ๆ ท่าของมือมักจะมีบางส่วนที่ชอบบังกันเองทำให้กล้องไม่สามารถจับภาพฝั่งที่ถูกบังได้ เช่น ส่วนของฝ่ามือกับนิ้วมือบังกันเอง หรือไปบังมืออื่นอย่างการจับมือกัน เป็นต้น แต่เมื่อ Machine Learning มาเจอกับ Computer Vision งานที่ว่ายากนั้นก็ดูเหมือนจะง่ายขึ้นมาทันใด ฟังดูน่าตื่นเต้นไหมครับ ดังนั้นในบทความนี้ เราจะมาลองเขียนโปรแกรมซึ่งนำ Machine Learning เข้ามาช่วยในการตรวจจับตำแหน่งของจุดสำคัญต่าง ๆ ของมือแบบง่าย ๆ กันครับ
บทความนี้เป็นบทความในชุด “ตรวจจับสารพัดสิ่งด้วย MediaPipe” ชุดบทความที่จะชวนท่านผู้อ่านมาลองใช้งาน Machine Learning บนเครื่องคอมพิวเตอร์ของเราเองเพื่อตรวจจับสารพัดสิ่ง เช่น มือ คน สัตว์ สิ่งของ ไปจนถึงอิริยาบถของเรา บทความชุดนี้ประกอบไปด้วย
แต่ละบทความจะเป็นบทความสั้น ๆ พร้อม Code ที่ทาง EPT ปรับให้ง่ายที่สุดเพื่อให้ทุกคนนำไปใช้ได้เลยแม้จะไม่มีพื้นฐาน Python มาก่อน (แต่ต้องมีพื้นฐานการใช้งานคอมพิวเตอร์อยู่สักหน่อยนะครับ)
สำหรับใครที่ต้องการเรียนรู้เกี่ยวกับการเขียน การสร้าง AI โดยละเอียดเรียนเชิญได้ที่ Course AI701 แต่ถ้าท่านยังไม่มีพื้นฐานการเขียนโปรแกรมเลยสามารถลงเรียน คอร์ส Python + Web Programming + Machine Learning (PY203) ได้ ซึ่งจะพาท่านไปเริ่มเรียนเขียนโปรแกรมตั้งแต่รู้จักเลขฐาน 2 รู้ว่าคอมพิวเตอร์เครื่องแรกของโลกทำงานอย่างไร เรียนภาษาเขียนโปรแกรม Python เรียนการเขียน Web HTML CSS JavaScript AJAX jQuery Bootstrap และอื่น ๆ อีกมากมาย จนไปจบที่ AI เนื้อหาอัดแน่นกว่า 200 ชั่วโมง และมีคอร์สแถมยิบย่อยตามฤดูกาลอีก เรียกได้ว่าคุ้มสุด จากไม่รู้อะไรจะเปลี่ยนมาทำงานด้าน Programmer เลยก็ยังได้ หรือจากไม่รู้อะไรจะเปลี่ยนสายมาทำ Data science ก็ยังชิล ๆ
MediaPipe เป็น Library จาก Google ที่รวบรวมอัลกอริทึมที่เกี่ยวกับ Machine Learning ไว้มากมายทั้งด้านงานภาพอย่างตรวจจับวัตถุในภาพ ด้านข้อความอย่างการจำแนกประเภทข้อความ และด้านเสียงอย่างการจำแนกประเภทเสียง เรียกได้ว่าแทบจะครบทุกอย่างที่คนส่วนใหญ่ต้องการใช้ แถมยังใช้ได้กับหลายภาษาและหลายแพลตฟอร์มด้วย สมกับคอนเซปต์ที่ว่า
สำหรับบทความชุด “ตรวจจับสารพัดสิ่งด้วย MediaPipe” นี้จะเน้นไปที่ด้านงานภาพอย่างเดียว แต่หากใครสนใจอยากศึกษาเพิ่มเติมก็สามารถอ่านได้จากเว็บของผู้พัฒนาโดยตรง
ในปัจจุบันที่มีเทคโนโลยีใหม่ ๆ ออกมามากมาย ความสามารถในการรับรู้รูปร่างและการเคลื่อนไหวของมือสามารถเป็นองค์ประกอบสำคัญในการปรับปรุงประสบการณ์ผู้ใช้ในแพลตฟอร์มทางเทคโนโลยีที่หลากหลายเหล่านั้น หลายคนอาจจะยังนึกภาพไม่ออกว่าการตรวจจับมือมันจะเอาไปใช้ทำอะไรได้ ดังนั้นจะขอยกตัวอย่างการประยุกต์ใช้สองอย่างที่น่าจะเห็นภาพได้ง่ายที่สุดในด้านความบันเทิงและคุณภาพชีวิตครับ
โลกเสมือนจริงและอุปกรณ์ VR
ทุกคนน่าจะเคยได้ยินคำว่า Metaverse หรือในภาษาไทยคือ จักรวาลนฤมิต ใช่ไหมครับ Metaverse เป็นโลกเสมือนที่มนุษย์สามารถมีปฏิสัมพันธ์กันผ่าน Avatar ของตัวเรา หลายคนเชื่อว่าในอนาคตคนเราจะไปทำกิจกรรมต่าง ๆ เช่น เรียนหนังสือ ท่องเที่ยว ซื้อของ คุยกับเพื่อน ประชุมงาน ฯลฯ ในนั้นแทนโลกจริง และแน่นอนว่าอุปกรณ์ที่จะช่วยให้ผู้คนดำดิ่งสู่โลกเสมือนและได้รับประสบการณ์ที่สมจริงที่สุดที่มีขายในตอนนี้ก็คือแว่น VR ที่ช่วยให้เรารับชมภาพในโลกเสมือนแบบ 360 องศาเหมือนเข้าไปอยู่ที่นั่นจริง ๆ ตรงนี้แหละครับที่เทคโนโลยีเรื่องการตรวจจับมือจะเข้ามาช่วยเพิ่มประสบการณ์การใช้งานให้สมจริงยิ่งขึ้น เพราะเราจะสามารถใช้มือของเราเองจิ้ม/เลือก/จับสิ่งต่าง ๆ ในนั้นได้โดยที่ไม่ต้องมีอุปกรณ์เสริมอีก ตัวอย่างผลิตภัณฑ์ที่ใช้เทคโนโลยีนี้แล้วก็เช่น Oculus Quest ของ Meta (Facebook ในอดีต) นั่นเอง
ภาษามือ
ภาษามือเป็นภาษาที่ใช้ในกลุ่มผู้ที่บกพร่องทางการได้ยิน แน่นอนว่าการจะศึกษาภาษามือนั้นก็เหมือนการเรียนภาษาอีกภาษาหนึ่ง ดังนั้นคนทั่วไปจึงมีน้อยคนที่สามารถสื่อสารด้วยภาษามือได้ หนทางเดียวที่ผู้บกพร่องทางการได้ยินจะสื่อสารกับผู้ที่ไม่รู้ภาษามือได้ก็คือการใช้ล่ามภาษามือนั่นเอง แต่นอกจากจำนวนล่ามภาษามือในประเทศไทยจะไม่เพียงพอแล้ว บางครั้งอาจมีประเด็นอ่อนไหวในเนื้อหาที่ต้องการสื่อสารซึ่งไม่ควรให้บุคคลที่สามรับรู้อีกด้วย ตรงนี้แหละครับ ประโยชน์อันสุดยอดของเทคโนโลยีการตรวจจับมือเพราะเราจะสามารถแปลภาษามือออกมาได้โดยตรงเลย และไม่จำกัดแค่ระหว่างผู้บกพร่องทางการได้ยินกับคนทั่วไปเท่านั้น เรายังสามารถใช้ประโยชน์ในการสื่อสารระหว่างผู้บกพร่องทางการได้ยินที่ใช้ภาษามือคนละมาตรฐานกันได้ด้วย เช่น ภาษามือไทยกับภาษามืออังกฤษ เป็นต้น ว้าว แค่คิดก็ตื่นเต้นแล้ว เชื่อว่า ณ ขณะนี้ก็น่าจะมีผู้พัฒนาเรื่องนี้อยู่แน่ครับ
MediaPipe Hands ใช้ ML pipeline ที่ประกอบด้วยโมเดลหลัก ๆ สองตัวทำงานร่วมกัน ได้แก่
Palm Detection Model (โมเดลตรวจจับฝ่ามือ)
ในการตรวจจับตำแหน่งมือเริ่มต้น ผู้พัฒนาได้ออกแบบโมเดลตัวตรวจจับแบบภาพถ่ายเดียวที่ปรับให้เหมาะกับการใช้งานแบบเรียลไทม์บนมือถือ และเลือกที่จะเริ่มจากการเทรนตัวตรวจจับฝ่ามือแทนตัวตรวจจับมือ เพราะการตรวจจับฝ่ามือนั้นง่ายกว่าและมีปัญหาน้อยกว่ามาก สุดท้ายแล้วได้ความแม่นยำในการตรวจจับฝ่ามือเฉลี่ยถึง 95.7% เลยทีเดียว
Hand Landmark Model (โมเดลจุดสำคัญของมือ)
หลังจากตรวจจับฝ่ามือทั่วทั้งภาพแล้ว จะใช้โมเดลจุดสำคัญของมือคาดเดาจุดสำคัญของพิกัดมือและนิ้วแบบ 3 มิติรวม 21 จุดภายในบริเวณมือที่ตรวจพบดังภาพ
ผู้พัฒนาเทรนโมเดลนี้ด้วยภาพในโลกจริงประมาณ 30,000 ภาพพร้อมใส่ข้อมูลพิกัด 3 มิติ 21 พิกัดทุกภาพ ทำให้ได้โมเดลที่ใช้ตรวจจับท่าทางของมือได้ดีมากแม้แต่กรณีที่มีส่วนที่บังกัน
ติดตั้ง Python และ Package ที่จำเป็น ได้แก่ OpenCV และ MediaPipe ตามเวอร์ชันที่กำหนดต่อไปนี้
1. ติดตั้ง Python เวอร์ชัน 3.9.5 โดยดาวน์โหลดตัวติดตั้งจากที่นี่ แล้วทำการติดตั้งให้เรียบร้อย (ระหว่างติดตั้งอย่าลืมติ๊กเลือก Add Python to environment variables ด้วย)
2. เปิดโปรแกรม Command Prompt ขึ้นมา
สำหรับผู้ที่เปิดไม่เป็นให้พิมพ์ cmd ที่ช่อง Type to search ของ Windows แล้วคลิกที่โปรแกรม Command Prompt จะได้หน้าต่าง Command Prompt ขึ้นมาดังภาพ
3. ติดตั้ง OpenCV สำหรับ Python เวอร์ชัน 4.7.0.72 ด้วยการพิมพ์คำสั่ง pip ดังต่อไปนี้ในหน้าต่าง Command Prompt แล้วกด Enter
pip install opencv-python==4.7.0.72 |
4. ติดตั้ง MediaPipe เวอร์ชัน 0.10.0 ด้วยการพิมพ์คำสั่ง pip ดังต่อไปนี้ในหน้าต่าง Command Prompt แล้วกด Enter
pip install -q mediapipe==0.10.0 |
ข้อควรระวัง
Code ที่ใช้ในบทความนี้ได้รับการทดสอบบนเครื่อง Windows 10 64-bit ที่ติดตั้ง Python และ Package ต่าง ๆ ตามเวอร์ชันที่กำหนดไว้ในบทความนี้ ดังนั้นหากผู้เรียนใช้อะไรบางอย่างคนละเวอร์ชันกับที่กำหนดไว้ก็จะมีโอกาสสูงที่จะรันแล้วเกิดข้อผิดพลาดบางประการ สำหรับ Package (ทั้งที่ใช้และไม่ใช้) ทั้งหมดที่มีในเครื่องคอมพิวเตอร์ที่ใช้ทดสอบจะสรุปให้ดูที่ท้ายบทความ*
1. เปิดโปรแกรม Python IDE ขึ้นมาแล้วเขียน code ดังต่อไปนี้
# import library ที่ใช้
import cv2
import mediapipe as mp
# เปิดกล้องเว็บแคม
webcam = cv2.VideoCapture(0)
image = webcam.read()
# เตรียมข้อมูลสำหรับตรวจจับมือ
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
# วนลูปอ่านค่าจากกล้องและหาตำแหน่งของมือ
while True:
success, image = webcam.read()
image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
results = hands.process(image_rgb)
if results.multi_hand_landmarks:
for landmark in results.multi_hand_landmarks:
mp_draw.draw_landmarks(image, landmark, mp_hands.HAND_CONNECTIONS)
count = 0
for hand_landmarks in results.multi_hand_landmarks:
for point in hand_landmarks.landmark:
print( point.x)
count+=1
print("====================" , count)
# แสดงผลลัพธ์ออกทางหน้าจอ
cv2.imshow("Image",image)
k =cv2.waitKey(1)
if k == 27:
break
cv2.destroyAllWindows()
2. เมื่อสั่งรัน จะได้หน้าต่างสำหรับแสดงผลภาพจากกล้องเว็บแคมแบบเรียลไทม์พร้อมทั้งตรวจจับตำแหน่งของมือได้ดังภาพตัวอย่าง
เพียงเท่านี้เราก็จะได้โปรแกรมตรวจจับตำแหน่งของมือจากกล้องเว็บแคมแบบเรียลไทม์ด้วย Python แล้ว นอกจากจะใช้งานเป็นโปรแกรมบนเครื่องได้แล้ว เรายังสามารถใช้ MediaPipe ทำแอปพลิเคชันสำหรับแอนดรอยด์ หรือใช้งานบนเว็บก็ได้ ใครสนใจสามารถดูตัวอย่างได้ที่นี่
สุดท้ายนี้สำหรับใครที่สนใจอยากทำ AI แต่ยังไม่มีพื้นฐานเขียนโปรแกรมมาก่อน ขอแนะนำคอร์ส Python + Web Programming + Machine Learning (PY203) ของทาง EPT ที่สอนแบบจัดเต็มตั้งแต่พื้นฐาน Python หรือหากมีพื้นฐาน Python แน่น ๆ อยู่แล้วแต่อยากเรียนเกี่ยวกับ AI แบบลงลึกถึงทฤษฎีก็ขอแนะนำคอร์ส Machine Learning (AI701) ครับ
ในบทความต่อไป เราจะมาใช้ MediaPipe เพื่อตรวจจับวัตถุพร้อมทั้งระบุว่าเป็นวัตถุอะไรกันครับ
[1] https://developers.google.com/mediapipe
[2] https://developers.google.com/mediapipe/solutions/vision/hand_landmarker
* เครื่องที่ใช้ทดสอบในบทความนี้เป็น Windows 10 64-bit และมี Package ต่าง ๆ ในเครื่องดังนี้
Package Version --------------------- -------- absl-py 1.4.0 asttokens 2.2.1 attrs 23.1.0 backcall 0.2.0 cffi 1.15.1 cloudpickle 2.2.1 colorama 0.4.6 comm 0.1.3 cycler 0.11.0 debugpy 1.6.7 decorator 5.1.1 executing 1.2.0 flatbuffers 23.5.26 fonttools 4.33.3 importlib-metadata 6.6.0 ipykernel 6.23.1 ipython 8.13.2 jedi 0.18.2 jupyter_client 8.2.0 jupyter_core 5.3.0 kiwisolver 1.4.2 matplotlib 3.5.2 matplotlib-inline 0.1.6 mediapipe 0.10.0 nest-asyncio 1.5.6 numpy 1.22.4 opencv-contrib-python 4.7.0.72 opencv-python 4.7.0.72 packaging 21.3 pandas 1.2.1 parso 0.8.3 pickleshare 0.7.5 Pillow 9.1.1 pip 23.1.2 platformdirs 3.5.1 prompt-toolkit 3.0.38 protobuf 3.20.3 psutil 5.9.5 pure-eval 0.2.2 pycparser 2.21 Pygments 2.15.1 pyparsing 3.0.9 python-dateutil 2.8.2 pytz 2022.2.1 pywin32 306 pyzmq 25.1.0 setuptools 56.0.0 six 1.16.0 sounddevice 0.4.6 spyder-kernels 2.4.3 stack-data 0.6.2 tornado 6.3.2 traitlets 5.9.0 typing_extensions 4.6.3 wcwidth 0.2.6 zipp 3.15.0 |
Tag ที่น่าสนใจ: ai105 hand_landmarks_detection mediapipe computer_vision python machine_learning real-time_detection object_detection image_segmentation pose_estimation library ml_pipeline palm_detection_model hand_landmark_model metaverse sign_language virtual_reality
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM