Deep Learning - 얼굴형 분류 모델: Data Set 구축

sjongyuuu·2021년 7월 28일
1

DeepLearning

목록 보기
2/2
post-thumbnail

지난 모델 정의 포스팅에 이어 이번 포스팅에서는 데이터셋을 구축하는 과정을 다루어 보려고 한다.

💡 Data Set 구축하기

모델 정의가 끝났으니 이제 데이터셋을 구축해보자.

앞서 지도학습의 방법을 선택했으니 각 데이터에 대한 정답(Label)을 알려주는 작업이 필요하다.

이를 데이터 라벨링(Data Labeling)이라 하는데 정말 정말 고된 작업이다...😭
왜냐하면, 데이터마다 알맞은 라벨을 직접 붙여줘야 하기 때문이다.
또, 데이터 수가 많으면 많을수록 더욱 더 힘들어진다.

프로젝트 진행 당시, 나와 팀원들은 앞서 참고한 여러 검색 자료와 논문을 바탕으로 확보한 얼굴 데이터셋을 직접 분류하기 시작했다.

얼굴 사진 데이터 출처

✋ 본 데이터는 오직 학습용으로만 사용합니다.
Kaggle - https://www.kaggle.com/niten19/face-shape-dataset
Github - https://github.com/NVlabs/ffhq-dataset

계란형은 계란형대로, 둥근형은 둥근형대로 분류하고 중간중간 얼굴형을 구분하기 어려운 사진들(ex: 머리카락으로 얼굴이 가려진 경우)을 제외하는 방식으로 진행하였다.
사진이 몇 만장이 넘어갔지만, 팀원들과 나눠서 진행하니 생각보다? 할 만 했다.

분류를 마치고 얼굴형 별로 각각 약 400장씩 확보하여 총 1600장 정도 확보하였다.

이제 확보한 데이터들에 대한 마지막 분류가 필요하다.
이미 분류 다 끝난거 아닌가?❌ 생각하겠지만,
데이터셋을 학습용으로 사용하는지 혹은 성능 평가용으로 사용하는지에 대한 분류가 필요하다.

학습용 데이터셋(Training Set)은 말 그대로 모델 학습에 사용되는 데이터이다.
이는 답을 보면서 시험 공부를 한다는 의미로 생각하면 된다.

다음으로 Test Set으로 성능 평가를 진행하기 전에
검증 데이터셋(Validation Set)으로 평가를 진행한다.
학습을 시키지 않는다는 점에서 Test Set과 같다고 볼 수 있지만, 학습을 진행하면서 동시에 성능 평가를 진행하므로 학습에 관여는 한다는 점에서 다르다고 볼 수 있다.
즉, 이건 최종 평가가 아님을 명심해야 한다!
이는 공부한 것에 대해 모의고사를 치른다고 생각하면 된다.

마지막으로, 성능 평가용 데이터셋(Test Set)을 통해 모델의 최종 성능을 평가하면 된다.
이는 수능을 보는 것을 생각하면 된다.

나는 약 1600장의 사진 중에서 약 1200장은 Training Set으로 하고 약 400장은 Validation Set으로 하였다.

앞서 설명한 바와 같이 Test Set을 추가하여 총 3개의 데이터셋으로 학습을 진행하고 모델의 성능을 측정하지만, 나는 Validation Set을 통한 성능 향상에 초점을 두어 개발을 진행하였다.

✍ Validation Set을 통해 성능을 잡고(ex: Overfitting 해결) 평가하더라도 Test Set으로 성능 평가를 진행했을 때와 거의 같은 결과를 얻을 수 있다. 하지만, Test Set으로 성능 평가를 진행했을 때보다 신뢰도는 떨어질 수 있다.
모의고사 잘 본다해서 수능 잘보는 건 아니니까...😅

이제 끝난 것 같지만, 아직 할게 남아있다.

