Face Recognition Menggunakan Metode Two Dimensional Principal Components Analysis (2DPCA).

(1)

FACE RECOGNITION MENGGUNAKAN METODE

TWO-DIMENSIONAL PRINCIPAL COMPONENTS ANALYSIS (2DPCA)

Kurnia Novita Mutu (0722029)

Jurusan Teknik Elektro Universitas Kristen Maranatha email: mutunia@gmail.com

ABSTRAK

Perkembangan biometrik pada teknologi informasi saat ini sangat pesat. Salah satu bidang biometrik yang sedang dikembangkan adalah Face Recognition. Face

recognition merupakan sebuah teknik pengolahan citra yang dapat mengenali seseorang

berdasarkan wajahnya. Pada Tugas Akhir ini metode face recognition yang digunakan adalah metode Two-Dimensional Principal Components Analysis (2DPCA).

Pada 2DPCA matriks citra dua dimensi tidak perlu diubah dulu menjadi vektor satu dimensi untuk ektraksi ciri seperti pada Principal Components Analysis (PCA). Matriks kovarian citra diperoleh langsung menggunakan matriks citra dan vektor – vektor proyeksinya (eigenvector) dicari yang saling orthonormal untuk ektraksi ciri.

Dari hasil uji coba aplikasi face recognition menggunakan metode

Two-Dimensional Principal Components Analysis (2DPCA) diketahui bahwa persentase

keberhasilan pengenalan, yang berkisar pada 94% sampai 96%, dipengaruhi oleh jumlah

eigenvector yang digunakan pada algoritma. Sedangkan, faktor pose dan ekspresi

mempengaruhi nilai feature vector citra.

Kata kunci : Face recognition, 2DPCA, eigenvektor, fitur vektor


(2)

Universitas Kristen Maranatha ii

FACE RECOGNITION USING TWO-DIMENSIONAL PRINCIPAL

COMPONENTS ANALYSIS (2DPCA) METHOD

Kurnia Novita Mutu (0722029)

Department of Electrical Engineering Maranatha Christian University email: mutunia@gmail.com

ABSTRACT

Recently the progress of biometrics in information technology is very rapid. A field of biometric area that is being developed is Face Recognition. Face recognition is an image processing technique that can identify a person based on his or her face. The method for face recognition which is used in this final project is Two-Dimensional Principal Components Analysis (2DPCA).

In the 2DPCA a two-dimensional image matrix does not need to be converted first into a one-dimensional image vector for feature extraction such as in Principal Components Analysis (PCA). Covariance matrix of the image is obtained directly using the image matrices and projection vectors (eigenvectors) are mutually orthonormal searched for features extraction.

From the test results of face recognition application using the Two-Dimensional Principal Components Analysis (2DPCA) it is noted that the percentage of successful of face recognition is between 94% to 96%. Percentage of successful is affected by the eigenvector values used in the algorithm. Meanwhile, factors of pose and expression affect the value of the feature vector of image.


(3)

DAFTAR ISI

Halaman

ABSTRAK ... i

ABSTRACT ... ii

KATA PENGANTAR ... iii

DAFTAR ISI ... v

DAFTAR GAMBAR ... vii

DAFTAR TABEL ... x

DAFTAR LAMPIRAN ... xi

BAB I. PENDAHULUAN ... 1

1.1 Latar Belakang ... 1

1.2 Rumusan Masalah ... 2

1.3 Tujuan ... 2

1.4 Pembatasan Masalah ... 3

1.5 Metodologi Penelitian... 3

1.6 Sistematika Pembahasan ... 4

BAB II. LANDASAN TEORI ... 6

2.1 Dasar Pengolahan Citra ... 6

2.1.1 Citra Garyscale... 6

2.2 Format Bitmap ... 7

2.3 Deteksi wajah menggunakan OpenCV... 7

2.4 Bahasa Pemograman Java... 8

2.5 Matriks ... 8

2.5.1 Matriks Kovarian... 9

2.5.2 Eigenvalue dan Eigenvector... 9

2.6 Pengenalan Wajah... 10

2.6.1 Two-Dimensional Principal Components Analysis (2DPCA)…... 11


(4)

Universitas Kristen Maranatha vi

BAB III. PERANCANGAN DAN REALISASI PERANGKAT LUNAK ... 14

3.1 Perancangan aplikasi face recognition menggunakan metode 2DPCA... 14

3.2 Penerapan Algoritma 2DPCA... 19

3.3 Perancangan Perangkat Lunak ... 20

3.3.1 Perangkat Lunak Aplikasi Face Recognition... 20

3.3.2 Realisasi Perangkat Lunak Aplikasi Face Recognition... 20

3.3.3 Cara Penggunaan Perangkat Lunak Aplikasi Face Recognition... 23

BAB IV. PENGUJIAN DAN ANALISIS DATA ... 27

4.1 Pengujian ... 27

4.1.1 Pengumpulan citra... 27

4.1.2 Pengolahan Citra... 40

4.1.3 Hasil Pengenalan Wajah... 41

4.2 Analisis Data... 52

4.2.1 Persentase Keberhasilan Pengenalan... 52

4.2.2 Citra Gagal Dikenali... 53

4.2.3 Analisa Pengaruh Pose dan Ekspresi Pada Nilai Feature Vector... 53

4.2.4 Contoh Kasus Citra Tidak Terdeteksi oleh Aplikasi Face Recognition... 56

BAB V. KESIMPULAN DAN SARAN ... 57

5.1 Kesimpulan ... 57

5.2 Saran ... 57

DAFTAR PUSTAKA ... 58 LAMPIRAN ... A


(5)

DAFTAR GAMBAR

Halaman

Gambar 2.1 Contoh matriks dengan 2 baris dan 3 kolom... 9

Gambar 3.1 Gambar Diagram blok aplikasi face recognition menggunakan metode 2DPCA... 14

Gambar 3.2 Diagram Alir Proses Pengumpulan Citra Acuan... 15

Gambar 3.3 Diagram Alir Proses Pengektraksian Citra Acuan... 16

Gambar 3.4 Diagram Alir Subrutin Ektraksi fitur 2DPCA... 16

Gambar 3.5 Diagram Alir Proses Face Recognition menggunakan metode 2DPCA... 18

Gambar 3.6 Gambar tampilan GUI aplikasi face recognition... 21

Gambar 3.7 Gambar bagian “source image” dan bagian ”face image”... 21

Gambar 3.8 Gambar menubar... 22

Gambar 3.9 Gambar button “Browse”, “Add”, dan “recognize”... 23

Gambar 3.10 Gambar tampilan saat browse gambar citra acuan... 23

Gambar 3.11 Gambar tampilan setelah gambar citra acuan... 24

Gambar 3.12 Gambar tampilan cara menambahkan wajah dari citra acuan ke folder... 25

Gambar 3.13 Gambar tampilan “Invalid Input”... 25

Gambar 3.14 Gambar tampilan “Input” saat memilih tool “Set Number of Selected Eigen Vector (d)”... 26

