เห็นหน้าคนปุ๊บก็รู้ว่าชื่ออะไร ด้วยเทคโนโลยีจดจำใบหน้า Face recognition

Face recognition เทคโนโลยีจดจำใบหน้า

ปัจจุบันมี API ที่จะช่วยให้โปรแกรมเมอร์เขียนโค้ดได้ง่าย
มีหลายตัว ตามลิงต์ต่อไปนี้ครับ
เขานำเสนอ 10 ตัวด้วยกัน

https://github.com/ageitgey/face_recognition

ตัวอย่างการทำงานก็ตามที่เห็นในคลิปข้างล่าง

สำหรับคลิปที่จะแสดงให้ดูข้างบน ผมใช้ API ตัวนี้ครับผม
https://github.com/ageitgey/face_recognition

เขียนง่ายมากครับ (แต่ error ยังกระจายนะครับ แต่ก็สามารถปรับให้ถูกต้องได้มากขึ้นเช่นกัน)
หรือใครมีอะไรดีๆ แนะนำได้ครับ

สำหรับการทำงานของ Face regconition คอนเซปง่ายมาก
เวลาตรวจับภาพในกล้องถ่ายรูป หรือเว็บแคมแบบเรียลไทม์
เบื้องหลังมันจะใช้ AI ด้วยกัน 3 ขั้นตอน (เป็น machine learning)

1) จะตีกรอบล้อมหน้าคน อย่างที่เห็นในกล้องถ่ายรูปทั่วไปที่ทำได้

2) จากนั้นจะตรวจจับ land marks บนใบหน้า
ซึ่งก็จุดสำคัญๆ ต่างๆ เช่น คาง คิ้ว ตา เป็นต้น

3) ทั้งนี้ข้อมูลจาก 1 กับ 2 จะถูกนำมาเข้ารหัสด้วย AI อีกตัวหนึ่ง

4) แล้วเอาค่าในข้อ 3 ไปเทียบกับรูปถ่ายในเครื่องที่เราเก็บไว้
ว่ามันใกล้เคียงกับรูปใครที่สุด (รูปที่เก็บไว้พวกนี้ถูกเข้ารหัสด้วยเช่นกัน)
จากนั้นจึงบอกว่าคนนั้นชื่ออะไร

การติดตั้งและใช้งาน face_recognition

ในหัวข้อนี้จะพูดถึงการติดตั้งโปรเจค face recognition จาก https://github.com/ageitgey/face_recognition ด้วยวิธีการแบบคอมมานไลน์บนวินโดวส์

1) แนะนำให้ลง Anaconda ซึ่งเป็นแพลตฟอร์มสำหรับงาน machine learning และ deep learning โดยเฉพาะ ทำให้เราสามารถใช้ python ได้ ลิงค์ดาวน์โหลด https://www.anaconda.com/download/

2) ติดตั้ง dlib

การติดตั้งโปรเจคนี้ความยุ่งยากอยู่ตรงไลบรารี่ dlib นี้แหละ ซึ่งมันจะถูกนำมาใช้งานในโปรเจคนี้อีกทีด้วยภาษา python? สำหรับ dlib เป็นไลบรารี่ของ C++ สำหรับงาน machine learning และ deep learning?(ดูเพิ่มเติมที่ http://dlib.net )

วิธีติดตั้ง dlib ให้ทำดังต่อไปนี้

2.1) ให้ติดตั้ง Microsoft Visual Studio 2015 with C/C++ Compiler installed. ซึ่งจะใช้เวลานานมากโขในการติดตั้ง

2.2) ดาวน์โหลดไฟล์ติดตั้งของโปรแกรม CMake ที่นี้

เมื่อติดตั้งเสร็จแล้ว ให้กำหนดที่อยู่ของ cmake.exe ไว้ที่ path ของตัวแปรระบบ อย่างของผมกำหนดเป็น “;C:\Program Files\CMake\bin” ต่อท้ายค่า path ตัวเดิม

สำหรับวิธีกำหนดค่าตัวแปร path ของระบบ
ก็ให้ไปที่ Control Panel\All Control Panel Items\System
แล้วเลือก -> Advanced system settings -> Environment variables

2.3) เรียกใช้คำสัั่งติดตั้งโมดูล cmake กับ dlib

pip install cmake

pip install dlib

3) ติดตั้งโมดูล face_recognition ด้วยคำสั่ง

pip install face_recognition

4) ติดตั้งโมดูล opencv ด้วยคำสั่ง (เอาไว้ใช้งานกับกล้องเว็บแคม)

pip install opencv-python

ตัวอย่างโค้ด ตอนใช้งาน

