110 lines
4.2 KiB
Python
110 lines
4.2 KiB
Python
import numpy as np
|
|
import cv2
|
|
import os
|
|
import joblib
|
|
from skimage.feature import local_binary_pattern
|
|
from sklearn.neighbors import KNeighborsClassifier
|
|
from sklearn.metrics import accuracy_score
|
|
|
|
# Fungsi ekstraksi fitur LBP
|
|
def extract_lbp_features(image, radius=1, n_points=8, method='uniform'):
|
|
lbp = local_binary_pattern(image, n_points, radius, method)
|
|
(hist, _) = np.histogram(lbp.ravel(), bins=np.arange(0, n_points + 3), range=(0, n_points + 2))
|
|
# Normalize the histogram
|
|
hist = hist.astype("float")
|
|
hist /= (hist.sum() + 1e-7)
|
|
return hist
|
|
|
|
# Fungsi deteksi wajah dan pemotongan
|
|
def detect_and_crop_faces(image_path):
|
|
# Baca gambar
|
|
original_image = cv2.imread(image_path)
|
|
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
|
|
|
|
# Peningkatan kontras
|
|
gray_image = cv2.equalizeHist(gray_image)
|
|
|
|
# Muat pre-trained Haar Cascade untuk deteksi wajah
|
|
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
|
|
|
|
# Deteksi wajah pada gambar dengan parameter yang disesuaikan
|
|
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.2, minNeighbors=10, minSize=(50, 50))
|
|
|
|
# Cek jumlah wajah yang terdeteksi
|
|
print(f'{image_path}: {len(faces)} face(s) detected')
|
|
|
|
# Loop melalui setiap wajah yang terdeteksi, potong, dan tampilkan
|
|
for i, (x, y, w, h) in enumerate(faces, 1):
|
|
# Pemotongan (Cropping) wajah
|
|
cropped_face = original_image[y:y + h, x:x + w]
|
|
|
|
# # Tampilkan gambar wajah yang terpotong
|
|
# cv2.imshow(f'Cropped Face {i}', cropped_face)
|
|
#
|
|
# # Tunggu 1 detik sebelum menampilkan gambar berikutnya
|
|
# cv2.waitKey(1000)
|
|
|
|
return faces
|
|
|
|
# Persiapkan data latih dan label
|
|
X_train = [] # Menampung fitur-fitur ekstraksi
|
|
y_train = [] # Menampung label kelas
|
|
|
|
# Path root folder
|
|
root_folder = 'images/trainface/'
|
|
|
|
# Iterasi melalui setiap folder
|
|
for person_folder in os.listdir(root_folder):
|
|
person_folder_path = os.path.join(root_folder, person_folder)
|
|
|
|
# Pastikan path adalah direktori
|
|
if os.path.isdir(person_folder_path):
|
|
# Iterasi melalui setiap gambar dalam folder
|
|
for image_name in os.listdir(person_folder_path):
|
|
image_path = os.path.join(person_folder_path, image_name)
|
|
|
|
# Pastikan path adalah file gambar
|
|
if os.path.isfile(image_path):
|
|
# Deteksi wajah dan cropping
|
|
faces = detect_and_crop_faces(image_path)
|
|
|
|
# Baca kembali gambar setelah deteksi wajah
|
|
original_image = cv2.imread(image_path)
|
|
|
|
# Loop melalui setiap wajah yang terdeteksi, potong, dan ekstraksi LBP
|
|
for i, (x, y, w, h) in enumerate(faces, 1):
|
|
# Pemotongan (Cropping) wajah
|
|
cropped_face = original_image[y:y + h, x:x + w]
|
|
|
|
# Resize gambar menjadi 100x100 piksel
|
|
resized_face = cv2.resize(cropped_face, (100, 100))
|
|
|
|
# Konversi gambar resized ke grayscale
|
|
gray_resized_face = cv2.cvtColor(resized_face, cv2.COLOR_BGR2GRAY)
|
|
|
|
# Normalisasi intensitas
|
|
normalized_face = cv2.normalize(gray_resized_face, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
|
|
|
|
# Ekstraksi fitur LBP
|
|
lbp_features = extract_lbp_features(normalized_face, radius=1, n_points=8, method='uniform')
|
|
|
|
# Tampilkan nilai ekstraksi LBP ke konsol
|
|
print(f'LBP Features for face {i}: {lbp_features}')
|
|
|
|
# Tambahkan fitur dan label ke data latih
|
|
X_train.append(lbp_features)
|
|
y_train.append(person_folder) # Label kelas adalah nama folder
|
|
|
|
# Inisialisasi dan latih model K-NN
|
|
knn_classifier = KNeighborsClassifier(n_neighbors=1) # Atur parameter K sesuai kebutuhan
|
|
knn_classifier.fit(X_train, y_train)
|
|
|
|
# Prediksi kelas pada data latih
|
|
y_train_pred = knn_classifier.predict(X_train)
|
|
|
|
# Hitung dan cetak akurasi pada data latih
|
|
train_accuracy = accuracy_score(y_train, y_train_pred)
|
|
print(f"Training Accuracy: {train_accuracy:.2f}")
|
|
|
|
# Simpan model ke file
|
|
joblib.dump(knn_classifier, 'facemodel.joblib') |