Gambar 3.13 Gambar tampilan “Result Dialog”... 26

Gambar 4.1 Gambar Citra Acuan Alfian 1-5... 28

Gambar 4.2 Gambar Citra Acuan Budiman 1-5... 28

Gambar 4.3 Gambar Citra Acuan Febryan 1-5... 29

Gambar 4.4 Gambar Citra Acuan Imelda 1-5... 29

Gambar 4.5 Gambar Citra Acuan Kurnia 1-5... 30


(6)

Universitas Kristen Maranatha viii

Gambar 4.7 Gambar Citra Acuan Pak Ade 1-5... 31

Gambar 4.8 Gambar Citra Acuan Thari 1-5... 31

Gambar 4.9 Gambar Citra Acuan Yanimi 1-5... 32

Gambar 4.10 Gambar Citra Acuan Yosua 1-5... 32

Gambar 4.11 Gambar Citra Acuan Alfian 1-5 setelah diolah... 32

Gambar 4.12 Gambar Citra Acuan Budiman 1-5 setelah diolah... 33

Gambar 4.13 Gambar Citra Acuan Febryan 1-5 setelah diolah... 33

Gambar 4.14 Gambar Citra Acuan Imelda 1-5 setelah diolah... 33

Gambar 4.15 Gambar Citra Acuan Kurnia1-5 setelah diolah... 33

Gambar 4.16 Gambar Citra Acuan Nelson 1-5 setelah diolah... 34

Gambar 4.17 Gambar Citra Acuan Pak Ade 1-5 setelah diolah... 34

Gambar 4.18 Gambar Citra Acuan Thari 1-5 setelah diolah... 34

Gambar 4.19 Gambar Citra Acuan Yanimi setelah diolah... 34

Gambar 4.20 Gambar Citra Acuan Yosua 1-5 setelah diolah... 35

Gambar 4.21 Gambar Citra Uji Alfian A-E…... 35

Gambar 4.22 Gambar Citra Uji Budiman A-E... 36

Gambar 4.23 Gambar Citra Uji Febryan A-E... 36

Gambar 4.24 Gambar Citra Uji Imelda A-E... 37

Gambar 4.25 Gambar Citra Uji Kurnia A-E... 37

Gambar 4.26 Gambar Citra Uji Nelson A-E... 38

Gambar 4.27 Gambar Citra Uji Pak Ade A-E... 38

Gambar 4.28 Gambar Citra Uji Thari A-E... 39

Gambar 4.29 Gambar Citra Uji Yanimi A-E... 39

Gambar 4.30 Gambar Citra Uji Yosua A-E... 40

Gambar 4.31 Gambar citra wajah Alfian yang gagal dikenali …... 52

Gambar 4.32 Gambar citra wajah Pak Ade yang gagal dikenali... 53

Gambar 4.33 Gambar persegi penanda wajah yang terdeteksi dan hasil pemotongan... 53

Gambar 4.34 Gambar contoh perbandingan citra wajah Febryan 1 terhadap citra wajah Febryan 1 – 5.. ... 55


(7)

(8)

Universitas Kristen Maranatha x

DAFTAR TABEL

Halaman Tabel 4.1 Tabel J(X) dan eigenvalue dari 10 buah vektor proyeksi yang

memaksimalkan ... 41

Tabel 4.2 Tabel pengujian menggunakan 10 buah eigenvector... 42

Tabel 4.3 Tabel pengujian menggunakan 8 buah eigenvector... 43

Tabel 4.4 Tabel pengujian menggunakan 6 buah eigenvector... 45

Tabel 4.5 Tabel pengujian menggunakan 4 buah eigenvector... 46

Tabel 4.6 Tabel pengujian menggunakan 2 buah eigenvector... 48

Tabel 4.7 Tabel pengujian menggunakan 1 buah eigenvector... 50

Tabel 4.8 Tabel Persentase Keberhasilan Pengenalan... 52


(9)

DAFTAR LAMPIRAN

Halaman


(10)

LAMPIRAN


(11)

package com.fr.core;

import com.googlecode.javacv.cpp.opencv_core; import com.googlecode.javacv.cpp.opencv_imgproc; import com.googlecode.javacv.cpp.opencv_objdetect; import java.awt.image.BufferedImage;

/** *

* @author Kurnia Novita Mutu */

public class FaceDetector {

private static final String CASCADE_FILE =

"C:\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt_tree.xml"; //"haarcascade_frontalface_alt.xml";

private static final int SCALE = 2;

private static final opencv_objdetect.CvHaarClassifierCascade cascade = new opencv_objdetect.CvHaarClassifierCascade(opencv_core.cvLoad(CASCADE_FI LE)); // instantiate a classifier cascade for face detection

public static BufferedImage detectFace(opencv_core.IplImage origImg) {

BufferedImage faceBufferedImage = null;

// convert to grayscale

opencv_core.IplImage grayImg =

opencv_core.IplImage.create(origImg.width(), origImg.height(), opencv_core.IPL_DEPTH_8U, 1);

opencv_imgproc.cvCvtColor(origImg, grayImg, opencv_imgproc.CV_BGR2GRAY);

// scale the grayscale (to speed up face detection) opencv_core.IplImage smallImg =

opencv_core.IplImage.create(grayImg.width()/SCALE, grayImg.height()/SCALE, opencv_core.IPL_DEPTH_8U, 1);

opencv_imgproc.cvResize(grayImg, smallImg, opencv_imgproc.CV_INTER_LINEAR);

// equalize the small grayscale opencv_core.IplImage equImg =

opencv_core.IplImage.create(smallImg.width(), smallImg.height(), opencv_core.IPL_DEPTH_8U, 1);

opencv_imgproc.cvEqualizeHist(smallImg, equImg); // create temp storage, used during object detection opencv_core.CvMemStorage storage =

opencv_core.CvMemStorage.create();

opencv_core.CvSeq faces = opencv_objdetect.cvHaarDetectObjects(equImg, cascade, storage, 1.1, 3,


(12)

A-2 opencv_core.cvClearMemStorage(storage);

// iterate over the faces and draw yellow rectangles around them int total = faces.total();

if(total>0) {

opencv_core.CvRect faceRectangle = new

opencv_core.CvRect(opencv_core.cvGetSeqElem(faces, 0));

int x1 = faceRectangle.x()*SCALE; int y1 = faceRectangle.y()*SCALE;

int x2 = x1+(faceRectangle.width()*SCALE); int y2 = y1+(faceRectangle.height()*SCALE);

int width = faceRectangle.width()*SCALE; int height = faceRectangle.height()*SCALE;

faceBufferedImage = origImg.getBufferedImage().getSubimage(x1, y1, width, height);

opencv_core.cvRectangle(origImg, opencv_core.cvPoint(x1,y1), opencv_core.cvPoint(x2,y2), opencv_core.CvScalar.YELLOW, 1, opencv_core.CV_AA, 0); // undo the scaling

}

//Deallocate grayImg, smallImg, equImg because it's not used anymore. grayImg.release();

smallImg.release(); equImg.release(); System.gc();

return faceBufferedImage; }

}

package com.fr.core;

import java.util.LinkedHashMap; import java.util.Map;

import java.util.Set;

import javax.xml.bind.annotation.XmlRootElement; /**

*

* @author Kurnia Novita Mutu */

@XmlRootElement

public class MapOfFeatureVector {


(13)

LinkedHashMap<>();

public LinkedHashMap<String, double[][]> getMapOfFeatureVector() {

return mapOfFeatureVector; }

public void setMapOfFeatureVector(LinkedHashMap<String, double[][]> mapOfFeatureVector)

{

this.mapOfFeatureVector = mapOfFeatureVector; }

public double[][] put(String key, double[][] value) {

return mapOfFeatureVector.put(key, value); }

public Set<Map.Entry<String,double[][]>> entrySet() {

return mapOfFeatureVector.entrySet(); }

}

package com.fr.core;

import com.fr.properties.MyProperties; /**

*

* @author Kurnia Novita Mutu */

public class Matrix2D {

public static double[][] add(double[][] a, double[][] b, double[][] result) {

double value;

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

value = a[i][j]+b[i][j]; result[i][j] = value; }

}

return result; }


