수치해석

PCA를 이용한 eigenface - eigenface 만들기

나일리 2021. 12. 5. 16:58

 

데이터 전처리를 통해 얻은 이미지들을 (이미지개수, 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에 어떤 값이 곱해질지만 안다면 원본 사진과 비슷하게 복원할 수 있다