Machine Learning(EP.9) — การจดจำใบหน้า (Face Recognition)
ในหัวข้อนี้เราจะมาตะลุยการทำระบบจดจำและทำนายผลใบหน้าโดยใช้วิธีการ 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 ตามลำดับ
ในกรณีที่ Hyperplane ไม่ใช่เส้นตรงจะทำอย่างไรในการแยกกลุ่ม Vector เรียกส่วนนี้ว่าการเพิ่ม Hyper Parameter เข้าไปเรียกว่า Kernel
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()
บทความที่เกี่ยวข้อง
EP.1 — ชุดข้อมูล (DataSet)
EP.2 — รู้จักกับข้อมูลชุดเรียนรู้และข้อมูลชุดทดสอบ
EP.3 — Linear Regression
EP.4 — Binary Classifier
EP.5 — K-nearest Neighbors
EP.6 — Naive Bayes
EP.7 — การวิเคราะห์องค์ประกอบหลัก (PCA)
EP.8 — การจัดกลุ่มด้วย K-Means(K-Means Clustering)
EP.9 — การจดจำใบหน้า (Face Recognition)
EP.10 — การจดจำตัวอักษร (Character Recognition)