Pengenalan Pola adalah cabang kecerdasan yang menitik-beratkan pada metode pengklasifikasian objek ke dalam kelas – kelas 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 Eigenface.
Algoritma Eigenface adalah salah satu algoritma yang cukup populer dalam menyelesaikan masalah pengenalan wajah manusia, keunggulannya adalah dari segi implementasi rumus yang mudah dipahami, dan waktu eksekusi yang cukup cepat dibandingkan algoritma lainnya. Hasil yang didapatkan juga cukup baik, tetapi tidak sebaik algoritma lain yang lebih sulit untuk diimplementasikan.
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 proses pembelajaran pada masing-masing contoh gambar wajah yang tersedia
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 1a – 1i)
[daftarGambar,H,W,M,m,U,omega]=PerhitunganContohData('ContohData');
Memasuki perhitungan pada fungsi PerhitunganContohData (poin 1a – 1i)
1a. Ambil semua gambar contoh wajah yang tersedia
bmpContohData=dir(sprintf('%s/*.bmp',pathContohData));
1b. Tentukan tinggi (H) dan lebar (W) dari masing-masing gambar
Kemudian hitung jumlah gambar yang tersedia (M)
H=size(im,1); %Tinggi gambar W=size(im,2); %Lebar gambar M=size(bmpContohData,1); %Jumlah gambar
1c. Baca masing-masing gambar yang tersedia,
kemudian lakukan konversi gambar tersebut menjadi vektor gambar (vec)
for i=1:M str=strcat(pathContohData,'\',bmpContohData(i).name); daftarGambar(:,:,i)=imread(str); vec(:,i)=reshape(daftarGambar(:,:,i),H*W,1); end
1d. Hitung rata-rata (m) dari masing-masing gambar dengan rumus:
m = (1/M) * E(vec)
m=sum(vec,2)/M;
1e. Hitung selisih antara gambar dengan rata-rata gambar dengan rumus:
A(i) = vec(i) – M
A=vec-repmat(m,1,M);
1f. Hitung matriks kovarian (C) dengan rumus:
C = AT * A
C=A'*A;
1g. Hitung vektor eigen (V) dan nilai eigen (lambda) dengan rumus:
Fungsi eig akan melakukan dekomposisi matriks kovarian menjadi matriks V dan lambda
[V,lambda]=eig(C);
1h. Hitung nilai eigenface dari masing-masing contoh gambar dengan rumus:
U = A * V
U=A*V;
1i. Setelah menemukan nilai eigenface,
Hitung nilai bobot (W) untuk masing-masing gambar dengan rumus:
W(i) = U(i)T * A
Kemudian masukkan semua nilai bobot pada masing-masing gambar sebagai nilai omega
omega=U'*A;
* Lakukan proses perhitungan pada data baru menggunakan nilai eigenface yang sudah ditemukan sebelumnya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 2a – 2e)
PerhitunganDataBaru('ContohData','Databaru',daftarGambar,H,W,M,m,U,omega)
Memasuki perhitungan pada fungsi PerhitunganDataBaru
2a. Cari gambar contoh wajah yang tersedia untuk ditampilkan
bmpContohData=dir(sprintf('%s/*.bmp',pathContohData));
2b. Cari gambar data wajah baru yang tersedia
bmpDataBaru=dir(sprintf('%s/*.bmp',pathDataBaru));
2c. Hitung jumlah gambar data baru yang tersedia
jumlahDataBaru=size(bmpDataBaru,1);
2d. Tampilkan data contoh gambar yang tersedia
for i=1:M str=strcat(pathContohData,'\',bmpContohData(i).name); bmp=imread(str); subplot(1+jumlahDataBaru,M,i) imshow(bmp) if i==1 title('Contoh gambar wajah: ','Position',[105,0]) end end
2e. Lakukan perhitungan pada masing-masing data baru (poin 2e1 – 2e6)
for i=1:jumlahDataBaru str=strcat(pathDataBaru,'\',bmpDataBaru(i).name); tmpBmp=imread(str); bmp=reshape(tmpBmp,H*W,1); testBmp=double(bmp); . . .
2e1. Hitung selisih antara gambar dengan rata-rata gambar (A)
selisihBmp=testBmp-m;
2e2. Hitung nilai bobot (om) pada gambar yang baru dengan rumus:
om = UT * A
om=U'*selisihBmp;
* Tentukan gambar contoh yang paling baik dalam mendeskripsikan data baru
dengan cara mencari minimal dari jarak Euclidean
2e3. Hitung nilai E(k) dengan rumus:
E(k) = om(k) – omega
d=repmat(om,1,M)-omega;
2e4. Hitung jarak euclidean dari nilai E(k) yang sudah ditentukan sebelumnya
for j=1:M dist(j,1)=norm(d(:,j)); end
2e5. Tentukan jawaban gambar, yaitu gambar yang memiliki jarak Euclidean terendah dari semua gambar
idx=MinimalIndeks(dist);
2e6. Tampilkan pada layar
subplot(1+jumlahDataBaru,M,(i*M)+1) imshow(str) title(strcat('Data ',int2str(i)),'Position',[25,0]) subplot(1+jumlahDataBaru,M,(i*M)+2) imshow(uint8(daftarGambar(:,:,idx))) 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.
bisakah algoritma ini digunakan untuk pengenalan abjad melalui gerak bibir ?
Secara teori hal tersebut seharusnya dapat dilakukan. Pelatihan dilakukan pada dataset wajah dengan cara pengucapan masing-masing abjad, kemudian data input dibandingkan dengan masing-masing dataset tersebut sebagai proses klasifikasi.
apakah menggunakan ekstraksi ciri trlebih dahulu ?
Eigenface sudah mengandung metode PCA yang dapat dianggap sebagai metode untuk melakukan ekstraksi fitur, tetapi tentu saja dapat dimodifikasi / ditambahkan metode lain apabila diperlukan
Min cara download source code dan datanya gimana
Modul dapat diambil dengan mengklik tombol yang terdapat di akhir pos setelah memberikan centang pada bagian captcha. Jika captcha tidak muncul maka silahkan melakukan refresh untuk memunculkan captcha tersebut. Terima kasih.