[선형대수학] PCA Face Recognition Matlab code

2020. 7. 16. 01:18선형대수학

반응형

PCA란?

: Principal Component Analysis

PCA (주성분 분석)은 많은 데이터가 분포되어 있을 때 이들의 분포된 특성을 나타내는 주 성분을 찾기 위한 방법. 데이터 하나 하나에 대한 성분분석을 하는 것이 아님.

 

<그림 1>

위 <그림 1>과 같이 2차원 평면상에 많은 데이터가 타원형 으로 분포되어 있을 때, 2개의 벡터 ( e1과 e2 ) 로서 이 분포 특 성을 가장 단순하고도 효과적으로 표현. (어느 방향과 크기로 가장 길고, 가장 짧은 지를 나타내는 것) 그래서, 주성분 은 데이터들의 분산(variance) 이 가장 큰 방향을 나타내는 벡터 이다. (변동성이 심한 방향을 지시함) 주성분 e2는 분산이 가장 작은 방향을 나타내는 벡터로서 e1에 대해 수직이다.

 

 

 

 

 

<그림 2>

 

<그림 2>와 같이 3차원 데이터의 경우에는 PCA 기법을 이용하여 3개의 서로 수직인 주성분 벡터를 찾을 수 있다.

 

 

 

 

 

 

<그림 3>

<그림 3>에서 2차원 좌표평면에 M개의 데이터 (x11, x21), (x21, x22), (x31, x32), ..., (xM1,xM2) 가 예를 들어서 타원형으로 분포되어 있을 때 e1, e2의 방향과 크기를 알면 데이터 분포형태를 파악 가능

 

기존 Matrix X에서 평균을 빼고 난 후의 데이터 분포를 보니 원점을 중심으로 모이게 되는 것을 볼 수 있습니다.

 

 

 

PCA Calculation Process

Computing PCA using the covariance method

 

• Step 1 : Organize the data set

• Step 2 : Subtract the mean

• Step 3 : Find the covariance matrix

• Step 4 : Find the eigenvalues and eigenvectors of the covariance matrix

• Step 5 : Transform the data to a new coordinate system

• Step 6 : Deriving the new data set

 

 

총 6가지 단계를 거쳐야 합니다.

각 단계를 살펴보도록 합시다.

 

 

 

 

 

• Step 1 : Organize the data set

 

매트랩 코드 : 

x1 = [2.5 0.5 2.2 1.9 3.1 2.3 2.0 1.0 1.5 1.1]';
x2 = [2.4 0.7 2.9 2.2 3.0 2.7 1.6 1.1 1.6 0.9]';

 

<그림 4 : 데이터셋 정의> 

 

 

 

 

 

 

 

 

• Step 2 : Subtract the mean

 

매트랩 코드 : 

x1_p = x1 - mean(x1);
x2_p = x2 - mean(x2);

 

 

<그림 5 : 평균 빼기>

 

이 과정을 거침으로 데이터셋의 분포가 원점을 중심으로 모이게 됩니다.

 

 

 

figure(1);
plot(x1,x2,'b+');
hold on; 
plot([-1 4],[0 0],'k:');
plot([0 0],[-1 4],'k:');
title('Original data');
xlim([-1 4]); ylim([-1 4]);
axis square;


figure(2);
plot(x1_p,x2_p,'b+');
hold on; plot([-1.5 1.5],[0 0],'k:'); 
plot([0 0],[-1.5 1.5],'k:');
title('Data with the means subtracted'); 
axis square;

 

<그림 6 : 원점으로 분포되는 데이터>

한 눈에 보기에도 데이터가 원점을 중심으로 분포되는 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

• Step 3 : Find the covariance matrix

 

매트랩 코드 : 

X_p = [x1_p x2_p];
C = cov(X_p)

 

cov 라는 함수를 사용해서 공분산행렬을 찾아줍니다.

 

 

 

[10 X 2] 크기로 이루어진 데이터셋의 공분산 행렬은 [2 X 2] 크기를 갖습니다.

 

<그림 7 : 데이터셋의 공분산행렬>

 

 

 

 

 

• Step 4 : Find the eigenvalues and eigenvectors of the covariance matrix

 

매트랩 코드 : 

[E, D] = eig(C)

 

 

 

Eigenvalue 크기에 따라 eigenvector를 내림차순으로 정렬합니다.

temp = E(:,1);
E(:,1) = E(:,2);
E(:,2) = temp;
>> E

 

            the most significant eigenvector

The eigenvector with the highest eigenvalue is the principle component of the data set.

 

매트랩 코드 : 

figure(3);
plot(X_p(:,1),X_p(:,2),'b+'); 
hold on;
plot([-2 2],[0 0],'k:');
plot([0 0],[-2 2],'k:');
plot(X_p(:,1),E(2,1)/E(1,1)*X_p(:,1),'r:');
plot(X_p(:,1),E(2,2)/E(1,2)*X_p(:,1),'r:');
xlim([-2 2]); ylim([-2 2]);
axis square;

