티스토리 뷰

안녕하세요. 이번에는 제가 고등학교 생기부를 만들고, 특기자 전형을 준비하면서 직접 작성한 보고서입니다. 해당 내용을 참고하시든 사용하시든 상관없으니 자유롭게 사용해 주세요. 보고서 내용만 첨부하겠습니다.

 

개발 동기

'Find similar celebrities.py’ 프로그램은 사용자가 입력한 얼굴 이미지와 가장 닮은 연예인을 찾아주는 프로그램입니다. SNS에서 퍼지고 있는 ’닮은 연예인 찾기 필터‘에 관심이 생겨 탐구하였습니다. 이 과정에서 해당 필터는 인공지능 기술을 사용하지 않고, 인간의 심리적 특성인 ’성급한 일반화의 오류‘를 이용한 것이라는 점을 알게 되었습니다. 그래서 저는 이를 좀 더 정확하고 근거 있는 결과를 도출해내고 싶어 CNN을 학습하고 이를 적용해 직접 구현해 봤습니다.

 

개발 과정

데이터 수집

데이터 학습을 시키기 위해 가장 먼저 해야 할 작업은 데이터 수집입니다. 연예인의 얼굴을 수집하기 위해 처음에는 구글의 검색엔진을 이용했습니다. 하지만 구글의 검색엔진은 검색한 내용 외의 사진이 많이 나와서 원하는 연예인 사진만 수집하기는 쉽지 않았습니다. 이에 저는 정확도가 높은 네이버 검색엔진을 이용했고, selenium을 이용해 이미지 다운을 위한 웹 크롤링을 성공적으로 할 수 있었습니다. 서로 다른 연예인 이름의 폴더를 20개 만든 후 해당 연예인의 폴더에 각각 250장씩 다운로드가 되도록 했습니다. 인터넷을 통해 수집한 데이터는 얼굴이 살짝 돌아가기만 하더라도 다른 사람으로 취급하기 때문에 다시 한번 분류작업을 거치고자 했습니다. Opencv의 face_cascade를 이용하여 모든 이미지에 얼굴을 인식 후 얼굴 영역만 자른 후 얼굴만 남은 이미지는 수작업을 통해 불필요한 이미지를 제거하였고 총 한 연예인당 200장의 얼굴 자료를 수집했습니다. 하지만 200장은 터무니없는 터무니없이 부족한 양이라고 생각했기에 이미지를 좌우 반전, 이미지 기울이기, 밝기 조절, 노이즈 생성을 함으로써 연예인별로 약 1000장의 데이터를 만들 수 있었습니다.

 

데이터 학습

수집한 1000장의 이미지를 128x128의 이미지로 전처리합니다. ImageDataGenerator을 이용하여 target_size는 이미지의 크기만큼 (128, 128)로 설정했고, 배치 사이즈는 100으로 함으로써 10번의 배치를 수행하면 하나의 epoch가 수행되도록 했습니다. class_mode는 다중 클래스 분류이기 때문에 categorical로 지정했습니다.

 

 

 

CNN 모델 구성

이미지를 전처리하는 과정에서 모든 이미지를 128x128 사이즈로 설정했기 때문에 1st Convolution Layer에서는 input_shape의 값은 (128, 128, 3) (채널 3개), 필터의 크기는 3x3 크기의 32개로 설정했습니다. 이후 2nd Convolution Layer 안에서 3x3 크기의 64개 필터를 더 추가하고, 풀 사이즈가 2x2인 MaxPooling Layer은 추가합니다. 풀 사이즈가 2x2이므로 stride가 2일만큼 124x124 이미지에서 최댓값 데이터를 뽑아오므로 output은 62x62 크기로 출력되고, 채널의 두께에는 영향이 없으므로 그대로 64개가 출력됩니다. 다음으로는 overfitting(과적합)을 방지하기 위한 작업 dropout 작업을 거칩니다. 이 작업이 완료되면 지금까지 추출한 특징들을 신경망의 각 층에 전달하고자 Flatten Layer를 거칩니다. 마지막으로 모델의 프레임을 설정함으로써 모델을 완성했습니다. 모델을 학습하고자 손실함수를 categorical_crossentropy로 설정하고 경사하강법 알고리즘 중 하나인 adam, 그리고 분류 문제에서 일반적으로 사용되는 accuracy로 설정했고, fit_generator를 이용해 모델을 학습시켰습니다. 학습 후 모델을 평가해 보니 약 96%를 얻을 수 있었습니다.

 

모델 사용하기

마지막으로 학습한 모델을 바탕으로 사용자가 지정한 이미지를 이용해 가장 닮은 연예인을 구하는 작업입니다. 사용자가 지정한 이미지를 가져와서 ①-데이터수집에서 사용한 얼굴 인식방법을 똑같이 적용하여 얼굴을 가져옵니다. 인식된 얼굴을 데이터에 있는 이미지와 똑같은 방식으로 전처리 작업을 거칩니다. 그 후 predict를 이용하여 어느 얼굴과 가장 유사한지 결과를 출력합니다.

 

개발을 마치고…

이번 활동에서 저는 CNN에 대한 전반적인 이해를 할 수 있었고 이미지 데이터에 대한 전처리 등을 공부하게 된 계기가 되었습니다. 모델의 예측결과는 생각보다 높게 나왔지만 실제로 프로그램을 돌리면 이게 맞는지 싶을 정도로 가끔 엉뚱한 결과가 나오곤 했습니다. 데이터과학과 머신러닝 수업 시간에는 CNN뿐만 아니라 DNN, ANN 등의 딥러닝 분야에 대해서도 학습했습니다. 개인적으로 CNN이 이미지를 이용하여 시각적인 변화를 볼 수 있다는 점에서 가장 마음에 들었고, 이를 계기로 앞으로 딥러닝에 대한 더욱 깊은 공부를 해보고 싶은 생각을 가졌습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함