(14)

A-4

public static double[][] sub(double[][] a, double[][] b, double[][] result) {

double value;

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

value = a[i][j]-b[i][j]; result[i][j] = value; }

}

return result; }

public static double[][] multiply(double[][] a, double[][] b) {

int aRows = a.length; int aCols = a[0].length;

int bRows = b.length; int bCols = b[0].length;

if(aCols!=bRows) {

throw new IllegalArgumentException("Matrices don't match: " + aCols + " != " + bRows);

}

double[][] result = new double[aRows][bCols];

for(int i=0; i<aRows; i++) {

for(int j=0; j<bCols; j++) {

for(int k=0; k<aCols; k++) {

result[i][j] += a[i][k]*b[k][j]; }

} }

return result; }

public static double[][] scale(double[][] a, double scalar, double[][] result) {


(15)

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

result[i][j] = a[i][j]*scalar; }

}

return result; }

public static double[][] transpose(double[][] a) {

int rows = a.length; int cols = a[0].length;

double[][] result = new double[cols][rows];

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

result[j][i] = a[i][j]; }

}

return result; }

public static double square(double[][] a, double[][] b) {

double result = 0;

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

result += Math.pow(a[i][j]-b[i][j],2); }

}

result = Math.sqrt(result);

return result; }


(16)

A-6

public static double[][] copy(double[][] a) {

int rows = a.length; int cols = a[0].length;

double[][] result = new double[rows][cols];

for(int i=0; i<rows; i++) {

System.arraycopy(a[i], 0, result[i], 0, cols); }

return result; }

public static String convertToString(double[][] a) {

StringBuilder temp = new StringBuilder();

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

temp.append(a[i][j]).append(MyProperties.PCA_2D_LOG_SEPARATOR); }

}

return temp.substring(0, temp.length()-1); }

public static void print(double[][] a) {

int rows = a.length; int cols = a[0].length;

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

System.out.print(a[i][j]+"\t"); }

System.out.println(); }

} }


(17)

import com.fr.file.FileUtils;

import com.fr.properties.MyProperties; import java.util.ArrayList;

import java.util.Collections; import java.util.LinkedList; import java.util.List;

import org.ejml.data.Matrix64F;

import org.ejml.factory.EigenDecomposition; /**

*

* @author Kurnia Novita Mutu */

