List

Berikut ini aplikasi sederhana untuk mengkasifikasikan sebuah citra (image) Anjing dan Kucing dengan menggunakan metode SVM. Aplikasi ini ditulis dengan menggunakan bahasa Python dan OpenCV 3.4.0. Data dari program ini diambil dari Kaggle dengan ukuran file lumayan besar (831MB).

Berikut beberapa langkah yang harus dilakukan.

  1. Download dataset dari Kaggle, Simpan dalam folder yang sama dengan aplikasi untuk mempermudah. Dalam program yang saya buat saya simpan di D:\Project\Python
  2. Extrak Dataset dogs-vs-cats, di dalamnya terdapat folder test1 dan train dalam bentuk rar. Ekstrak file test1.rar dan train.rar.
  3. Di dalam direktori train terdapat 12.500 data anjing dan kucing yang digunakan untuk melatih Machine Learning. Sedangkan didalam folder test1 terdapat 12.500 file acak campuran ajing dan kucing yang akan digunakan untuk pengujian.

Pada program dibawah ini, akan membaca file dalam Dataset, nama file akan di potong 3 character untuk mendapatkan jenis file, cat dan dog. Dari nama file kita akan memberikan label cat dengan 0 dan dog dengan angka 1.

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') 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 img_paths = glob.glob('D:\\Project\\Dataset\\dogs-vs-cats\\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[-3:] if category == 'cat': img = cv2.imread(img_path, 0) #print(img_path) hist=PreProcessing(img) data.append(hist) label.append(0) elif category == 'dog': img = cv2.imread(img_path, 0) #print(img_path) hist=PreProcessing(img) data.append(hist) label.append(1) responses=np.float32(label) train_x, valid_x, train_y, valid_y = model_selection.train_test_split(data, label, test_size=0.3,random_state=109) SVM = svm.SVC(C=1.0, kernel='linear', degree=3, gamma='auto') SVM.fit(train_x, train_y)# predict the labels on validation dataset test_data=cv2.imread('D:\\Project\\Dataset\\dogs-vs-cats\\test1\\36.jpg',0) img_resized = cv2.resize(test_data,(32,32)) hist=PreProcessing(img_resized ) predictions_SVM = SVM.predict(test_hist.reshape(1,-1))# Use accuracy_score function to get the accuracy print(int(predictions_SVM))

Setelah Machine Learning (ML) dilatih dengan Dataset, langkah selanjutnya adalah menguji ML untuk mengklasifikasikan sebuah citra. Citra yang akan diuji adalah citra kucing berikut ini.

Dari hasil pengujian didapatkan bahwa citra diatas masuk dalam categori 0 atau kucing, hasil pengujian bisa kita ubah dengan menambahkan beberapa kode berikut untuk menampilkan tulisan “Kucing” atau “Anjing”

if(predictions_SVM==0): print("Kucing") elif(predictions_SVM==1): print("Anjing")

Proses pelatihan ML membutuhkan waktu yang lama, untuk mempersingkat proses prediksi sebaiknya dibuat model yang disimpan dalam file, misalkan SVM.xml. Model disimpan dengan menggunakan paket Pickle.

with open('SVM_classifier', 'wb') as picklefile: pickle.dump(SVM,picklefile) with open('SVM_classifier', 'rb') as training_model: model = pickle.load(training_model) predictions_SVM = model.predict(test_hist.reshape(1,-1)) print_result("Hasil Pengujian dengan SVM",texts,predictions_SVM) if(predictions_SVM==0): print("Kucing") elif(predictions_SVM==1): print("Anjing")

Accuration Score

Untuk mengetahui akurasi score dari pengujian dengan menggunakan

from sklearn.metrics import precision_score

score = classifier.score(valid_x, valid_y) print('Accuracy for {} data: {:.4f}'.format(source, score))