Deep Learning

Deep Learning - 메이크업 노메이크업 구별하기 Part1

electronicprogrammer 2020. 10. 6. 06:40

데이터 출처 : www.kaggle.com/petersunga/make-up-vs-no-make-up

 

Makeup or No Makeup

Can you determine which person is wearing makeup?

www.kaggle.com

ipynb file : github.com/sangHa0411/DataScience/blob/main/Clasify_Makeup.ipynb

 

sangHa0411/DataScience

Contribute to sangHa0411/DataScience development by creating an account on GitHub.

github.com

 

이번 포스팅에서는 화장을 한 경우와 화장을 하지 않은 경우를 구별하는 CNN Deep Learning 모델을 만드는 것이 목표입니다.

 

하지만 이번 포스팅에서의 핵심은 적은 데이터를 데이터 증식을 이용해서 데이터 갯수를 늘리고 이를 이용해서 Deep Learning 학습을 하는 것입니다.

 

 

Part1 에서는 사진에서  필요한 부분인 얼굴 부분만을 검출하는 방법과 데이터를 증식하는 방법을 다루어 보겠습니다.

Part2 에서는 증식 된 데이터를 이용해서 CNN Model을 만들어보고 학습시켜보겠습니다.

Part3 에서는 사전에 훈련된 ImageNet을 이용해서 CNN Model을 만들어보고 Part2에서의 성능과 비교해보겠습니다.

 

 

먼저 데이터를 불러오고 갯수를 확인해봅니다.

전체 데이터 갯수가 총 1400개로 이를 그대로 Deep Learning에 학습시키기에는 갯수가 부족한 편임을 알 수가 있습니다.

 

다음은 이미지 데이터를 확인해보겠습니다.

위는 화장을 한 사진이고 아래는 화장을 하지 않은 사진입니다.

저는 전체 이미지보다는 얼굴 이미지 만을 사용하는 것이 Deep Learning 모델의 성능을 증가키실 수 있다라고 판단이 되어서 opencv에 있는 얼굴 검출 라이브러리 함수를 이용해서 각 이미지에서 얼굴을 검출하였습니다.

 

얼굴을 검출하기 위해서는 haarcascade_frontalface_default.xml 파일이 필요합니다.

opencv에는 CascadeClassifier함수가 있는데 이는 머신러닝 기법의 에이다부스트 알고리즘을 기반으로 한 함수입니다. 에이다부스트에 대해서는 나중에 정리해서 포스팅하도록 하겠습니다.

 

이 함수를 이용하게 위해서는 먼저 이미지를 흑백이미지 즉 grayscale로 변경해야 합니다. 그리고 grayscale 이미지를 넘겨주면 numpy array가 반환됩니다.

 

이를 이용해서 저희는 사진에서의 얼굴 위치를 파악가능합니다.

위에서 구한 numpy array를 이용해서 얼굴 이미지 사진을 구하는 방법은 아래와 같습니다.

따라서 저희는 얼굴 검출을 통해서 얻은 array의 원소가 

(왼쪽 위 X 좌표 , 왼쪽 위 Y좌표 , X 길이 , Y 길이) 로 구성된다는 것을 확인할 수 있습니다.

 

 

이제 위 함수를 이용해서 각 클래스 화장을 한 이미지 데이터, 화장을 하지 않은 이미지 데이터로부터 얼굴 사진만을 가져와서 리스트 자료구조에 저장합니다.

데이터 갯수가 기존에 비해서 많이 줄어든 것을 확인할 수 있으며 이는 모든 이미지에 대해서 얼굴 검출을 하지 못했다는 것을 의미합니다.

 

이제 저희는 Deep Learning을 하기에는 부족한 이 이미지들을 데이터 증식을 이용해서 데이터 갯수를 늘리고 Deep Learning을 학습시키고자 합니다.

 

먼저 test 용 얼굴 사진을 하나를 설정합니다.

그리고 keras의 ImageDataGenerator를 불러옵니다.

ImageDataGenerator에는 여러 설정해야 값들이 존재하는데 아래의 사이트에 가시면 어떻게 구체적으로 사용하는지 파악이 가능합니다.

keras.io/ko/preprocessing/image/

 

Image Preprocessing - Keras Documentation

이미지 전처리 [source] ImageDataGenerator 클래스 keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, zca_epsi

keras.io

 

이제 이를 이용해서 데이터 증식해보겠습니다.

 

아래에서 확인하실 수 있듯이 하나의 기존 이미지에 추가적으로 9장을 더 만들어서 최종적으로 10장의 이미지를 만들어진 것을 확인하였습니다.

 

각 클래스의 미지를 8:2로 나누아서 훈련 데이터와 테스트 데이터 에 각각 저장합니다.

 

여기서 훈련데이터만 데이터 증식을 하여서 갯수를 10배로 증가시킵니다.

여기서 훈련 데이터들은 화장을 한 사진 a개 그리고 화장을 하지 않은 사진 b개 구조로 순서가 되어서 저장이 되어 있으니 이들을 셔플합니다. 

최종적으로 분할되고 전처리된 이미지 데이터들의 구조는 아래와 같습니다.

 

 

이제 저희는 이 데이터들을 이용해서 CNN Deep Learning 모델을 만들고 학습이 가능해졌습니다.

 

Part2 에서 이 부분에 대해서 더 자세하게 다루도록 하겠습니다.