public class MyEigenSelector implements Comparable<MyEigenSelector> {

private int index; private double j;

private static double[][] convertMatrix64F(Matrix64F matrix64F) {

int eigenVectorRows = matrix64F.numRows; int eigenVectorCols = matrix64F.numCols;

double[][] eigenVector = new double[eigenVectorRows][eigenVectorCols]; for(int i=0; i<eigenVectorRows; i++)

{

for(int j=0; j<eigenVectorCols; j++) {

eigenVector[i][j] = matrix64F.get(i, j); }

}

return eigenVector; }

public static List<Integer> getListOfOrthonormalIndex(EigenDecomposition ed)

{

char sep = MyProperties.PCA_2D_LOG_SEPARATOR;

StringBuilder log = new StringBuilder();

log.append("sep=").append(sep).append("\r\n"); log.append("List of Eigen Value & Eigen Vector\r\n"); log.append("Index").append(sep).append("Eigen Value").append(sep).append("Eigen Vector\r\n");

List<Integer> listOfOrthonormalIndex = new LinkedList<>(); List<double[][]> temp = new ArrayList<>();


(18)

A-8

for(int i=0; i<ed.getNumberOfEigenvalues(); i++) {

double[][] eigenVector = convertMatrix64F(ed.getEigenVector(i));

log.append(i).append(MyProperties.PCA_2D_LOG_SEPARATOR).append(ed.ge tEigenvalue(i).real).append(MyProperties.PCA_2D_LOG_SEPARATOR).append (Matrix2D.convertToString(eigenVector)).append("\r\n");

temp.add(eigenVector); }

int no = 1;

log.append("\r\n");

log.append("List of Orthonormal Matrices's Index\r\n"); log.append("No.").append(sep).append("Index Matrix I").append(sep).append("Index Matrix II\r\n");

for(int i=0; i<temp.size(); i++) {

for(int j=i+1; j<temp.size(); j++) {

double[][] a = temp.get(i);

double[][] at = Matrix2D.transpose(a); double[][] b = temp.get(j);

double[][] c = Matrix2D.multiply(at, b);

if(c[0][0]==0) {

log.append(no).append(sep).append(i).append(sep).append(j).append("\r\n"); no++;

if(!listOfOrthonormalIndex.contains(i)) {

listOfOrthonormalIndex.add(i); }

if(!listOfOrthonormalIndex.contains(j)) {

listOfOrthonormalIndex.add(j); }

} } }

FileUtils.writeLog(log, false);

return listOfOrthonormalIndex; }

public static void selectEigenVector(EigenDecomposition ed, double[][] covariance, LinkedList<Double> listOfEigenValue, LinkedList<double[][]>


(19)

listOfEigenVector) {

char sep = MyProperties.PCA_2D_LOG_SEPARATOR;

StringBuilder log = new StringBuilder(); log.append("\r\n");

log.append("List of selected Eigen Value & Eigen Vector\r\n"); log.append("Index").append(sep).append("Eigen

Value").append(sep).append("J(Sx)").append(sep).append("Eigen Vector\r\n");

StringBuilder orthonormalInfo = new StringBuilder();

List<Integer> listOfSelectedIndex = getListOfOrthonormalIndex(ed);

List<MyEigenSelector> listOfEigenSelectors = new LinkedList<>();

for(int i=0; i<listOfSelectedIndex.size(); i++) {

int selectedIndex = listOfSelectedIndex.get(i);

double[][] t = convertMatrix64F(ed.getEigenVector(selectedIndex)); double[][] xt = Matrix2D.transpose(t);

double[][] xtCovariance = Matrix2D.multiply(xt, covariance); double[][] jx = Matrix2D.multiply(xtCovariance, t);

MyEigenSelector myEigenSelector = new MyEigenSelector(); myEigenSelector.setIndex(selectedIndex);

myEigenSelector.setJ(jx[0][0]);

listOfEigenSelectors.add(myEigenSelector); }

Collections.sort(listOfEigenSelectors);

int numberOfUsedEigenValue =

Preference.getInstance().getNumberOfSelectedEigenVector();

for(int i=0; i<numberOfUsedEigenValue; i++) {

if(i<listOfEigenSelectors.size()) {

int selectedIndex = listOfEigenSelectors.get(i).getIndex(); double eigenValue = ed.getEigenvalue(selectedIndex).real; double[][] eigenVector =

convertMatrix64F(ed.getEigenVector(selectedIndex));

listOfEigenValue.add(eigenValue); listOfEigenVector.add(eigenVector);

log.append(selectedIndex).append(MyProperties.PCA_2D_LOG_SEPARATOR). append(eigenValue).append(MyProperties.PCA_2D_LOG_SEPARATOR).appen d(listOfEigenSelectors.get(i).j).append(MyProperties.PCA_2D_LOG_SEPARAT


(20)

A-10

OR).append(Matrix2D.convertToString(eigenVector)).append("\r\n"); }

}

FileUtils.writeLog(log, true); }

public int getIndex() {

return index; }

public void setIndex(int index) {

this.index = index; }

public double getJ() {

return j; }

public void setJ(double j) {

this.j = j; }

@Override

public int compareTo(MyEigenSelector obj) {

return Double.compare(obj.getJ(),j); }

}package com.fr.core;

import com.fr.image.util.ImageReader; import com.fr.properties.MyProperties; import java.io.File;

import java.io.FileFilter; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.HashMap;

import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List;

import java.util.Map;

import org.ejml.data.DenseMatrix64F;

import org.ejml.factory.DecompositionFactory; import org.ejml.factory.EigenDecomposition; /**


(21)

* @author Kurnia Novita Mutu */

public class Pca2dAlgorithm {

public static double[][] getMean(ArrayList<double[][]> listOfArrayData) {

int size = listOfArrayData.size();

double[][] result = Matrix2D.copy(listOfArrayData.get(0));

for(int i=1; i<size; i++) {

Matrix2D.add(result, listOfArrayData.get(i), result); }

Matrix2D.scale(result, 1D/size, result);

return result; }

public static Pca2dResult trainingData() {

File rootOfFaceRecognitionDatabase = new File(MyProperties.PARENT_FILE_PATH);

File[] listOfDatabaseFolder = rootOfFaceRecognitionDatabase.listFiles(new FileFilter()

{

@Override

public boolean accept(File pathname) {

return pathname.isDirectory(); }

});

LinkedHashMap<String, double[][]> mapOfOriginalImageData = new LinkedHashMap<>();

for(File file : listOfDatabaseFolder) {

String name = file.getName();

File[] listOfImageFile = file.listFiles(new FilenameFilter() {

@Override

public boolean accept(File dir, String name) {

return name.toLowerCase().endsWith(".bmp"); }

});


(22)

A-12 for(File imageFile : listOfImageFile) {

String key =

name+"-"+imageFile.getName().toLowerCase().replace(".bmp", ""); double[][] imageData =

ImageReader.getData(imageFile.getAbsolutePath()); mapOfOriginalImageData.put(key, imageData); }

}

Pca2dResult pca2dResult = calculatedPca2d(mapOfOriginalImageData); return pca2dResult;

}

public static Pca2dResult calculatedPca2d(LinkedHashMap<String,double[][]> mapOfOriginalImageData)

{

//Calculate the mean of image matrix. ArrayList<double[][]> listOfData = new ArrayList<>(mapOfOriginalImageData.values());

double[][] mean = Pca2dAlgorithm.getMean(listOfData);

//Normalize all image matrix.

HashMap<String,double[][]> mapOfNormalizedImageData = new HashMap<>();

for(Map.Entry<String,double[][]> entry : mapOfOriginalImageData.entrySet())

{

double[][] n = Matrix2D.copy(entry.getValue()); //n is normalized matrix Matrix2D.sub(n, mean, n);

mapOfNormalizedImageData.put(entry.getKey(), n); }

//Calculate the covariance matrix. double[][] c = null;

for(Map.Entry<String,double[][]> entry : mapOfNormalizedImageData.entrySet()) {

double[][] t = Matrix2D.transpose(entry.getValue());

double[][] multiplyResult = Matrix2D.multiply(t, entry.getValue());

if(c!=null) {

Matrix2D.add(c, multiplyResult, c); }

else {

c = multiplyResult; }


(23)

Matrix2D.scale(c, 1D/mapOfNormalizedImageData.size(), c);

//Calculate the EigenVector.

DenseMatrix64F dm = new DenseMatrix64F(c);

EigenDecomposition ed = DecompositionFactory.eig(100, true); //Matrix size = 100 is not used, but must use to create an instance of EigenDecomposition. I used 100 because the picture is 100x100.

ed.decompose(dm);

//Get eigen value & eigen vector

LinkedList<Double> listOfEigenValue = new LinkedList<>(); LinkedList<double[][]> listOfEigenVector = new LinkedList<>(); MyEigenSelector.selectEigenVector(ed, c, listOfEigenValue, listOfEigenVector);

LinkedList<MapOfFeatureVector> listOfMapOfFeatureVector = new LinkedList<>();

for(Map.Entry<String,double[][]> entry : mapOfOriginalImageData.entrySet())

{

MapOfFeatureVector mapOfOneImageFeatureVector = new MapOfFeatureVector();

for(int i=0; i<listOfEigenValue.size(); i++) {

double[][] featureVector = Matrix2D.multiply(entry.getValue(), listOfEigenVector.get(i));

mapOfOneImageFeatureVector.put(entry.getKey()+"-"+(i+1), featureVector);

}

listOfMapOfFeatureVector.add(mapOfOneImageFeatureVector); }

Pca2dResult pca2dResult = new Pca2dResult(); pca2dResult.setListOfEigenValue(listOfEigenValue); pca2dResult.setListOfEigenVector(listOfEigenVector);

pca2dResult.setListOfMapOfFeatureVector(listOfMapOfFeatureVector);

return pca2dResult; }

public static String recognized(Pca2dResult pca2dResult, double[][] testImage, Map<String,Double> mapOfResultInfo)

{

List<Double> listOfEigenValue = pca2dResult.getListOfEigenValue(); List<double[][]> listOfEigenVector = pca2dResult.getListOfEigenVector(); List<MapOfFeatureVector> listOfMapOfFeatureVector =

pca2dResult.getListOfMapOfFeatureVector();


(24)

A-14

List<double[][]> listOfFeatureVectorOfTestImage = new LinkedList<>();

for(int i=0; i<listOfEigenValue.size(); i++) {

double[][] featureVectorOfTestImage = Matrix2D.multiply(testImage, listOfEigenVector.get(i));

listOfFeatureVectorOfTestImage.add(featureVectorOfTestImage); }

double minRange = Double.POSITIVE_INFINITY; String result = "";

for(MapOfFeatureVector mapOfFeatureVector : listOfMapOfFeatureVector) {

int i = 0;

double range = 0; String key = "";

for(Map.Entry<String,double[][]> entry : mapOfFeatureVector.entrySet()) {

key = entry.getKey();

double[][] value = entry.getValue();

range += Matrix2D.square(listOfFeatureVectorOfTestImage.get(i), value);

i++; }

//range = Math.sqrt(range);

String[] temp = key.split("-"); String name = "";

for(int j=0; j<temp.length-1; j++) {

name += temp[j]; if(j!=temp.length-2) {

name += "-"; }

}

mapOfResultInfo.put(name, range);

if(range<minRange) {

result = key; minRange = range; }

}


(25)

return result; }

}

package com.fr.core; import java.io.Serializable; import java.util.LinkedList;

import javax.xml.bind.annotation.XmlRootElement; /**

*

* @author Kurnia Novita Mutu */

@XmlRootElement

public class Pca2dResult implements Serializable {

private LinkedList<Double> listOfEigenValue; private LinkedList<double[][]> listOfEigenVector;

private LinkedList<MapOfFeatureVector> listOfMapOfFeatureVector;

public Pca2dResult() {

}

public LinkedList<Double> getListOfEigenValue() {

return listOfEigenValue; }

public void setListOfEigenValue(LinkedList<Double> listOfEigenValue) {

this.listOfEigenValue = listOfEigenValue; }

public LinkedList<double[][]> getListOfEigenVector() {

return listOfEigenVector; }

public void setListOfEigenVector(LinkedList<double[][]> listOfEigenVector) {

this.listOfEigenVector = listOfEigenVector; }

public LinkedList<MapOfFeatureVector> getListOfMapOfFeatureVector() {

return listOfMapOfFeatureVector; }

public void setListOfMapOfFeatureVector(LinkedList<MapOfFeatureVector> listOfMapOfFeatureVector)


(26)

A-16 {

this.listOfMapOfFeatureVector = listOfMapOfFeatureVector; }

}

package com.fr.core; /**

*

* @author Kurnia Novita Mutu */

public class Preference {

private static Preference instance;

private int numberOfSelectedEigenVector = 10; private Preference()

{ }

public int getNumberOfSelectedEigenVector() {

return numberOfSelectedEigenVector; }

public void setNumberOfSelectedEigenVector(int numberOfSelectedEigenVector)

{

this.numberOfSelectedEigenVector = numberOfSelectedEigenVector; }

public static Preference getInstance() {

if(instance==null) {

instance = new Preference(); }

return instance; }

}

package com.fr.file;

import com.fr.core.Pca2dResult; import com.fr.properties.MyProperties; import java.awt.image.BufferedImage; import java.io.BufferedReader;

import java.io.BufferedWriter; import java.io.File;

import java.io.FileNotFoundException; import java.io.FileOutputStream;


(27)

import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.imageio.ImageIO; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /**

*

* @author Kurnia Novita Mutu */

public class FileUtils {

public static void writePca2dResult(Pca2dResult pca2dResult, String path) {

try {

JAXBContext context = JAXBContext.newInstance(Pca2dResult.class); Marshaller marshaller = context.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

marshaller.marshal(pca2dResult, new BufferedWriter(new FileWriter(path)));

}

catch(JAXBException | IOException ex) {

ex.printStackTrace(System.out); }

}

public static Pca2dResult readPca2dResult(String path) {

Pca2dResult pca2dResult = null; try

{

JAXBContext context = JAXBContext.newInstance(Pca2dResult.class); Unmarshaller unmarshaller = context.createUnmarshaller();

pca2dResult = (Pca2dResult) unmarshaller.unmarshal(new BufferedReader(new FileReader(path)));

}

catch(JAXBException | IOException ex) {

ex.printStackTrace(System.out); }


(28)

A-18 return pca2dResult;

}

public static boolean addSampleImage(String name, BufferedImage image) {

boolean result = false; try

{

String parentPath = MyProperties.PARENT_FILE_PATH; File file = null;

for(int i = 1; i<1000; i++) {

file = new File(parentPath+"\\"+name+"\\"+i+".bmp"); if(!file.exists())

{

break; }

}

file.getParentFile().mkdirs();

result = ImageIO.write(image, "BMP", file); }

catch(Exception ex) {

ex.printStackTrace(System.out); }

return result; }

public static void writeLog(StringBuilder log, boolean append) {

try {

File file = new File(MyProperties.PCA_2D_LOG);

FileOutputStream fos = new FileOutputStream(file, append); PrintWriter pw = new PrintWriter(fos);

pw.append(log); pw.close(); fos.close(); }

catch(FileNotFoundException ex) {

}

catch(IOException ex) {


(29)

} }

package com.fr.file; import java.io.File;

import java.io.Serializable;

import javax.swing.filechooser.FileFilter; /**

*

* @author Kurnia Novita Mutu */

public class MyFileFilter extends FileFilter implements Serializable {

private String filter; private String name;

public MyFileFilter(String filter, String name) {

this.filter = filter.toLowerCase(); this.name = name;

}

@Override

public boolean accept(File f) {

if(f.isDirectory()) {

return true; }

String fileName = f.getName().toLowerCase(); return fileName.endsWith(filter);

}

@Override

public String getDescription() {

return name; }

}

package com.fr.image.util;

import java.awt.image.BufferedImage; import java.awt.image.WritableRaster; import java.io.File;

import java.io.IOException; import javax.imageio.ImageIO; /**


(30)

A-20 }

public void refreshImageViewer(opencv_core.IplImage img) {

BufferedImage faceBufferedImage = FaceDetector.detectFace(img); imageViewer1.setBufferedImage(img.getBufferedImage());

if(faceBufferedImage!=null) {

Image scaleFaceImage =

faceBufferedImage.getScaledInstance(MyProperties.FACE_IMAGE_WIDTH, MyProperties.FACE_IMAGE_HEIGHT, BufferedImage.SCALE_SMOOTH); BufferedImage scaleFaceBufferedImage = new

BufferedImage(MyProperties.FACE_IMAGE_WIDTH,

MyProperties.FACE_IMAGE_HEIGHT, BufferedImage.TYPE_BYTE_GRAY); scaleFaceBufferedImage.getGraphics().drawImage(scaleFaceImage, 0, 0, null);

imageViewer2.setBufferedImage(scaleFaceBufferedImage); } // Proses Rescale dan Grayscale

} /**

* @param args the command line arguments */

public static void main(String args[]) {

/*

* Create and display the form */

java.awt.EventQueue.invokeLater(new Runnable() {

@Override public void run() {

new MainFrame().setVisible(true); }

}); }

// Variables declaration - do not modify private javax.swing.JButton addBtn;

private javax.swing.JButton browseSourceImageBtn; private com.fr.image.viewer.ImageViewer imageViewer1; private com.fr.image.viewer.ImageViewer imageViewer2; private javax.swing.JMenu jMenu1;

private javax.swing.JMenu jMenu2;

private javax.swing.JMenuBar jMenuBar1; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem2; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JPanel jPanel1;


(31)

private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4;

private javax.swing.JSplitPane jSplitPane1; private javax.swing.JButton recognizeBtn; // End of variables declaration }

package com.fr.main;

import java.awt.image.BufferedImage; import java.math.BigDecimal;

import java.math.RoundingMode; import java.util.ArrayList;

import java.util.LinkedHashMap; import java.util.Map;

import javax.swing.DefaultRowSorter; import javax.swing.ImageIcon;

import javax.swing.RowSorter; import javax.swing.SortOrder;

import javax.swing.table.DefaultTableModel; /**

*

* @author Kurnia Novita Mutu */

public class ResultDialog extends javax.swing.JDialog {

public ResultDialog(java.awt.Frame parent, boolean modal) {

super(parent, modal); initComponents();

tableResult.setAutoCreateRowSorter(true);

DefaultRowSorter sorter = ((DefaultRowSorter)tableResult.getRowSorter()); ArrayList list = new ArrayList();

list.add(new RowSorter.SortKey(1, SortOrder.ASCENDING)); sorter.setSortKeys(list);

sorter.sort();

setLocationRelativeTo(null); }

public void setResult(String name, LinkedHashMap<String,Double> mapOfResultInfo, BufferedImage bufferedImageResult)

{

if(bufferedImageResult!=null) {

imageFrame.setIcon(new

ImageIcon(bufferedImageResult.getScaledInstance(imageFrame.getWidth(), imageFrame.getHeight(), BufferedImage.SCALE_SMOOTH)));


(32)

A-22

lblResultName.setText(name);

DefaultTableModel dtm = (DefaultTableModel)tableResult.getModel();

for(Map.Entry<String,Double> entry : mapOfResultInfo.entrySet()) {

Object[] row = new Object[2]; row[0] = entry.getKey();

row[1] = BigDecimal.valueOf(entry.getValue()).setScale(2, RoundingMode.CEILING);

dtm.addRow(row); }

} /**

* This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor. */

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents()

{

lblResultName = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); tableResult = new javax.swing.JTable(); imageFrame = new javax.swing.JLabel();

setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOS E);

setTitle("Result Dialog");

lblResultName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lblResultName.setText("Result Name");

tableResult.setModel(new javax.swing.table.DefaultTableModel( new Object [][]

{ },

new String [] {

"Name", "Nearest Matrix Features" }

) {


(33)

{

java.lang.String.class, java.lang.Double.class };

boolean[] canEdit = new boolean [] {

false, false };

public Class getColumnClass(int columnIndex) {

return types [columnIndex]; }

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit [columnIndex]; }

});

jScrollPane1.setViewportView(tableResult);

imageFrame.setBorder(javax.swing.BorderFactory.createTitledBorder("")); javax.swing.GroupLayout layout = new

javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

layout.createSequentialGroup()

.addGap(0, 152, Short.MAX_VALUE) .addComponent(imageFrame,

javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(148, 148, 148))

.addGroup(layout.createSequentialGroup() .addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEA DING)

.addComponent(lblResultName, javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jScrollPane1,

javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup()


(34)

A-24 .addContainerGap()

.addComponent(imageFrame,

javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lblResultName)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1,

javax.swing.GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE) .addContainerGap())

); pack();

}// </editor-fold>

