Machine Learning(EP.9) — การจดจำใบหน้า (Face Recognition)

KongRuksiam Studio
3 min readApr 16, 2020

ในหัวข้อนี้เราจะมาตะลุยการทำระบบจดจำและทำนายผลใบหน้าโดยใช้วิธีการ PCA (Principal Component Analyis) เพื่อลดขนาดของ Feature และนำไปทำงานร่วมกับ SVM (Support Vector Machine) เพื่อเรียนรู้และสร้างโมเดลสำหรับทำนายผลใบหน้า

Dataset ที่ใช้
- Labelled Faces in the Wild (LFW) Dataset

ข้อมูลพื้นฐาน :

สร้างโมเดลด้วยอัลกอริทึม SVM (Support Vector Machine)
เป็นอัลกอริทึมในการคัดแยกข้อมูลด้านการประมวลผลเป็นภาพดิจิตอล (ปัจจุบันใช้ Neural Network แทน)

หลักการของ SVM (Support Vector Machine)
การกำหนดให้ข้อมูล (Input) ที่ใช้ฝึกเป็นVector ใน Space จำนวน N มิติเพื่อการสร้างเส้นไฮเปอร์เพลน (Hyperplane) หรือเส้นแบ่งระหว่างกลางเพื่อแยกกลุ่ม Class ของ Vector ออกเป็นกลุ่มต่างๆ

ถ้าในกรณีของ 2 มิติ และ 3 มิติ จะเป็นจุดที่อยู่ในระนาบ xy และ xyz ตามลำดับ

เเมพ (Map) เวคเตอร์ในสเปซอินพุทให้เข้าสู่ Feature Space โดยใช้ฟังก์ชั่นหรือเรียกว่าเคอร์นัล (kernel)

ในกรณีที่ Hyperplane ไม่ใช่เส้นตรงจะทำอย่างไรในการแยกกลุ่ม Vector เรียกส่วนนี้ว่าการเพิ่ม Hyper Parameter เข้าไปเรียกว่า Kernel

ทำการเก็บเเมพ (Map) Vector โดยใช้เคอร์นัล (kernel) เพื่อช่วยให้ Hyperplane แยกประเภทของกลุ่มได้

Kernel คือ เป็นรูปแบบการใช้งานพื้นที่อินพุตที่มีมิติต่ำและแปลงเป็นพื้นที่มิติที่สูงขึ้นคือการทำให้เส้นที่แบ่งกลางมีความกว้างมากที่สุดส่งผลทำให้เส้น Hyperplane ค่า Margin มีค่าสูงสุด

รูปแบบของ Kernel

Kernel จะใช้ในกรณีที่เส้นแบ่งข้อมูลไม่ใช่แบบเส้นตรง (Non-Linear)

ความแตกต่างและการทำงานของแต่ละ Kernel

from sklearn.datasets import make_blobs
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
X,z = make_blobs(n_samples=100,n_features=2,cluster_std=4,centers=2,random_state=3)
mx,my = np.meshgrid(np.linspace(X[:,0].min(),X[:,0].max(),200),np.linspace(X[:,1].min(),X[:,1].max(),200))
mX = np.stack([mx.ravel(),my.ravel()],1)
plt.figure(figsize=[6,7])
kernel = ['rbf','poly','sigmoid','linear']
for i in range(4):
svc = SVC(kernel=kernel[i])
svc.fit(X,z)
mz = svc.predict(mX).reshape(200,200)
plt.subplot(2,2,i+1,aspect=1,xlim=[X[:,0].min(),X[:,0].max()],ylim=[X[:,1].min(),X[:,1].max()])
plt.scatter(X[:,0],X[:,1],s=50,c=z,edgecolor='k',cmap='brg')
plt.contourf(mx,my,mz,alpha=0.1,cmap='brg')
plt.title(kernel[i])
plt.tight_layout()
plt.show()

การปรับค่าไฮเพอร์พารามิเตอร์เพื่อเพิ่มประสิทธิภาพการเรียนรู้ของโมเดล

  • ค่า Regularisation (C ) คือการปรับขนาดของเรกูลาไรซ์เพื่อการป้องกันการเรียนรู้เกินขอบเขตที่กำหนดด้วยการแบ่งข้อมูลส่วนหนึ่งมาใช้ตรวจสอบ ถ้าเรียนรู้มากไป หรือ น้อยเกินไปอาจจะทำให้เกิดความผิดพลาดของการทำนายผลข้อมูลของโมเดลได้
  • ค่า Gamma คือ อัตราการลดค่าตามระยะห่างจากเส้นแบ่ง Class ใช้ร่วมกับ RGF Kernel และค่า C

ในกรณีที่เขียนโปรแกรมจริงๆเราจะใช้ GridSearchCV มาใช้ปรับเปลี่ยนค่าพารามิเตอร์ (Tuning Parameter) ที่เหมาะสมกับโมเดลทำให้โมเดลที่สร้างขึ้นมีประสิทธิภาพที่ดีที่สุด

from sklearn.datasets import make_moons
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
X,z = make_moons(n_samples=80,shuffle=0,noise=0.25,random_state=0)
mx,my = np.meshgrid(np.linspace(X[:,0].min(),X[:,0].max(),200),np.linspace(X[:,1].min(),X[:,1].max(),200))
mX = np.stack([mx.ravel(),my.ravel()],1)
plt.figure(figsize=[6.5,4.5])
for i,C in enumerate([1,5,10]):
for j,gamma in enumerate([0.1,1,5]):
svc = SVC(C=C,gamma=gamma)
svc.fit(X,z)
mz = svc.predict(mX).reshape(200,200)
plt.subplot2grid((3,3),(i,j),xlim=[X[:,0].min(),X[:,0].max()],ylim=[X[:,1].min(),X[:,1].max()],xticks=[],yticks=[],aspect=1)
plt.scatter(X[:,0],X[:,1],s=10,c=z,edgecolor='k',cmap='brg')
plt.contourf(mx,my,mz,alpha=0.1,cmap='brg')
plt.title('C=%.1f,$\\gamma$=%.1f'%(C,gamma),size=8)
plt.tight_layout()
plt.show()

ช่องทางการสนับสนุน
🎓คอร์สเรียน Udemy | 🛒ซื้อของผ่าน Shopee

🌎 ติดตามข่าวสารเพิ่มเติมได้ที่
Facebook | YouTube | TikTok

--

--

KongRuksiam Studio

🚀 เรียนรู้การเขียนโปรแกรมนอกห้องเรียน | สำหรับสายนักอ่าน