import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`!

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

คอนเซปต์จากโค้ดข้างบน ไฟล์ me.jpg คือรูปที่อยากให้ AI รู้จัก (เราต้องมีรูปพวกนี้เก็บไว้)
แล้วนำไปเปรียบเทียบกับรูปที่ AI ไม่เคยเห็นมาก่อนคือ unknown.jpg
จากนั้น AI ก็จะบอกว่ามันใช้รูปที่รู้จักหรือไม่

ทั้งนี้ไฟล์?me.jpg กับ unknown.jpg จะอยู่โฟลเดอร์เดี่ยวกับโค้ดที่รันอยู่ ถ้าอยากให้มันอยู่ที่อื่นก็ต้องระบุพาธด้วย

ตัวอย่างโค้ด ตรวจจับ landmasks

landmask คือจุดสำคัญๆ ซึ่งในกรณีนี้หมายถึงจุดสำคัญๆ บนใบหน้า เช่น คิ้ว ตา จมูก ปาก คาง เป็นต้น

ซึ่งเบื้องหลังการทำงาน face recognition จะตรวจจับ landmasks บนใบหน้าแล้วนำมาเข้ารหัส เพื่อใช้เปรียบเทียบความเหมือนกันของรูปภาพ

ตัวอย่างโค้ดหา landmask ก็ตามนี้เลย

import face_recognition
image = face_recognition.load_image_file("your_file.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

เมื่อ?your_file.jpg คือรูปเราที่จะให้ตรวจจับ landmasks

หมายเหตุ ค่า landmasks เป็นแค่จุดตัวเลข บอกตำแหน่งคิ้ว ตา จมูก ปาก คาง เป็นต้น ส่วนที่เห็นเป็นสีระบายบนรูปข้างบน เกิดจากผมเขียนโปรแกรมเพิ่ม เพื่อวาดรูปลากเส้นใส่สีเข้าไป เพื่อความสวยงามในการแสดงผลการทำงานนะครับ

การปรับจูน API ให้ทำงานถูกต้องมากขึ้น

เนื่องจากการทำงานถ้าเห็นในคลิปวีดีโอ จะเห็นว่า error กระจาย
แต่มันก็มีวิธีปรับจูน API ให้ทำงานถูกต้องมากขึ้น
(ผู้เขียนยังไม่เคยลองนะ แค่อ่านตาม API ที่เขียนไว้)

หลักการก็คือ ตอนเรียกฟังก์ชั่น ให้ระบุพารามิเตอร์ดังนี้

1) ฟังก์ชั่นตรวจจับเฉพาะใบหน้าคนในรูป

def face_locations(img, number_of_times_to_upsample=1, model="hog"):

model=”hog” คือค่าดีฟอลต์ ความถูกต้องในการตรวจจับหน้าคนไม่มาก แต่มันทำงานไวบน CPU
ถ้าเปลี่ยนเป็น model =”cnn” ความถูกต้องจะมากขึ้น แต่การทำงานจะช้าลง ถ้าเกิดใช้ CPU อาจรองรับไม่ไหว ต้องเปลี่ยนไปรันบน GPU/CUDA ด่วน (ถ้ามีนะ)

2) ฟังก์ชั่นเข้ารหัส

def face_encodings(face_image, known_face_locations=None, num_jitters=1):

ตรงค่า num_jitters=1 คือค่าดีฟลอต์
ซึ่ง API เขียนบอกว่า ถ้าตัวเลขสูงๆ จะทำงานถูกต้องมาก แต่การทำงานจะช้าลง
เช่น 100 ถูกต้องมาก แต่จะช้า 100 เท่า ประมาณเนี่ย

3) ฟังก์ชั่นตรวจจับ landmarks บนใบหน้า

def face_landmarks(face_image, face_locations=None, model="large"):

model=”large” คือค่าดีฟอลต์ ซึ่งมันจะรีเทิร์นค่า landmarks ทั้งหมดออกมาตามรูปข้างล่าง

ที่มา https://cdn-images-1.medium.com/max/1600/1*AbEg31EgkbXSQehuNJBlWg.png
ถ้าเปลี่ยนเป็น model=”small” จะรีเทิร์นค่า landmarks ออกมาแค่ 5 จุดสำคัญ แน่นอนมันจะทำงานเร็วขึ้น

ตัวอย่างโค้ด ตรวจจับหน้าคนในวีดีโอ

ตรวจจับใบหน้าผ่านเว็บแคม แบบเรียลไทม์

ตรวจจับใบหน้าจากไฟล์ว์ดีโอ

แต่ขอย้ำอีกรอบ อย่าลืมติดตั้งโมดูล opencv ด้วยคำสั่งต่อไปนี้ เอาไว้ใช้งานกับกล้องเว็บแคม

pip install opencv-python

แนะนำหนังสือ AI (ปัญญาประดิษฐ์)

“AI ไม่ยาก เข้าใจได้ด้วยเลขม.ปลาย? (เนื้อหาภาษาไทย) เล่ม 1”?

?เขียนโดยแอดมินโฮ โอน้อยออก

Please like Fanpage