Algoritma MSWTD (Multiscale Wavelet Transform Decomposition)


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:
ef contoh data

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:
gabor data baru


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)

MSWTD hasil akhir


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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *