Langsung ke konten utama

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.

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)
Implementasi pada program Scilab (Alternatif OpenSource dari Matlab) adalah sebagai berikut:


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:
  1. d(1200)
d(1200)/sum(d) = 0.4558089
akar ciri ke 1200 mewakili 45 % data
  1. d(1200) dan d(1199)
(d(1200)+d(1199))/sum(d) = 0.7293106
  1. d(1200),d(1199), dan d(1198)
      (d(1200)+d(1199)+d(1198))/sum(d) = 0.7293106
  2. 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

Postingan populer dari blog ini

Berkenalan dengan Laravel

Cukup disayangkan, Codeigniter sudah sampai ke tahap "penguburan" - paling tidak ini klaim dari Ellis Lab- dan ini cukup mengusik kenyamanan saya untuk menggunakan CI. Padahal juga sesuai dengan pengakuan rekan-rekan web developer, CI menurut saya cukup mudah dan powerful untuk digunakan dalam membangun sebuah web apps, dan terbukti juga CI sempat jadi trendsetter untuk framework PHP. Saya jadi penasaran framework PHP apa yang jadi the next PHP Framework star setelah CI, setelah menggali informasi beberapa kali, saya temukan Laravel saat ini banyak jadi batu loncatan developer CI. Alasannya sederhana, Laravel banyak kemiripan dengan CI. Dari analisa Google Trends juga terlihat kepopuleran Laravel saat tulisan ini dibuat juga menanjak meskipun masih kalah populer dengan CI (cukup mengherankan CI masih memimpin untuk masalah kepopuleran). Jadi langsung saja saya mencoba mengeksplorasi barang baru ini. Berikut langkah-langkahnya: 0. Install curl 1. Install composer: ...

Perbandingan Algoritme Dynamic Programming, Greedy, dan Backtrack Programming.

Sebetulnya posting ini bisa dibilang sudah kadaluarsa.  But, Better be late than never at all, right mate ? Ok, sebetulnya(lagi) Saya ingin menulis ulang semua yang ada di tugas semester 1 mata kuliah Analisa Algoritme, namun setelah dipikir-pikir lagi rasa-rasanya akan mubadzir, jadi di sini akan Saya gambarkan ulang secara ringkas saja apa perbedaan Dynamic Programming, Greedy dan Backtrack. Sebelum menyentuh ke dalam algoritmenya, Kita lihat terlebih dahulu kasus permasalahannya. Tentu belajar akan lebih mudah apabila tidak hanya dengan mempelajari teorinya saja. Umumnya orang akan lebih semangat apabila ada kasus menarik yang dipelajari. Tentang Knapsack Knapsack sendiri merupakan permasalahan pencuri yang ingin mencuri barang dengan cara memasukkan sebanyak-banyaknya dan seberharga-berharganya barang yang ada ( of course, its a theft ), sejumlah wadah yang pencuri tersebut punya. Diharapkan dengan menerapkan beberapa algoritme ini pencuri dapat meraup keuntungan sebanyak...

Data Analysis Series: Perceptron - Basic Artificial Neural Network

Pendahuluan Pada posting berikut ini saya akan menyampaikan materi tentang (Artificial) Neural Network. Algoritme yang satu ini terinspirasi dari cara kerja sel otak dalam memproses informasi. Sedikit di bawah ini pertama-tama akan saya sampaikam penjelasan bagaimana sel otak bekerja, untuk mempermudah pemahaman bagaimana ANN dapat terinspirasi. Sel Otak (Sumber:  www.wealltest.com ) Seperti yang kita ketahui, otak terdiri atas milyaran sel. Tiap-tiap sel tersebut terbagi atas tiga bagian, yaitu Dendrites, atau receptor, bagian yang menerima sinyal/stimulasi dari sel-sel otak yang lain. Sinyal/stimulasi yang masuk ke dendrite tersebut awalnya berasal dari indra perangsang kita, seperti mata, kulit, telinga, dan lidah. Dari dendrite, sinyal kemudian diteruskan melalui Axon, semacam pipa penghubung, yang mentransmisikan sinyal dari dendrite, untuk ditransmisikan ulang ke sel lain melalui Synapse. Bisa dikatakan, Synapse ini berfungsi sebagai akumulator untuk dari info...