List

1. Pendahuluan

Pengenalan obyek dan wajah sudah kita pelajari di beberapa artikel sebelumnya. Pada artikel sebelumnya kita menggunakan CNN untuk mendeteksi wajah ( Link ) dan Menggunakan SVM untuk clasifikasi kucing atau anjing ( Link ).

Pada kesempatan ini kita akan melakukan klasifikasi wajah beberapa sample dengan menggunakan Support Vector Machine (SVM). Aplikasi ini dikembangkan dengan bahasa Python 3 dan OpenCV. Ada beberapa tahapan dalam program ini, yaitu Pelatihan (train) dan Pengujian (Test). Tutorial ini bisa didapatkan di github

2. Pelatihan (train)

Buatlah kode program python dengan nama face_recognition.py

import os, glob, sys
import cv2
import numpy as np
import sklearn
from sklearn import model_selection, preprocessing,linear_model, naive_bayes, metrics, svm
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml')
def PreProcessing(img):
     img = cv2.resize(img,(50,50))
     gx = cv2.Sobel(img,cv2.CV_32F,1,0,ksize=5)
     gy = cv2.Sobel(img,cv2.CV_32F,0,1,ksize=5)
     mag, ang = cv2.cartToPolar(gx, gy)
     bins = np.int32(bin_nang/(2np.pi))
     hist = np.bincount(bins.ravel(), mag.ravel(), bin_n)
     return hist
img_paths = glob.glob('D:\Project\Latihan\Wajah\Train\*')
bin_n=32
data = []
label = []
svm_params = dict(kernel_type=cv2.ml.SVM_LINEAR, svm_type=cv2.ml.SVM_C_SVC)
for img_path in img_paths:
     word_label = img_path.rsplit('.')[-3]
     category=word_label[-1:]
     if category == 'a':
         img = cv2.imread(img_path, 0)
         #print(word_label)
         hist=PreProcessing(img)
         data.append(hist)
         label.append(0)
     elif category == 'b':
         img = cv2.imread(img_path, 0)
         #print(word_label)
         hist=PreProcessing(img)
         data.append(hist)
         label.append(1)
     elif category == 'c':
         img = cv2.imread(img_path, 0)
         #print(word_label)
         hist=PreProcessing(img)
         data.append(hist)
         label.append(2)
     elif category == 'd':
         img = cv2.imread(img_path, 0)
         #print(word_label)
         hist=PreProcessing(img)
         data.append(hist)
         label.append(3)    

train_x, valid_x, train_y, valid_y = model_selection.train_test_split(data, label, test_size=0.3,random_state=9)
SVM = svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto',probability=False, random_state=None)
SVM.fit(train_x, train_y)# predict the labels on validation dataset
responses=np.float32(label)

Bagian training diawali dengan melakukan include beberapa package yang digunakan dalam aplikasi ini

import os, glob, sys
import cv2
import numpy as np
import sklearn
from sklearn import model_selection, preprocessing,linear_model, naive_bayes, metrics, svm
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

Selanjutnya kita akan mendeklarasikan variabel face_detect. Variabel face_detect akan menangkap variabel wajah yang didapatkan dengan menggunakan Haar Cascade. Haar Cascade yang digunakan adalah jenis haarcascade_frontalface_alt.xml.

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml')

Function PreProcessing digunakan untuk melakukan pengolahn awal dintaranya Resize Image, Segmentation dll

def PreProcessing(img):
    img = cv2.resize(img,(50,50))
    gx = cv2.Sobel(img,cv2.CV_32F,1,0,ksize=5)
    gy = cv2.Sobel(img,cv2.CV_32F,0,1,ksize=5)
    mag, ang = cv2.cartToPolar(gx, gy)
    bins = np.int32(bin_n*ang/(2*np.pi))
    hist = np.bincount(bins.ravel(), mag.ravel(), bin_n)
    return hist

Langkah selanjutny adalah memuat Citra Latih dari direktori img_paths = glob.glob(‘D:\Project\Latihan\Wajah\Train\*’)

img_paths = glob.glob('D:\\Project\\Latihan\\Wajah\\Train\\*')
bin_n=32
data = []
label = []
svm_params = dict(kernel_type=cv2.ml.SVM_LINEAR, svm_type=cv2.ml.SVM_C_SVC)

Memberikan label nilai pada masing-masing image dengan program di bawah ini. word_label = img_path.rsplit(‘.’)[-3] bertujuan untuk memotong extensi .jpg, sehingga tinggal a.1, a.2, … dst. category=word_label[-1:] bertujuan untuk memotong, sehingga kita akan mendapatkan nilai a, b, c, …. dst

for img_path in img_paths:
    word_label = img_path.rsplit('.')[-3]
    category=word_label[-1:]
    if category == 'a':
        img = cv2.imread(img_path, 0)
        #print(word_label)
        hist=PreProcessing(img)
        data.append(hist)
        label.append(0)
    elif category == 'b':
        img = cv2.imread(img_path, 0)
        #print(word_label)
        hist=PreProcessing(img)
        data.append(hist)
        label.append(1)
    elif category == 'c':
        img = cv2.imread(img_path, 0)
        #print(word_label)
        hist=PreProcessing(img)
        data.append(hist)
        label.append(2)
    elif category == 'd':
        img = cv2.imread(img_path, 0)
        #print(word_label)
        hist=PreProcessing(img)
        data.append(hist)
        label.append(3)
