Pengenalan Pola adalah cabang kecerdasan yang menitik-beratkan pada metode pengklasifikasian objek ke dalam klas – klas tertentu untuk menyelesaikan masalah tertentu. Contoh yang dibahas kali ini adalah mengenai penentuan pola wajah baru berdasarkan pola wajah yang sudah ada sebelumnya dengan menggunakan metode Kekre’s Transform.
Mirip seperti Algoritma Gabor Filter, algoritma ini digunakan untuk mengekstrak feature dari sebuah gambar, agar kemudian dapat dilakukan perbandingan dari masing-masing feature tersebut.
Diasumsikan ada 10 wajah manusia yang sudah diketahui sebelumnya, dengan data sebagai berikut:
Selanjutnya ada pola wajah baru yang ingin diketahui hasilnya
Maka tentukan pola wajah baru ini cocok dengan pola wajah yang mana
Diasumsikan pola wajah yang baru adalah sebagai berikut:
Langkah-langkah penggunaan algoritma ini adalah
* Lakukan inisialisasi variabel yang digunakan dalam perhitungan (poin 1)
1a. Tentukan ukuran resize dari masing-masing gambar
Nantinya setiap gambar akan diubah ukurannya menjadi gambar persegi dengan panjang dan tinggi yang sama
Resize ini diperlukan karena perhitungan metode ini memerlukan input matriks dalam ukuran yang sama
Diasumsikan dalam kasus ini, ukuran resize gambar adalah 128
ukuranResize=128;
1b. Tentukan parameter amin dan amax untuk digunakan dalam perhitungan konversi matriks menjadi grayscale
Nantinya semua nilai dibawah nilai minimal akan dikonversi menjadi angka 0,
dan semua nilai diatas nilai maksimal akan dikonversi menjadi angka 1
Diasumsikan dalam kasus ini, nilai amin adalah 0 dan amax adalah 127
gray.amin = 0; gray.amax = 127;
* Lakukan pembacaan gambar contoh data yang tersedia (poin 2)
2a. Tentukan path folder dari gambar contoh data dan gambar data baru
pathContohData = 'ContohData'; pathDataBaru = 'DataBaru';
2b. Cari semua gambar contoh wajah dan data baru yang tersedia pada masing-masing folder
Kemudian hitung jumlah gambar untuk masing-masing contoh data dan data baru yang tersedia
bmpContohData=dir(sprintf('%s/*.bmp',pathContohData)); bmpDataBaru=dir(sprintf('%s/*.bmp',pathDataBaru)); jumlahContohData=size(bmpContohData,1); jumlahDataBaru=size(bmpDataBaru,1);
2c. Tentukan tinggi (H) dan lebar (W) dari masing-masing gambar
Kemudian buat matriks kosong berukuran H*W sebanyak jumlah gambar contoh data
str=strcat(pathContohData,'\',bmpContohData(1).name); im=imread(str); H=size(im,1); W=size(im,2); daftarGambar=zeros(H,W,jumlahContohData);
2d. Tampilkan data contoh gambar yang tersedia
dan masukkan ke dalam matriks gambar
for i=1:jumlahContohData str=strcat(pathContohData,'\',bmpContohData(i).name); daftarGambar(:,:,i)=imread(str); subplot(5,jumlahContohData,i) imshow(str) if i==1 title('Contoh gambar wajah: ','Position',[105,0]) end end
3. Lakukan proses perhitungan dengan metode Kekre’s Transform
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 3a – 3d)
[res] = kekre(ukuranResize, gray, ... pathDataBaru, bmpDataBaru, jumlahContohData, jumlahDataBaru, daftarGambar);
Memasuki perhitungan pada fungsi kekre
3a. Tentukan jumlah gambar contoh data yang digunakan
Untuk mempercepat perhitungan, jumlah gambar contoh data bisa dikurangi dari data sebenarnya
Diasumsikan dalam kasus ini, karena gambar contoh data yang hanya sedikit,
maka akan digunakan semua contoh gambar tersebut
jumlahGambarTerpilih = jumlahContohData;
3b. Lakukan perhitungan kernel spesifik yang digunakan
kernel yang digunakan dalam kasus ini dihitung dengan cara berikut:
jika terdapat matriks berukuran 5 x 5, maka hasil akhir kernel adalah:
[ 1 1 1 1 1]
[-4 1 1 1 1]
[ 0 -3 1 1 1]
[ 0 0 -2 1 1]
[ 0 0 0 -1 1]
K=zeros(ukuranResize); for i=1:ukuranResize for j=i:ukuranResize K(i,j)=1; end end for i=2:ukuranResize K(i,i-1)=(-ukuranResize)+(i-1); end
* Memasuki proses konversi gambar contoh data ke dalam matriks Z (poin 3c)
3c. Lakukan perhitungan sebanyak jumlah gambar terpilih (poin 3c1 – 3c4)
for i=1:jumlahGambarTerpilih . . .
3c1. Lakukan pembacaan gambar contoh data,
Kemudian ubah ukurannya sesuai dengan parameter ukuranResize
img=daftarGambar(:,:,i); img=imresize(img,[ukuranResize ukuranResize]);
3c2. Hitung matriks I dengan cara mengalikan masing-masing kolom data gambar dengan matriks kernel yang sudah ditentukan sebelumnya
I=zeros(ukuranResize); for j=1:ukuranResize L=img(:,j); L=double(L); M=K*L; I(:,j)=M; end
3c3. Hitung jawaban akhir dengan rumus:
A = K * I * KT
Kemudian lakukan konversi matriks tersebut menjadi gambar sesuai dengan batasan parameter gray
A=K*I*K'; A=mat2gray(A,[gray.amin gray.amax]);
3c4. Untuk memudahkan perhitungan jarak, maka lakukan konversi gambar 2 dimensi menjadi vektor 1 dimensi
Z(:,i)=reshape(A,ukuranResize*ukuranResize,1);
* Memasuki proses konversi gambar data baru ke dalam matriks Y (poin 3d)
3d. Lakukan perhitungan pada masing-masing gambar data baru (poin 3d1 – 3d5)
for i=1:jumlahDataBaru . . .
3d1. Lakukan pembacaan gambar data baru,
Kemudian ubah ukurannya sesuai dengan parameter ukuranResize
str=strcat(pathDataBaru,'\',bmpDataBaru(i).name); img=imread(str); img=imresize(img,[ukuranResize ukuranResize]);
3d2. Hitung matriks I dengan cara mengalikan masing-masing kolom data gambar dengan matriks kernel yang sudah ditentukan sebelumnya
I=zeros(ukuranResize); for j=1:ukuranResize L=img(:,j); L=double(L); M=K*L; I(:,j)=M; end
3d3. Hitung jawaban akhir dengan rumus:
A = K * I * KT
Kemudian lakukan konversi matriks tersebut menjadi gambar sesuai dengan batasan parameter gray
A=K*I*K'; A=mat2gray(A,[gray.amin gray.amax]);
3d4. Untuk memudahkan perhitungan jarak, maka lakukan konversi gambar 2 dimensi menjadi vektor 1 dimensi
Y=reshape(A,ukuranResize*ukuranResize,1);
3d5. Lakukan perhitungan pada masing-masing data gambar terpilih (poin 3d5a – 3d5b)
for j=1:jumlahGambarTerpilih . . .
3d5a. Hitung jarak Euclidean antara matriks Y dan masing-masing matriks Z
jarakEuclidean=norm(Y-Z(:,j));
3d5b. Ambil jarak paling minimal sebagai jawaban gambar contoh data yang paling sesuai dengan gambar data baru
if (minJarak > jarakEuclidean) & (jarakEuclidean > 0) minJarak = jarakEuclidean; res(i,2) = j; end
4. Lakukan perhitungan pada masing-masing data baru
Tampilkan hasil akhir masing-masing gambar pada layar
for i=1:jumlahDataBaru str=strcat(pathDataBaru,'\',bmpDataBaru(i).name); subplot(5,jumlahContohData,sp(i)) imshow(str) title(strcat('Data ',int2str(i)),'Position',[25,0]) subplot(5,jumlahContohData,sp(i)+1) imshow(uint8(daftarGambar(:,:,res(i,2)))) title('Dikenali sebagai','Position',[75,0]) end
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code menggunakan Matlab dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.