Baca Juga
Tulisan kali ini sebagai jurnal perjalanan saya dalam membuat proyek penelitian, dengan menceritakan langkah-langkah apa yang saya kerjakan.
Setelah saya dapatkan dataset ekspresi wajah dari dataset Kaggle (https://www.kaggle.com/datasets/msambare/fer2013) sebagai bahan olah.
Design System
Didalam file tersebut (dataset) terdapat 2 file, yaitu data training dan testing. Langkah standart yang dilakukan adalah preprocessing, lalu ekstraksi dengan fitur HOG lalu Klasifikasi dengan SVM. Ini dilakukan pada data training dan juga data testing.
Membangun sistem ekstraksi wajah untuk mendeteksi emosi menggunakan ekstraksi fitur HOG (Histogram of Oriented Gradients) dan klasifikasi dengan SVM (Support Vector Machine) adalah proyek yang cukup kompleks dan memerlukan sejumlah langkah. Saya simpulkan sebagai berikut:
Implementasi HOG
Saya akan coba implementasi ekstraksi fitur HOG (Histogram of Oriented Gradients) dari gambar wajah manusia dalam berbagai emosi (misalnya, marah, senang, sedih, dll.), dan kemudian menyimpan fitur-fitur tersebut ke dalam format file CSV.
Terdapat 7 dataset ekspresi,
'angry': 'marah', 'disgust': 'jijik', 'fear': 'takut', 'happy': 'senang', 'neutral': 'netral', 'sad': 'sedih', 'surprise': 'terkejut'Masing-masing data train dan test terdapat 7 dataset tersebut. Berikut kode pyton yang dibuat:
import cv2 import os import csv from skimage.feature import hog import numpy as np # Fungsi untuk ekstraksi fitur HOG dari gambar def extract_hog_features(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) features = hog(gray, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), visualize=False) return features # Fungsi untuk normalisasi dan pembulatan fitur def normalize_and_round(features): normalized_features = (features - np.min(features)) / (np.max(features) - np.min(features)) rounded_features = np.round(normalized_features, 2) return rounded_features # Path folder dataset datasets = { 'angry': 'marah', 'disgust': 'jijik', 'fear': 'takut', 'happy': 'senang', 'neutral': 'netral', 'sad': 'sedih', 'surprise': 'terkejut' } # List untuk menyimpan fitur HOG dan label all_features = [] all_labels = [] # Loop melalui setiap dataset for dataset_folder, emotion_label in datasets.items(): for filename in os.listdir(dataset_folder): if filename.endswith('.jpg'): image = cv2.imread(os.path.join(dataset_folder, filename)) hog_features = extract_hog_features(image) normalized_features = normalize_and_round(hog_features) all_features.append(normalized_features) all_labels.append(emotion_label) # Simpan fitur dan label dalam format CSV csv_file = 'hog_features_expression.csv' with open(csv_file, 'w', newline='') as csvfile: csvwriter = csv.writer(csvfile) csvwriter.writerow(['Emotion', 'HOG Features']) for label, features in zip(all_labels, all_features): csvwriter.writerow([label, *features])Masing-masing dari dataset train dan testing diperlakukan dengan sama, yaitu ekstraksi dengan fitur HOG.
def extract_hog_features(image): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) features = hog(gray, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2), visualize=False) return featuresmenjelaskan kode tersebut adalah definisi dari sebuah fungsi bernama extract_hog_features(image) yang digunakan untuk mengambil fitur HOG (Histogram of Oriented Gradients) dari sebuah gambar. Mari kita jelaskan setiap baris kode dalam fungsi ini:
- `gray`: Gambar skala abu-abu yang akan digunakan untuk ekstraksi fitur HOG.
- `orientations=9`: Ini adalah jumlah arah (orientasi) yang akan digunakan untuk menghitung gradien. Dalam hal ini, ada 9 orientasi yang digunakan.
- `pixels_per_cell=(8, 8)`: Ini adalah ukuran sel (cell) dalam piksel yang akan digunakan untuk menghitung gradien di dalamnya. Di sini, sel berukuran 8x8 piksel.
- `cells_per_block=(2, 2)`: Ini adalah ukuran blok dalam sel yang akan digunakan untuk normalisasi fitur HOG. Di sini, blok berukuran 2x2 sel.
- `visualize=False`: Parameter ini menunjukkan apakah Anda ingin menghasilkan gambar visualisasi fitur HOG (jika disetel menjadi `True`) atau hanya ingin mengambil fitur HOG itu sendiri (sebagai array) seperti yang dilakukan dalam kasus ini.
Pelatihan Model SVM dan Evaluasi Model
import csv import numpy as np from sklearn import svm from sklearn.metrics import accuracy_score, classification_report # Baca dataset pelatihan dari file CSV def read_csv_dataset(csv_file): features = [] labels = [] with open(csv_file, 'r') as csvfile: csvreader = csv.reader(csvfile) next(csvreader) # Lewati baris header for row in csvreader: emotion = row[0] hog_features = np.array([float(x) for x in row[1:]]) features.append(hog_features) labels.append(emotion) return np.array(features), np.array(labels) # Load dataset pelatihan train_csv_file = 'train\hog_features_expression_training.csv' X_train, y_train = read_csv_dataset(train_csv_file) # Inisialisasi model SVM clf = svm.SVC(kernel='linear', C=1.0) # Latih model SVM pada seluruh dataset pelatihan clf.fit(X_train, y_train) # Load dataset pengujian test_csv_file = 'test\hog_features_expression_testing.csv' X_test, y_test = read_csv_dataset(test_csv_file) # Prediksi label pada data pengujian y_pred = clf.predict(X_test) # Evaluasi model pada data pengujian accuracy = accuracy_score(y_test, y_pred) report = classification_report(y_test, y_pred) print(f'Accuracy on Test Data: {accuracy}') print(report)Hasilnya kita sambung pada artikel selanjutnya. :)
Tidak ada komentar:
Posting Komentar