Data Analysis mini series: Ekstraksi dan Pengenalan Akar Ciri pada Citra menggunakan 1-D dan 2-D Analisis Komponen Utama (Principal Component Analysis)
Pada posting kali ini, saya lampirkan tutorial ekstraksi akar ciri (eigen value) menggunakan 1 Dimensional dan 2 Dimensional Principal Component Analysis.
Semoga bermanfaat.
Implementasi
pada program Scilab (Alternatif OpenSource dari Matlab) adalah
sebagai berikut:
Semoga bermanfaat.
1-Dimensional Principal Component Analysis
1.1. Pengambilan Sampling Data
Pengambilan sampling
dilakukan terhadap 10 citra berdimensi sama 40 x 30. Dikarenakan
metode yang digunakan adalah PCA 1-dimensi, maka matriks data awal X
yang akan terbentuk berukuran 10 x 120, di mana untuk kolom
didapatkan dari perkalian dimensi citra yang berukuran 40x30. Di
mana,
(1)
Gambar
1. Training Set dari
Percobaan
Pjg
= 40;
Lbr
= 30;
path
= '/home/irfan/Documents/Library/MatStat/eigenfaces/train/NEW';
files=ls([path+'/*.jpg']);
[M,N]=size(files);
X
= zeros(Pjg*Lbr,M);
for
i=1:M
I=imread(files(i));
X(i,:)=I(:)';
end
Di
mana M di sini adalah jumlah sample atau jumlah file citra.
Kemudian akan didapatkan
matriks kovarian dari X,
(2)
Pada
Scilab cukup dengan
menjalankan perintah berikut:
sigma = cov(X)
C
di sini berukuran 1200x1200. Dari
matriks kovarian C akan diambil akar dan vektor ciri (eigen
value dan
eigen vector).
[vektor akar] = spec(C)
Gambar
2 Grafik nilai eigen keseluruhan
Gambar
3 Zoom-In Grafik 10 nilai eigen terbesar
Dapat dilihat 9 (akar ciri ke 1192 s/d 1200) data terakhir mempunyai
nilai terbesar, sehingga dapat digunakan untuk mewakili keseluruhan
data.
d(1192) = 5398.7598042047
d(1193)
= 10828.3728442299
d(1194)
= 16924.6449578813
d(1195)
= 25628.6844884707
d(1196)
= 29159.6006556484
d(1197)
= 52751.539406419
d(1198)
= 77438.4095009928
d(1199)
= 220396.243227186
d(1200)
= 367305.167337189
Untuk mendapatkan 90% dari ke-9 data tersebut dipilih beberapa yang
dapat mewakili, melalui percobaan berikut:
-
d(1200)
d(1200)/sum(d)
= 0.4558089
akar ciri ke 1200
mewakili 45 % data
-
d(1200) dan d(1199)
(d(1200)+d(1199))/sum(d)
= 0.7293106
-
d(1200),d(1199), dan d(1198)(d(1200)+d(1199)+d(1198))/sum(d) = 0.7293106
-
Hingga akar ciri ke-6, didapatkan persentase sebesar 92%(d(1200) + d(1199) + d(1198) + d(1197) + d(1196))/sum(d) = 0.9270561
v(:1) = vektor(:,1200);
v(:,2)
= vektor(:,1200);
v(:,3)
= vektor(:,1199);
v(:,4)
= vektor(:,1198);
v(:,5)
= vektor(:,1197);
v(:,6)
= vektor(:,1196);
Kemudian v akan
digunakan untuk mengambil porsi data yang mewakili X dengan cara
mengalikan v dengan X menghasilkan matriks Y yang berukuran
1200x1200:
Selanjutnya Y akan
digunakan untuk menghitung jarak antar sample data, untuk kemudian
dilakukan clustering.
1.2. Clustering
Untuk melakukan
clustering, langkah pertama adalah menghitung jarak euclidian dari
Y. Untuk implementasinya digunakan software opensource R-Studio,
berikut script untuk
menghitung jarak, sekaligus clustering data,
DIST_
= dist(Y);
CLUST_
= hclust(DIST_);
Kemudian
lakukan plotting terhadap
CLUST_,
plot(CLUST_);
1.3. Rekonstruksi
Untuk melakukan
rekonstruksi dari pembentukan matriks Y akan dikembalikan cukup
citra asli X. Karena
,
maka
.
Berikut
citra hasil rekonstruksi:
.
Gambar 4 Hasil
Rekonstruksi Image pertama 1D-PCA
Hasil Rekonstruksi
terlihat masih belum terlalu baik, dan kurang mendekati citra asli.
2-Dimensional Principal Component Analysis
2.1. Pengambilan
Sample Data
Sama halnya dengan
1D-PCA, tujuan dari 2D-PCA adalah membentuk komponen PCA yang daoat
mewakili data secara keseluruhan. Hanya mempunyai beda pada
pengambilan data sample. Apabila pada 1D-PCA X berukuran MxN, di
mana M adalah jumlah image, dan N adalah perkalian ukuran dimensi
citra P x L. Untuk setiap x
berukuran
1 x N,
(3)
Untuk 2D-PCA, setiap
akan berukuran 1 x P x L, membentuk suatu matriks 2 dimensi,
(4)
Implementasi di Scilab:
Pjg
= 40;
Lbr
= 30;
path
= '/home/irfan/Documents/Library/MatStat/eigenfaces/train/NEW';
files=ls([path+'/*.jpg']);
[M,N]=size(files);
X
= zeros(M,Pjg,Lbr);
for
i=1:M
I=imread(files(i));
X(i,:,:)=I;
end
Langkah
selanjutnya adalah menentukan matriks kovarian G,
(5)
Di
mana,
(6)
Adalah
rataan dari X.
Dikarenakan
pada scilab fungsi cov
tidak dapat melakukan perhitungan untuk item data yang berukuran 2
dimensi, maka untuk perhitungan kovarian (5), harus didapatkan
terlebih dahulu rataan (6), sebagai berikut,
[L,M,N]=size(X);
RATAAN
= zeros(1,M,N);
for
i = 1:L
RATAAN
= RATAAN + X(i,:,:);
end
RATAAN
= RATAAN ./ L;
Dilanjutkan
dengan perhitungan kovarian G,
G
= zeros(N,N);
tampung
= zeros(N,N);
for
i=1:L
tamphi
= matrix(phi(i,:,:),40,30);
tampung
= tamphi' * tamphi;
G
= G + tampung;
end
G
= G / L
Di
mana untuk G sendiri adalah matriks berukuran NxN = 30x30, jauh lebih
kecil dibandingkan dengan 1D-PCA yang mempunyai matriks kovarian
berukuran 1200x1200. Langkah selanjutnya adalah untuk mencari akar
ciri, yang dihasilkan oleh G,
[vektor
akar] = spec(G);
Di
mana vektor adalah vektor eigen berukuran NxN, dan akar adalah nilai
eigen yang ditampung pada matriks diagonal juga berukuran NxN. Sekali
lagi 2D-PCA mempunyai keunggulan pada jumlah penggunaan resource
yang lebih kecil dibanding
1D-PCA.
Adapun
akar ciri dari G adalah sebagai berikut:
Gambar
5 Grafik ke-30 nilai eigen 2D-PCA
Untuk
mendapatkan 90 % citra yang mewakili data keseluruhan, maka setelah
beberapa perhitungan, didapatkan 11 akar ciri, sehingga diambil
vektor ciri terbesar sebagai berikut:
v(:,1)
= vektor(:,30);
v(:,2)
= vektor(:,29);
v(:,3)
= vektor(:,28);
v(:,4)
= vektor(:,27);
v(:,5)
= vektor(:,26);
v(:,6)
= vektor(:,25);
v(:,7)
= vektor(:,24);
v(:,8)
= vektor(:,23);
v(:,9)
= vektor(:,22);
v(:,10)
= vektor(:,21);
2.2. Clustering
Sama halnya dengan
1D-PCA, sebelum melakukan clustering, perlu dibentuk matriks Y,
sebagai dasar perhitungan jarak antar item sample. Hanya saja untuk
2D-PCA untuk setiap
,
akan berukuran 10
x 40, sesuai dengan akar ciri yang dipilih sejumlah 10.
Implementasi
pada Scilab:
Y
= zeros(10,11,40);
for
i=1:10
tamphi
= matrix(phi(i,:,:),40,30);
Y(i,:,:)
= v' * tamphi';
end
Sedangkan
perhitungan jarak akan digunakan norm untuk menghitung semua elemen
Y.
DIST
= zeros(10,10);
for
i=1:10
for
j=1:10
YA
= matrix(Y(i,:,:),11,40);
YB
= matrix(Y(j,:,:),11,40);
NAB
= norm(YA-YB);
DIST(i,j)=NAB;
end
Berikut
jarak antar elemen dalam Y:
Tabel 1. Jarak Y
pada 2D-PCA
Jarak di sini akan dibawa ke dalam
R-Studio untuk selanjutnya dilakukan clustering data:
CLUST_
= hclust(DIST_);
Dan
berikut adalah hasil clustering
dari jarak DIST_
yang
sudah didapatkan:
2.3. Rekonstruksi
Gambar 6. Hasil
Rekonstruksi citra ke-1 dengan 2D-PCA
Terlihat 2D-PCA menghasilkan
rekonstruksi citra yang lebih baik, dengan persentasi akar ciri yang
sama dengan 1D-PCA sebelumnya yaitu +/-90%.
3. Kesimpulan
Penggunaan 2D-PCA
tidak hanya lebih efisien pada manajemen sumber
daya pada komputer, tetapi juga menghasilkan akurasi pengelompokan
data yang lebih detail. Selain itu 2D-PCA menghasilkan kualitas
rekonstrksi citra yang juga lebih baik dan mendekati citra aslinya.
Komentar
Posting Komentar