먼저, 확보한 사진 1600장에 대한 전처리(Preprocessing) 과정이 필요하다.

이를

👉 Data Preprocessing(데이터 전처리)

라 하는데 이 과정은 모델 성능에 가장 중요한 영향을 끼치는 부분이라 할 수 있다.
또한, 개발 목적에 맞게 전처리를 진행해야 한다는 점에서 신중한 작업이 필요하다.

앞서, 확보한 이미지들은 다음과 같은 형태로 촬영되어 있다.

[출처 - https://www.kaggle.com/niten19/face-shape-dataset ]

우리의 개발 목적은 "정확한 얼굴형 판단"으로 데이터마다 얼굴형의 특징을 최대한 강조할 수 있는 형태를 띄는 것이 가장 좋다.
하지만, 위 이미지의 경우 얼굴형 이외에도 목, 어깨, 뒷 배경 등 다른 특징들이 부각되어 성능에 영향을 줄 수 있는 부분들이 많다.

따라서, 다음과 같은 형태로 변형이 필요하다.

직관적으로 그림만 보더라도 전보다 얼굴형을 판단하기 더 쉬워진 것 같지 않나?

위와 같이, 이미지를 전처리하는데 사용할 수 있는 기술들은 여러 가지 존재한다.
개발 당시, 우리 팀이 사용한 기술은 OpenCVHaar Cascade Detection 라이브러리를 사용하였다.

당시 내가 이것을 사용하여 전처리를 진행한 것이 아니라 정확히는 모르지만, 대충 알기로 인물 사진을 입력으로 했을 때 그 인물의 얼굴에 해당하는 부분만 Crop(캡처)하여 출력하는 기능을 가진 것으로 알고 있다.

이와 같이 데이터를 전처리하여 확보한 데이터는 정확하고 신뢰할 수 있는 양질의 데이터라 할 수 있다.

🥱 이제 진짜! 마지막으로 해야할 작업이 하나 남아있다.

아까, 학습을 위해 사용하는 데이터의 수가 1200개라 했는데 이걸로 좋은 성능을 내기엔 부족하다.
즉, 데이터를 더 많이 확보하여 학습한다면 더 높은 성능을 낼 수 있기 때문이다.
쉽게 말해, 문제를 많이 풀수록(학습 데이터 수가 많을수록) 높은 성적(높은 성능)을 받을 수 있다는 것과 같은 말이다.

그러나, 데이터의 수를 더 확보하기 위해 또 다시 자료 검색을 하고 라벨링을 하고 전처리를 한다면 절망스러울 것이다.😨

이 절망스러움을 해결해주는 방법이 하나있는데 그게 바로

👉 Data Augmentation(데이터 증강)

이다.

Data Augmentation은 기존에 확보한 양질의 이미지 데이터에 대하여 좌우 반전, 이동, 명암 조절 등 여러 가지 효과를 적용하여 신뢰할 수 있는 데이터의 수를 더 많이 확보할 수 있다는 점에서 모델의 성능을 높여주는데 아주 좋은 방법 중에 하나이다.

Data Augmentation을 적용하기 좋은 API로 Keras의 ImageDataGenerator가 있다.

이제 ImageDataGenerator를 통해 어떻게 Data Augmentation을 진행하는지 보자.

전처리를 끝낸 이미지에 대해서 얼굴형 판단에 지장을 주지 않을 만한 효과들을 추려냈고 그 효과들은 다음과 같다.

rotation_range: 이미지 회전
width_shift_range: 이미지 좌우 이동
height_shift_range: 이미지 상하 이동
brightness_range: 이미지 밝기 조절
horizontal_flip: 이미지 좌우반전
🌟rescale: 이미지 크기 재조절(recalse = 1./255)

위 효과들 중에서 rescale 효과는 이미지 전처리에 있어서 가장 중요한 과정이라 할 수 있다.

✍ 이미지 구조

그 이유를 "이해하기 위해선" 먼저 이미지 구조에 대해 알아야 한다.

간단하게 설명하면,

이미지는 수많은 Pixel(픽셀, 화소)들이 합쳐져 우리가 이해할 수 있는 이미지를 출력한다. 즉, 픽셀이란 이미지의 기본 단위라 할 수 있다.

여기서, 픽셀은 또 어떻게 구성되어 있는지 이해할 필요가 있다.
픽셀은 0 ~ 255 사이의 정수값으로 구성되어 있는데 이 값을 통해 픽셀은 특정 색상을 표현한다.
즉, 각각의 픽셀이 0 ~ 255 사이의 값을 각각 가지면서 여러 색상들이 결합되어 우리가 이해할 수 있는 이미지로 나타나게 되는 것이다.

🔎 마지막으로 이미지 구조에서 아주 중요한 개념이 하나 남아있다.

우리가 사는 세계에서 이미지는 회색조(or 흑백) 이미지와 컬러 이미지로 나뉘는데 이를 논리적?으로 이해하기 위해선 Channel에 대해 알아야 한다.

채널은 1 채널3 채널로 나뉜다.

1 채널은 우리가 아는 그레이스케일(회색조) 이미지를 의미한다. (흑백 이미지와는 다르다는 것을 명심하자!)
즉, 1 채널 이미지라는 것은 픽셀 하나가 1개의 채널로 구성되어 있고 그 1개의 채널 안에서 0 ~ 255사이의 값으로 구성되어 나타나는 이미지라 할 수 있다.
쉽게 말해, 0 ~ 255사이의 값이 검은색에서 흰색 사이의 색상을 나타낸다는 것을 알 수 있다.

3 채널 이미지는 컬러 이미지를 의미한다.
흔히, RGB라는 말을 들어 보았을 텐데 여기서 'R', 'G', 'B'가 각각 3 채널에서 하나의 채널을 담당?하고 있는 것이다.
즉, 컬러 이미지는 픽셀 하나가 3개의 채널로 구성되어 있고 각 채널마다 0 ~ 255사이의 값으로 구성되고 3개의 채널의 값이 결합되어 특정 색상을 나타내는 이미지라 할 수 있다.
쉽게 말해, 검은색에서 흰색 사이의 색상 3개가 결합되어 특정 색상을 나타낸다 할 수 있다.

다시 본론을 돌아가자.

즉, 이미지는 0 ~ 255사이의 값을 가진 픽셀들이 엄청 많이 구성되어 있다는 것을 알 수 있다.
이는, 다시 말해 이미지 하나의 크기(용량)가 매우 크다는 것으로 이해할 수 있다.

이미지의 크기가 크면 모델 학습 시 연산을 수행할 때 처리해야 하는 값이 매우 많아지고 그러다 보면 값이 매우 커지는 현상이 발생하기도 한다.
이럴 경우, 모델 학습이 전혀 이루어지 않는 상황이 발생한다.

따라서, 이러한 현상을 방지하기 위해 rescale 효과가 존재하는 것이다.
rescale = 1./255로 설정하면 이미지 내의 모든 픽셀값을 255로 나누어 0 ~ 1 사이의 값을 가지도록 변경하는 것이다.

모든 픽셀값이 0 ~ 1 사이의 값을 가진 상태로 연산을 진행한다면 픽셀이 아무리 많다하더라도 값이 매우 커지는 현상이 발생하지 않는다.

이것을

👉 이미지 정규화(Normalization)

이라 한다.

이제, 모델 학습을 위한 준비를 모두 마쳤다. 다음 포스팅부터는 모델에 대한 이야기를 해보도록 하자.😁

.

.

.

Deep Learning - 얼굴형 분류 모델: Data Set 구축 [끝]

  • 읽어 주셔서 정말 감사드립니다.
  • 오타나 잘못된 정보를 댓글로 남겨주시면 정말 감사하겠습니다.
profile
내 생각 저장소

0개의 댓글