프로젝트 & 과제/2학년

[선형] PCA 얼굴 인식

qqlzzb 2022. 1. 14. 18:54

개요

프로그래밍 언어 : 매트랩

과제 수행 날짜 : 2019.06.08

과제 개요 : matlab으로 PCA를 통한 얼굴 인식 알고리즘 구현

 

코드 설명

1) 이미지 정규화

이미지 정규화를 위한 코드 정규화된 이미지를 출력한 모습

 

이미지를 불러온 후, 이미지들이 평균이 128, 표준편차가 128인 정규분포를 따르도록 만들어주는 과정이다. 이는 빛과 배경에 의한 인식 오류를 줄이기 위한 과정이다.

 

먼저 m에 temp의 평균을 구해서 저장하고, st에 temp의 표준편차를 구해서 저장한다. 그리고 temp-m을 해줌으로써 데이터의 평균이 0이 되도록 하고, 그것을 st로 나눠줌으로써 데이터의 표준편차가 1이 되도록 한다.

여기까지 하면 평균이 0이고 분산과 표준편차가 1인 표준정규분포를 따르게 되고, 여기에 0과 255의 중간값인 128을 곱하고 더함으로써 평균과 표준편차가 128인 정규분포를 따르도록 한다.

 

2) 공분산 행렬

 

공분산 행렬을 구하는 공식을 이용한다. eigenvector와 eigenvalue를 구하고 diagonal로 정리된 lamda를 내림차순으로 정렬한다. 

diagonal eigenvalue가 맨 위에 위치한다. lamda의 맨 윗줄에 구한 eigenvalue가 나온다.

index(i)에는 정렬한 eigenvalue 값이 저장된다. 이미지가 총 25개 이므로, i의 범위는 1~25이다.

 

3) 고유벡터와 고유벡터의 정규화

고유벡터 정규화를 위한 코드 고유벡터를 구한 얼굴을 출력한 모습

 

원래 사이즈가 커서 Intractable task인데 이를 쉽게 구하기 위해서 구하기 쉬운 L의 eigenvector를 구하고 A를 곱한다.

c에 관한 eigenvector들이 들어 있는 행렬 반복문으로 25개의 공분산 행렬의 eigenvetor들의 행렬을 구해 U에 저장한다.

이 때 U의 size는 10304*25이다. 그리고 저장한 U를 정규화한다.

 

4) 가중치 벡터 계산

 

가중치 벡터 행렬을 만든다. dot는 내적하는 함수로, A와 U_norm을 내적하면 weightOf의 값은 스칼라 값이 나온다.

얼굴 25개가 어떤 방향(어느 좌표점, 가중치)에 있는지에 대해 저장된다.

한 얼굴에 대해 나머지의 고유 얼굴에 대한 가중치의 방향(벡터)을 저장한다.

 

새로 입력된 이미지도 가중치 벡터를 계산하여 학습 가중치 벡터와 입력 가중치 벡터 간의 거리를 계산한다. 이 값이 작은 이미지가 가장 유사한 얼굴이다.

 

결과

1) 등록되어 있는 얼굴이 입력될 경우

입력 데이터와 학습 데이터의 인덱스가 같다면 같은 얼굴로 잘 인식했다는 의미이다.

 

2) 등록되지 않은 얼굴이 입력될 경우

데이터베이스에 존재하지 않는 사람의 이미지를 입력한 경우이다. 가중치 벡터 간의 거리가 전부 8000 이상이므로 등록되지 않은 얼굴이라고 판단한다.