// Variables declaration - do not modify private javax.swing.JLabel imageFrame;

private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel lblResultName; private javax.swing.JTable tableResult; // End of variables declaration }

package com.fr.properties; /**

*

* @author Kurnia Novita Mutu */

public class MyProperties {

public static final String PARENT_FILE_PATH = "D:\\FR2"; public static final String PCA_2D_RESULT_PATH =

PARENT_FILE_PATH+"\\Pca2dResult.xml"; public static final String PCA_2D_LOG = PARENT_FILE_PATH+"\\Pca2dLog.csv";

public static final char PCA_2D_LOG_SEPARATOR = '\t';

public static final int FACE_IMAGE_WIDTH = 100; public static final int FACE_IMAGE_HEIGHT = 100; }


(35)

1 Universitas Kristen Maranatha

BAB I

PENDAHULUAN

1.1 Latar Belakang Masalah

Setiap manusia diciptakan dengan bentuk fisik dan rupa yang berbeda sehingga manusia tersebut dapat dibedakan satu dengan yang lainnya. Pada teknologi informasi keunikan bentuk fisik manusia ini dapat dijadikan sebagai masukan pada sebuah sistem identifikasi, otentifikasi ataupun sistem keamanan. Masukan tersebut layaknya sebuah PIN (personal identification number) atau

