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 MSWTD (Multiscale Wavelet Transform Decomposition).
Mirip seperti Algoritma DWT (Discrete Wavelet Transform), 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 dari masing-masing sample gambar yang digunakan
Nantinya setiap gambar akan mengalami segmentasi dimulai dari pointer indeks yang sedang terpilih
Diasumsikan dalam kasus ini, ukuran per sample adalah 92 x 2
Karena contoh kasus ini menggunakan contoh gambar dengan ukuran 92 x 112,
maka setiap sample yang digunakan adalah 2 baris data gambar
ukuranPerSample = 92*2;
1b. Tentukan konstanta penambah indeks pointer dalam setiap pengambilan sample
Diasumsikan dalam kasus ini, penambah indeks pointer adalah 92
Karena contoh kasus ini menggunakan contoh gambar dengan ukuran 92 x 112,
maka pergeseran pointer akan berpindah tepat 1 baris berikutnya
penambahIndeksPointer = 92;
1c. Tentukan nilai frekuensi sample, yang nantinya digunakan untuk menghitung jumlah level dekomposisi
Diasumsikan dalam kasus ini, nilai frekuensi sample adalah 92
Karena contoh kasus ini menggunakan contoh gambar dengan ukuran 92 x 112,
maka frekuensi sample adalah 1 baris dari data gambar utuh
frekuensiSample = 92;
* 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);
* Lakukan proses pengambilan fitur gambar contoh wajah dengan metode MSWTD (Multiscale Wavelet Transform Decomposition) (poin 3)
3. Lakukan perhitungan pada masing-masing gambar contoh wajah (poin 3a – 3c)
for i=1:jumlahContohData . . .
3a. Simpan data gambar wajah yang ada
str=strcat(pathContohData,'\',bmpContohData(i).name); daftarGambar(:,:,i)=imread(str);
3b. Lakukan proses perhitungan dengan metode MSWTD (Multiscale Wavelet Transform Decomposition)
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 3b1 – 3b10)
matriksFeatureContohData(:,:,i) = MSWTD(daftarGambar(:,:,i));
Memasuki perhitungan pada fungsi MSWTD
3b1. Hitung jumlah data dan jumlah kolom data yang ditemukan pada input data
Kemudian hitung jumlah sample yang akan didapatkan pada perhitungan berikutnya
jumlahData = size(data,1); jumlahKolomData = size(data,2); jumlahSample = floor((jumlahData - ukuranPerSample)/penambahIndeksPointer)+1;
3b2. Lakukan proses segmentasi data sebanyak jumlah sample
jika terdapat 6 buah data seperti berikut:
[ 1 ]
[ 2 ]
[ 3 ]
[ 4 ]
[ 5 ]
[ 6 ]
dengan ukuran per sample = 3 dan penambah indeks pointer = 2
maka jumlah sample adalah floor((6 – 3) / 2) + 1 = 2
dan sample yang didapatkan adalah [ 1 2 3 ]
dan [ 3 4 5 ]
output = zeros(ukuranPerSample,jumlahSample); pointerIndeksAwal = 1; pointerIndeksAkhir = ukuranPerSample; for i = 1:jumlahSample sampleTerpilih = data(pointerIndeksAwal:pointerIndeksAkhir,:).*repmat(sample,1,jumlahKolomData); output(1:ukuranPerSample,i) = detrend(sampleTerpilih); pointerIndeksAwal = pointerIndeksAwal + penambahIndeksPointer; pointerIndeksAkhir = pointerIndeksAkhir + penambahIndeksPointer; end
3b3. Tentukan variabel J, yaitu jumlah level dekomposisi yang digunakan
Ada beberapa cara untuk menghitung nilai ini
pertama, dapat didefinisikan secara langsung
J=10;
kedua, menggunakan nilai maksimum level dekomposisi wavelet, dengan rumus:
J=wmaxlev(ukuranPerSample,’Sym5′);
ketiga, menggunakan logaritma frekuensi sample, dengan rumus:
J=floor((log(frekuensiSample/2)/log(2))-1);
Dalam kasus ini akan digunakan cara ketiga untuk menentukan nilai J
J=floor((log(frekuensiSample/2)/log(2))-1);
3b4. Lakukan proses perhitungan menggunakan metode MSWTD (Multiscale Wavelet Transform Decomposition)
Proses yang dilakukan adalah proses Multisignal 1-D Wavelet Decomposition
dec = mdwtdec('col',output,J,'db4');
3b5. Lakukan proses konversi struktur hasil perhitungan dekomposisi sebelumnya
[koefisienDekomposisi,panjangKoefisien] = wdec2cl(dec,'all');
3b6. Jika jumlah dimensi variabel dekomposisi adalah 1,
maka lakukan transpos matriks pada koefisien dekomposisi dan matriks panjang koefisien
if isequal(dec.dirDec,'c') jumlahDimensi = 1; end if jumlahDimensi==1 koefisienDekomposisi = koefisienDekomposisi'; panjangKoefisien = panjangKoefisien'; end
3b7. Hitung jumlah sinyal dan jumlah total koefisien yang didapatkan dari matriks koefisien dekomposisi
Kemudian hitung nilai kuadrat dari koefisien tersebut
jumlahSinyal = size(koefisienDekomposisi,1); jumlahTotalKoefisien = size(koefisienDekomposisi,2); kuadratKoefisien = abs(koefisienDekomposisi).^2;
3b8. Hitung persentase energi yang didapatkan dari total energi dan kuadrat koefisien
persentaseEnergi = 0*ones(size(kuadratKoefisien)); TotalEnergi = sum(kuadratKoefisien,2); EnergiBukanNol = (TotalEnergi>0); persentaseEnergi(EnergiBukanNol,:) = 100*kuadratKoefisien(EnergiBukanNol,:)./TotalEnergi(EnergiBukanNol,ones(1,jumlahTotalKoefisien));
* Memasuki proses perhitungan elemen output, yaitu energi, varians, standar deviasi, panjang waveform, dan entropi (poin 3b9)
3b9. Lakukan perhitungan sebanyak jumlah level dekomposisi (poin 3b9a – 3b9e)
for k=1:jumlahLevel+1 . . .
3b9a. Hitung pointer indeks awal dan akhir sebagai batas data yang dihitung pada level ini
pointerIndeksAwal = pointerIndeksAkhir + 1; pointerIndeksAkhir = pointerIndeksAwal + panjangKoefisien(k) - 1;
3b9b. Hitung Energi pada masing-masing panjang waveform
yaitu rata-rata dari persentase energi pada indeks terpilih
Energi(:,k) = mean(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir),2);
3b9c. Hitung Varians
yaitu varians koefisien dekomposisi dari persentase energi pada indeks terpilih
Varians(:,k) = var(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir),0,2);
3b9d. Hitung panjang waveform
yaitu jumlah kuadrat selisih antar data dari persentase energi pada indeks terpilih
PanjangWaveform(:,k) = sum(abs(diff(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir)').^2))';
3b9e. Lakukan normalisasi persentase energi pada indeks terpilih,
Kemudian hitung entropi dari persentase energi tersebut
persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir) = persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir)./repmat(sum(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir),2),1,size(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir),2)); Entropi(:,k) = -sum(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir).*log(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir)),2)./size(persentaseEnergi(:,pointerIndeksAwal:pointerIndeksAkhir),2);
3b10. Hitung nilai output akhir menggunakan nilai energi, varians, panjang waveform, dan entropi yang telah dihitung sebelumnya
output =([log1p([Energi Varians PanjangWaveform]) Entropi]);
3c. Tampilkan gambar contoh wajah tersebut pada layar
subplot(5,jumlahContohData,i) imshow(str) if i==1 title('Contoh gambar wajah: ','Position',[105,0]) end
* Lakukan proses pengambilan fitur gambar wajah baru dengan metode MSWTD (Multiscale Wavelet Transform Decomposition) (poin 4)
4. Lakukan perhitungan pada masing-masing data baru (poin 4a – 4e)
for i=1:jumlahDataBaru . . .
4a. Simpan data gambar wajah baru yang ada
str=strcat(pathDataBaru,'\',bmpDataBaru(i).name); im=imread(str); daftarGambarBaru(:,i)=reshape(im',[H*W, 1]);
4b. Lakukan proses perhitungan dengan metode MSWTD (Multiscale Wavelet Transform Decomposition)
Penjelasan tentang fungsi ini sudah dijelaskan pada perhitungan sebelumnya
matriksFeatureDataBaru(:,:) = MSWTD(daftarGambarBaru(:,i),ukuranPerSample,penambahIndeksPointer,frekuensiSample);
4c. Hitung jarak Euclidean antara vektor feature data baru dengan vektor feature dari semua contoh data
jarakEuclidean = []; for j=1:jumlahContohData tmp = (norm(matriksFeatureDataBaru(:,:) - matriksFeatureContohData(:,:,j))); jarakEuclidean = [jarakEuclidean tmp]; end
4d. Ambil jarak paling minimal sebagai jawaban gambar contoh data yang paling sesuai dengan gambar data baru
[~, idxMinimal] = min(jarakEuclidean);
4e. Tampilkan hasil akhir pada layar
subplot(5,jumlahContohData,sp(i)) imshow(str) title(strcat('Data ',int2str(i)),'Position',[25,0]) subplot(5,jumlahContohData,sp(i)+1) imshow(uint8(daftarGambar(:,:,idxMinimal))) title('Dikenali sebagai','Position',[75,0])
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.