다음과 같은 그림이 그려지게 됩니다.

 

 

 

• Step 5 : Transform the data to a new coordinate system

데이터를 새로운 좌표계로 직교 선형 변환(orthogonal linear transformation) 하는 과정

쉽게 말해, 데이터를 회전시킨다고 보면 됩니다.

 

매트랩 코드 : 

Y_all = X_p * E; % two-eigenvectors
Figure(4);
Plot(Y_all(:,1),Y_all(:,2),'b+'); 
hold on;
plot([-2 2],[0 0],'k:'); 
plot([0 0],[-2 2],'k:');
xlim([-2 2]); ylim([-2 2]);
title('Data transformed with 2 eigenvectors'); 
axis square;

>>

 

 

 

위 과정은 매트랩의 pca함수로도 동일한 결과를 얻을 수 있습니다. 확인해보세요

매트랩 코드 : 

[E,Y_all_func,D] = pca([x1,x2]);

 

 

 

 

 

 

 

1개의 Eigenvector를 기반으로 새로운 좌표계로 직교 선형 변환 (1차원 데이터로 바뀜)

 

 

매트랩 코드 :

y_pca = X_p * e_max;
figure(5);
plot(y_pca,zeros(size(y_pca)),'b+'); 
hold on;
plot([-2 2],[0 0],'k:');
plot([0 0],[-2 2],'k:');
xlim([-2 2]); ylim([-2 2]);
axis square;

 

 

이처럼 1차원 데이터로 바뀌는 것을 확인할 수 있습니다.

 

 

 

• Step 6 : Deriving the new data set

1개의 eigenvector를 이용하여 데이터 변환 후 평균값을 더해 주어 original data 복원함.

 

 

매트랩 코드 : 

X_p_new = y_pca * e_max';
x1_mean = mean(x1)*ones(10,1);
x2_mean = mean(x2)*ones(10,1);
x_mean = [x1_mean x2_mean];
X_hat(:,1) = X_p_new(:,1) + x1_mean; 
X_hat(:,2) = X_p_new(:,2) + x2_mean;
figure(6);
plot(X_hat(:,1),X_hat(:,2),'b+');
hold on;
plot([-1 4],[0 0],'k:');
plot([0 0],[-1 4],'k:');
xlim([-1 4]); ylim([-1 4]);
axis square;
title('Original data restored using only a single eigenvector');

 

 

최종적으로 6가지 단계를 거치면 다시 복원된 데이터를 가질 수 있습니다.

 

 

 

 

 

 

 

 

그럼, PCA를 이용해 Face Recognition을 해봅시다.

 

1. PCA를 이용한 얼굴인식 알고리즘 개념

 

• PCA기법을 이용해 인식 대상의 얼굴 중 입력 얼굴이 누구의 얼굴인지를 인식 (ex. 보안시스템)

• 학습 단계와 인식 단계로 구분 인식 대상의 얼굴 이미지(학습 이미지, 여러 명)로부터 Database를 구축하는 학습 단계

 

입력 얼굴 이미지와 가장 비슷한 Database 내의 얼굴을 찾는 인식 단계

 

인식 단계

 

 

 

 

 

 

 

2. PCA 얼굴 인식

Ex) 가장 큰 2개의 Eigenvalue에 해당하는 Eigenvector 2개를 기반

 

– 이미지 불러오기

 

매트랩 코드 : 

%% 학습 이미지 불러오기
S = []; % 학습 이미지 저장 행렬
M = 25; % 학습 이미지의 개수
icol = 92;
irow = 112;
N = icol*irow; %학습 이미지의 차원(pixel 개수)
for i = 1:M
img = imread([‘database\training\' num2str(i,'%03g')
'.bmp']);
temp = reshape(img', N, 1); % 1차원 벡터로 만든다.
[N x 1]
temp = double(temp);
S = [S temp];
end 

여기서 M개의 grayscale 이미지는 uint8(unsigned integer 8-bit)이며 0, 1, …, 255의 값으로 명암을 표현

0~255 값으로 명암 표현

이미지를 얼굴인식 알고리즘에 적용하기 위하여 데이터타입 변환 112 x 92 pixels의 matrix를 10304 x 1 의 vector로 변환 (unfolding) Datatype을 uint8에서 double로 변환

 

 

 

– 이미지 정규화

학습이미지의 픽셀 값 분포를 일정하게 하기 위함.

학습 이미지가 평균(m)이 128, 표준편차(s)가 128인 정규분포를 따르도록 함으로써 빛과 배경에 의한 인식 오류를 줄임

 

매트랩 코드 :

%% 이미지 정규화
X = zeros(N, M);
for i = 1:M
temp = S(:,i);
m = mean(temp);
st = std(temp);
Z = (temp - m) / st; % Standard normal distribution
X(:,i) = Z * 128 + 128; % S = 128 + (128 * Z) -> N(128,128)
end
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형