password. Contoh masukan sistem identifikasi, otentifikasi ataupun sistem

keamanan yang sering digunakan adalah sidik jari, suara, retina, iris mata dan wajah. Masukan-masukan sistem tersebut disebut biometrik.

Biometrik yang sekarang ini sering digunakan adalah biometrik wajah. Contohnya pada beberapa smartphone dapat dijumpai aplikasi face recognition

lock screen (pengenalan wajah untuk penguncian layar). Face recognition

(pengenalan wajah) sendiri adalah proses pengenalan manusia berdasarkan pada pola wajah.

Pada tugas akhir ini penulis membuat aplikasi face recognition untuk mengidentifikasi manusia berdasarkan pola wajahnya. Telah banyak metode-metode face recognition yang dikembangkan. Salah satu metode-metode yang terkenal adalah metode Principal Components Analysis (PCA) yang awalnya diusulkan oleh Sirovich dan Kirby dan kemudian dikembangkan oleh Turki dan Pentland. PCA merepresentasikan sebuah matriks citra sebagai vektor sehingga ukuran vektor bisa sangat besar. Sebagai contoh, citra wajah yang berukuran 195x231 memiliki ukuran vektor 195x231=45045. Ukuran vektor yang besar menjadi masalah saat implementasi PCA ketika menghitung eigenvector dari matriks kovarians kumpulan citra - citra pada sampel data. Untuk menghindari masalah tersebut, Yang dkk mengusulkan metode Two-Dimensional Principal Components


(36)

BAB I Pendahuluan

2 Universitas Kristen Maranatha Metode 2DPCA dikembangkan untuk representasi citra wajah yang didasarkan pada matriks citra 2D. Metode ini menggunakan teknik proyeksi langsung sehingga matriks citra sebelum tahap ekstraksi fitur tidak perlu ditransformasikan ke dalam sebuah bentuk vektor citra terlebih dulu, melainkan matriks kovarian citranya dapat dibentuk langsung dari matriks citra aslinya.

Berdasarkan uraian tersebut diatas penulis akan mencoba untuk membuat aplikasi face recognition menggunakan metode 2DPCA.

