본문 바로가기

수치해석

PCA를 이용한 eigenface - eigenface 만들기

 

데이터 전처리를 통해 얻은 이미지들을 (이미지개수, 32, 32) 형태의 numpy array로 만들어주었다

이미지가 3차원이기 때문에 SVD를 쉽게 이용하기 위해 2차원으로 바꾸어주었다 

(이미지개수, 1024)의 형태가 되었으므로 eigenface의 기저는 최대 1024개가 되었다

 

 

1
2
3
4
5
6
7
# subtract average value from original data
data_avg = np.average(data_orig,axis=0)
data = data_orig-data_avg
= data.reshape(data_size,32*32)
 
U,s,V=np.linalg.svd(A, full_matrices=False)
plt.plot(s[:100])
cs

 

 

해당 코드를 실행시켜보면 

 

 

s가 0~40사이에서 급격히 감소하는 모습을 확인할 수 있다

eigenface를 직접 확인해보고 싶어서 V 배열을 아래와 같이 사용해보았다

 

 

1
2
3
4
5
6
def getEigenFaces(r,U,s,V):
    plt.figure(figsize=(10,r/2))
    for i in range(0,r):
        plt.subplot(r/55, i+1)
        plt.imshow(V[i, :].reshape(3232), cmap = 'gray')
getEigenFaces(10,U,s,V)
cs

 

 

s가 큰 열개의 eigenface인데 사람의 얼굴이 실제로 보여서 신기했다

 

 

 

이제 이 eigenvector들을 가지고 사진의 차원을 낮춰서 나타낼 수 있다

원래 사진은 픽셀별로 값이 있어야했지만 eigenvector에 어떤 값이 곱해질지만 안다면 원본 사진과 비슷하게 복원할 수 있다

'수치해석' 카테고리의 다른 글

PCA를 이용한 eigenface - test data로 확인해보기  (0) 2021.12.05
PCA를 이용한 eigenface - 데이터 전처리  (0) 2021.12.05
System equations  (0) 2020.10.02
Finding roots  (0) 2020.10.02