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.
- Download dataset dari Kaggle, Simpan dalam folder yang sama dengan aplikasi untuk mempermudah. Dalam program yang saya buat saya simpan di D:\Project\Python
- Extrak Dataset dogs-vs-cats, di dalamnya terdapat folder test1 dan train dalam bentuk rar. Ekstrak file test1.rar dan train.rar.
- 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))
Code language: PHP (php)
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")
Code language: PHP (php)
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")
Code language: JavaScript (javascript)
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))
Code language: PHP (php)