1.2 Rumusan Masalah

Rumusan masalah pada tugas akhir ini adalah sebagai berikut,

1. Bagaimana proses face recognition menggunakan algoritma metode 2DPCA.

2. Bagaimana kinerja dari face recognition menggunakan metode 2DPCA.

3. Bagaimana merancang perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java.

1.3 Tujuan

Tujuan yang ingin dicapai pada tugas akhir ini adalah sebagai berikut, 1. Memahami proses face recognition menggunakan metode 2DPCA. 2. Menganalisa kinerja dari face recognition menggunakan metode

2DPCA.

3. Merancang perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java.


(37)

BAB I Pendahuluan

3 1.4 Pembatasan Masalah

Dalam pembuatan tugas akhir ini diperlukan adanya batasan-batasan agar tidak menyimpang dari yang telah direncanakan sehingga tujuan yang sebenarnya dapat tercapai. Adapun batasan-batasan tersebut adalah

1. Citra wajah yang akan diolah diambil dengan menggunakan webcam. 2. Ukuran citra yang digunakan adalah 100 x 100 piksel.

3. Hanya 1 (satu) objek wajah pada 1 (satu) citra. 4. Citra wajah diambil dari 10 individu yang berbeda

5. Jumlah citra wajah yang akan diolah sebagai citra acuan maupun citra uji masing – masing 5 (lima) buah.

6. Perancangan aplikasi menggunakan library computer vision OpenCV. 7. Kondisi cahaya dianggap normal untuk setiap citra

8. Perancangan aplikasi menggunakan bahasa pemograman Java.

1.5 Metodologi Penelitian

Dalam penyelesaian tugas akhir ini dibutuhkan metode penelitian, antara lain

1. Studi Literatur

Pada tahap ini dilakukan pengumpulan informasi – informasi dan referensi yang terkait dengan metode dan perangkat lunak yang akan digunakan pada tugas akhir ini. Informasi-informasi tersebut dapat diperoleh dari paper, buku, artikel dan lain lain yang berkaitan dengan pengenalan wajah, Two-Dimensional Principal Components Analysis,

library computer vision OpenCV dan bahasa pemograman Java.

2. Perancanngan Perangkat Lunak

Pada tahap ini dilakukan perancangan perangkat lunak berdasarkan informasi-informasi dan algoritma 2DPCA yang telah dipelajari pada tahap studi literatur.


(38)

BAB I Pendahuluan

4 Universitas Kristen Maranatha 3. Pengumpulan Data

Dilakukan pengumpulan data berupa gambar citra yang diambil menggunakan webcam dari 10 individu yang berbeda dengan 10 gambar citra yang bervariasi per masing – masing individu.

4. Pengujian Sistem Perangkat Lunak

Realisasi sistem perangkat lunak yang telah didesain akan diuji kinerjanya menggunakan data pengamatan yang telah dikumpulkan sebelumnya.

1.6 Sistematika Penulisan

Untuk memberikan gambaran yang jelas mengenai penulisan tugas akhir ini, maka ditentukan sistematika penulisan sebagai berikut

BAB I PENDAHULUAN

Bab ini membahas latar belakang penulisan tugas akhir, perumusan masalah, tujuan, pembatasan masalah serta metodologi penelitian.

BAB II LANDASAN TEORI

Bab ini membahas dasar-dasar teori yang berkaitan dengan topik dan perangkat lunak yang dibutuhkan pada penulisan tugas akhir ini.

BAB III PERANCANGAN DAN REALISASI PERANGKAT LUNAK

Bab ini membahas perancangan dan realisasi perangkat lunak yang akan digunakan dalam penulisan tugas akhir ini.


(39)

BAB I Pendahuluan

5 BAB IV PENGUJIAN DAN ANALISIS DATA

Bab ini berisi hasil data pengamatan saat pengujian dan analisa data pengamatan yang diperoleh pada tahap pengujian.

BAB V KESIMPULAN DAN SARAN

Bab ini berisi kesimpulan dari pengujian yang dilakukan dan saran pengembangan untuk perkembangan aplikasi di kemudian hari.


(40)

57 Universitas Kristen Maranatha

BAB V

KESIMPULAN DAN SARAN

Bab ini berisi kesimpulan dari hasil uji coba yang telah dilakukan serta saran untuk pengembangan aplikasi selanjutnya.

5.1 Kesimpulan

Berikut penulis akan memaparkan beberapa kesimpulan dari hasil uji coba yang telah dilakukan.

1. Perancangan perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java telah berhasil direalisasikan

2. Pengenalan wajah menghasilkan tingkat persentase keberhasilan berkisar pada 94 % sampai 96% untuk jumlah eigenvector 1-10.

3. Persentase keberhasilan dipengaruhi oleh jumlah eigenvector yang digunakan pada tahap pengenalan.

4. Faktor pose dan ekspresi pada citra wajah mempengaruhi nilai feature

vector untuk pengenalan pada aplikasi face recognition.

5.2Saran

Berikut merupakan saran untuk pengembangan aplikasi face recognition menggunakan metode 2DPCA lebih lanjut.

1. Untuk mendapatkan tingkat keberhasilan pengenalan yang lebih tinggi bisa dicoba penambahan sample data dan sample data yang lebih variatif 2. Untuk pengembangan lebih lanjut disarankan untuk menggunakan pose

dan ekspresi yang sama untuk setiap citra sehingga pengaruh pose dan ekspresi dapat ditiadakan.


(41)

58

DAFTAR PUSTAKA

[1].J. Yang, J.Y. Yang, “From Image Vector to Matrix: A Straightforward Image Projection Technique—IMPCA vs. PCA” Pattern Recognition, vol. 35, no. 9, pp. 1997-1999, 2002

[2].Yang, J., Zhang, D., Frangi, A.F., Yang, J.Y., (2004), “Two-Dimensional PCA : A New Approach to Appearance-Based Face Representation and Recognition”,

IEEE Trans. Pattern Anal. Amch. Intell. Vol.26, No.1, hal. 131-137.

[3].Liwei Wang, Xiao Wang, Xuerong Zhang, Jufu Feng. “The Equivalence of Two-Dimensional PCA to Line-Based PCA”. Peking, China : Center for Information Sciences, Peking University.

[4].Darma Putra. (2010). Pengolahan Citra Digital. Yogyakarta : Andi Offset [5].http://id.wikipedia.org/wiki/KNN

[6].http://maseadi.wordpress.com/2013/01/08/perbedaan-vektor-dan-bitmap/ [7].http://id.wikipedia.org/wiki/Java

[8]. http://gofat.wordpress.com/2012/04/12/face-detection-dengan-metoda-haar-cascade/


(1)

Metode 2DPCA dikembangkan untuk representasi citra wajah yang didasarkan pada matriks citra 2D. Metode ini menggunakan teknik proyeksi langsung sehingga matriks citra sebelum tahap ekstraksi fitur tidak perlu ditransformasikan ke dalam sebuah bentuk vektor citra terlebih dulu, melainkan matriks kovarian citranya dapat dibentuk langsung dari matriks citra aslinya.