responses=np.float32(label)    

Langkah terakhir adalah melakukan training dari data yang kita miliki

train_x, valid_x, train_y, valid_y = model_selection.train_test_split(data, label, test_size=0.3,random_state=9)
SVM = svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto',probability=False, random_state=None)
SVM.fit(train_x, train_y)# predict the labels on validation dataset
responses=np.float32(label)

3. Pengujian (test)

3.1 Pengujian untuk 1 citra

maksudnya adalah kita akan mengklasifikasikan sebuah citra dengan menggunakan sistem yang sudah kita latih. Pada kesempatan ini kita akan menguji sebuah file 1.jpg, yang terletak di D:\Project\Latihan\Wajah\Test\1.jpg.

img=cv2.imread('D:\\Project\\Latihan\\Wajah\\Test\\1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Image", gray)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    cv2.rectangle(gray,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    img_resized = cv2.resize(roi_gray,(32,32))
    hist=PreProcessing(img_resized )
    predictions_SVM = SVM.predict(hist.reshape(1,-1))# Use accuracy_score function to get the accuracy
    if(predictions_SVM==0):
        nama="Edi"
    elif(predictions_SVM==1):
        nama="Qois"
    elif(predictions_SVM==2):
        nama="Fauzi"
    elif(predictions_SVM==3):
        nama="Aris"
    print(nama)

File ini masih Raw Image, yang masih mengandung latar berlakang. Sehingga kita perlu memotong latar belakangnya. Pertama kita seleksi dengan haarcascade_frontalface_alt.xml, dari hasil seleksi kita uji menggunakan SVM.

    roi_gray = gray[y:y+h, x:x+w]
    img_resized = cv2.resize(roi_gray,(32,32))
    hist=PreProcessing(img_resized )
    predictions_SVM = SVM.predict(hist.reshape(1,-1))# Use accuracy_score function to get the accuracy
    if(predictions_SVM==0):
        nama="Edi"
    elif(predictions_SVM==1):
        nama="Qois"
    elif(predictions_SVM==2):
        nama="Fauzi"
    elif(predictions_SVM==3):
        nama="Aris"
    print(nama)

3.2 Pengujian 1 direktori

maksudnya adalah kita akan mengklasifikasikan semua citra yang terletak di D:\Project\Latihan\Wajah\Test\

img_paths = glob.glob('D:\\Project\\Latihan\\Wajah\\Test\\*')
for img_path in img_paths:
    print(img_path)
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cv2.rectangle(gray,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        img_resized = cv2.resize(roi_gray,(32,32))
        hist=PreProcessing(img_resized )
        predictions_SVM = SVM.predict(hist.reshape(1,-1))# Use accuracy_score function to get the accuracy
        if(predictions_SVM==0):
            nama="Edi"
        elif(predictions_SVM==1):
            nama="Qois"
        elif(predictions_SVM==2):
            nama="Fauzi"
        elif(predictions_SVM==3):
            nama="Aris"
        print(nama)

Pada bagian ini program akan membuka semua file di folder Test dan menyimpan dalam variabel img

img_paths = glob.glob('D:\\Project\\Latihan\\Wajah\\Test\\*')
for img_path in img_paths:
    print(img_path)
    img = cv2.imread(img_path)

File ini masih Raw Image, yang masih mengandung latar berlakang. Sehingga kita perlu memotong latar belakangnya. Pertama kita seleksi dengan haarcascade_frontalface_alt.xml, dari hasil seleksi kita uji menggunakan SVM.

    roi_gray = gray[y:y+h, x:x+w]
    img_resized = cv2.resize(roi_gray,(32,32))
    hist=PreProcessing(img_resized )
    predictions_SVM = SVM.predict(hist.reshape(1,-1))# Use accuracy_score function to get the accuracy
    if(predictions_SVM==0):
        nama="Edi"
    elif(predictions_SVM==1):
        nama="Qois"
    elif(predictions_SVM==2):
        nama="Fauzi"
    elif(predictions_SVM==3):
        nama="Aris"
    print(nama)

3.2 Pengujian Menggunakan Webcam

maksudnya adalah kita akan mengklasifikasikan Seseorang dengan menggunakan webcam. Wajah kita tangkap menggunakan webcam dan kita deteksi menggunakan haarcascade.

img_paths = glob.glob('D:\\Project\\Latihan\\Wajah\\Test\\*')
for img_path in img_paths:
    print(img_path)
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        cv2.rectangle(gray,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        img_resized = cv2.resize(roi_gray,(32,32))
        hist=PreProcessing(img_resized )
        predictions_SVM = SVM.predict(hist.reshape(1,-1))# Use accuracy_score function to get the accuracy
        if(predictions_SVM==0):
            nama="Edi"
        elif(predictions_SVM==1):
            nama="Qois"
        elif(predictions_SVM==2):
            nama="Fauzi"
        elif(predictions_SVM==3):
            nama="Aris"
        print(nama)