Berdasarkan uraian tersebut diatas penulis akan mencoba untuk membuat aplikasi face recognition menggunakan metode 2DPCA.

1.2 Rumusan Masalah

Rumusan masalah pada tugas akhir ini adalah sebagai berikut,

1. Bagaimana proses face recognition menggunakan algoritma metode 2DPCA.

2. Bagaimana kinerja dari face recognition menggunakan metode 2DPCA.

3. Bagaimana merancang perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java.

1.3 Tujuan

Tujuan yang ingin dicapai pada tugas akhir ini adalah sebagai berikut, 1. Memahami proses face recognition menggunakan metode 2DPCA. 2. Menganalisa kinerja dari face recognition menggunakan metode

2DPCA.

3. Merancang perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java.


(2)

BAB I Pendahuluan

3

Universitas Kristen Maranatha 1.4 Pembatasan Masalah

Dalam pembuatan tugas akhir ini diperlukan adanya batasan-batasan agar tidak menyimpang dari yang telah direncanakan sehingga tujuan yang sebenarnya dapat tercapai. Adapun batasan-batasan tersebut adalah

1. Citra wajah yang akan diolah diambil dengan menggunakan webcam. 2. Ukuran citra yang digunakan adalah 100 x 100 piksel.

3. Hanya 1 (satu) objek wajah pada 1 (satu) citra. 4. Citra wajah diambil dari 10 individu yang berbeda

5. Jumlah citra wajah yang akan diolah sebagai citra acuan maupun citra uji masing – masing 5 (lima) buah.

6. Perancangan aplikasi menggunakan library computer vision OpenCV. 7. Kondisi cahaya dianggap normal untuk setiap citra

8. Perancangan aplikasi menggunakan bahasa pemograman Java.

1.5 Metodologi Penelitian

Dalam penyelesaian tugas akhir ini dibutuhkan metode penelitian, antara lain

1. Studi Literatur

Pada tahap ini dilakukan pengumpulan informasi – informasi dan referensi yang terkait dengan metode dan perangkat lunak yang akan digunakan pada tugas akhir ini. Informasi-informasi tersebut dapat diperoleh dari paper, buku, artikel dan lain lain yang berkaitan dengan pengenalan wajah, Two-Dimensional Principal Components Analysis,

library computer vision OpenCV dan bahasa pemograman Java.

2. Perancanngan Perangkat Lunak

Pada tahap ini dilakukan perancangan perangkat lunak berdasarkan informasi-informasi dan algoritma 2DPCA yang telah dipelajari pada tahap studi literatur.


(3)

3. Pengumpulan Data

Dilakukan pengumpulan data berupa gambar citra yang diambil menggunakan webcam dari 10 individu yang berbeda dengan 10 gambar citra yang bervariasi per masing – masing individu.

4. Pengujian Sistem Perangkat Lunak

Realisasi sistem perangkat lunak yang telah didesain akan diuji kinerjanya menggunakan data pengamatan yang telah dikumpulkan sebelumnya.

1.6 Sistematika Penulisan

Untuk memberikan gambaran yang jelas mengenai penulisan tugas akhir ini, maka ditentukan sistematika penulisan sebagai berikut

BAB I PENDAHULUAN

Bab ini membahas latar belakang penulisan tugas akhir, perumusan masalah, tujuan, pembatasan masalah serta metodologi penelitian.

BAB II LANDASAN TEORI

Bab ini membahas dasar-dasar teori yang berkaitan dengan topik dan perangkat lunak yang dibutuhkan pada penulisan tugas akhir ini.

BAB III PERANCANGAN DAN REALISASI PERANGKAT LUNAK

Bab ini membahas perancangan dan realisasi perangkat lunak yang akan digunakan dalam penulisan tugas akhir ini.


(4)

BAB I Pendahuluan

5

Universitas Kristen Maranatha BAB IV PENGUJIAN DAN ANALISIS DATA

Bab ini berisi hasil data pengamatan saat pengujian dan analisa data pengamatan yang diperoleh pada tahap pengujian.

BAB V KESIMPULAN DAN SARAN

Bab ini berisi kesimpulan dari pengujian yang dilakukan dan saran pengembangan untuk perkembangan aplikasi di kemudian hari.


(5)

BAB V

KESIMPULAN DAN SARAN

Bab ini berisi kesimpulan dari hasil uji coba yang telah dilakukan serta saran untuk pengembangan aplikasi selanjutnya.

5.1 Kesimpulan

Berikut penulis akan memaparkan beberapa kesimpulan dari hasil uji coba yang telah dilakukan.

1. Perancangan perangkat lunak untuk aplikasi face recognition dengan metode 2DPCA menggunakan bahasa pemograman Java telah berhasil direalisasikan

2. Pengenalan wajah menghasilkan tingkat persentase keberhasilan berkisar pada 94 % sampai 96% untuk jumlah eigenvector 1-10.

3. Persentase keberhasilan dipengaruhi oleh jumlah eigenvector yang digunakan pada tahap pengenalan.

4. Faktor pose dan ekspresi pada citra wajah mempengaruhi nilai feature

vector untuk pengenalan pada aplikasi face recognition.

5.2Saran

Berikut merupakan saran untuk pengembangan aplikasi face recognition menggunakan metode 2DPCA lebih lanjut.

1. Untuk mendapatkan tingkat keberhasilan pengenalan yang lebih tinggi bisa dicoba penambahan sample data dan sample data yang lebih variatif 2. Untuk pengembangan lebih lanjut disarankan untuk menggunakan pose

dan ekspresi yang sama untuk setiap citra sehingga pengaruh pose dan ekspresi dapat ditiadakan.


(6)

58

Universitas Kristen Maranatha

DAFTAR PUSTAKA

[1].J. Yang, J.Y. Yang, “From Image Vector to Matrix: A Straightforward Image

Projection Technique—IMPCA vs. PCA” Pattern Recognition, vol. 35, no. 9, pp. 1997-1999, 2002

[2].Yang, J., Zhang, D., Frangi, A.F., Yang, J.Y., (2004), “Two-Dimensional PCA :

A New Approach to Appearance-Based Face Representation and Recognition”,

IEEE Trans. Pattern Anal. Amch. Intell. Vol.26, No.1, hal. 131-137.

[3].Liwei Wang, Xiao Wang, Xuerong Zhang, Jufu Feng. “The Equivalence of Two-Dimensional PCA to Line-Based PCA”. Peking, China : Center for Information Sciences, Peking University.

[4].Darma Putra. (2010). Pengolahan Citra Digital. Yogyakarta : Andi Offset [5].http://id.wikipedia.org/wiki/KNN

[6].http://maseadi.wordpress.com/2013/01/08/perbedaan-vektor-dan-bitmap/ [7].http://id.wikipedia.org/wiki/Java

[8]. http://gofat.wordpress.com/2012/04/12/face-detection-dengan-metoda-haar-cascade/