데이터 출처 : www.kaggle.com/jonathanoheix/face-expression-recognition-dataset
Face expression recognition dataset
www.kaggle.com
github 주소 : github.com/sangHa0411/DataScience/blob/main/Face%20Expression%20Part1.ipynb
sangHa0411/DataScience
Contribute to sangHa0411/DataScience development by creating an account on GitHub.
github.com
이번 포스팅에서는 CNN을 이용해서 Face Expression을 판별할 수 있는 모델을 만들어보도록 하겠습니다.
그리고 다음 포스팅에서는 이렇게 훈련된 모델을 이용해서 실시간 Face Expression을 파악할 수 있는 프로그램을 만들어 보겠습니다.
먼저 훈련 데이터에서 Face Expression 즉 감정의 종류는 총 7가지 입니다.

이제 각 폴더에 있는 데이터를 불러오도록 하겠습니다.

이제 각 종류에 해당 되는 이미지를 출력해서 확인해보겠습니다.

데이터를 보니 모든 종류가 얼굴 정면에 해당되는 데이터만 있는 것이 아니라 옆모양 , 등등 여러 형태의 얼굴 데이터가 있는 것을 확인할 수 있습니다.
각 종류의 데이터 갯수를 확인해보겠습니다.

Disgust에 해당되는 데이터가 436으로 다른 데이터들에 대해서 상당히 작은 것을 확인할 수 있습니다.
그리고 나머지는 대략 4000 ~ 5000정도로 상당히 많은 것을 확인할 수 있습니다.
이제 해당 하나의 리스트에 저장하겠습니다.

이제 해당 데이터를 무작위로 섞어줍니다.

여기서 Y_train에 해당되는 데이터는 0 , 1. 2 등의 값으로 저장이 되어 있으니 이를 one-hot-encoding을 통해서 벡터로 변환해줍니다.

여기서 CNN에 입력하기 위해서 데이터 구조를 변경해줍니다.

아래는 제가 사용한 CNN의 모델의 내용입니다.

위 모델을 앞서 만든 데이터를 이용해서 훈련시켜줍니다.

다음은 모델의 학습 과정입니다.

정확도가 50%정도로 성능이 많이 안좋다는 것을 확인할 수 있습니다.
그래서 그 원인을 파악하기 위해 위 훈련된 모델을 이용해서 예측에 실패한 데이터를 확인해보겠습니다.

예측에 실패한 데이터가 11508개이고 여기서 무작위로 하나 선정해서 사진을 출력해보곘습니다.

아래의 표정 사진은 sad에 해당되지만 저는 neutral이라고 판단하고 데이터에 label이 잘못된 데이터가 있다고 생각하였습니다.
따라서 억지스럽지만 예측에 실패한 데이터에 label이 잘못되어 있는 데이터가 상당수 포함되어있다고 생각해서 해당 데이터를 제외하고 다시 CNN을 학습시켜주도록 하겠습니다.

이제 위 데이터를 이용해서 CNN을 학습 시켜주도록 하겠습니다.

아래는 학습 과정중에서 validation loss 가 가장 작은 epoch를 캡쳐한 사진입니다.

정확도만 확인하더라도 대략 85%로 학습 성능이 50%에서 매우 많이 증가하였음을 확인할 수 있었습니다.
이제 이를 이용해서 실제 사진에서의 표정을 분석해보도록 하겠습니다.
먼저 학습한 모델과 얼굴 정면을 골라내기 위한 opencv 라이브러리를 불러옵니다.

그리고 얼굴 사진을 파악하고 해당 얼굴 사진의 크기 및 스케일을 전처리합니다.
그리고 모델을 이용해서 해당 얼굴의 표정을 파악합니다.

위에서 파악한 얼굴 표정을 출력하고 얼굴에 해당되는 부분에 초록색 사각형을 씌우는 함수입니다.
아래는 위 detectExpression 함수의 결과입니다.



앞선 두 사진에 대해서는 표정을 잘 분석한 것 같지만 마지막 사진은 표정을 분석하는데 실패한 것 같습니다.
이로써 얼굴 표정 분석을 위한 데이터 처리 및 전처리한 데이터를 이용해서 CNN 모델을 훈련시켜보았습니다.
다음 포스팅에 대해서는 위 학습한 모델을 이용해서 실시간 표정 분석을 해보기 위해서 비디오로 촬영 및 저장을 해보도록 하겠습니다.
'Deep Learning' 카테고리의 다른 글
Deep Learning - Keras를 이용해 CNN 설계 및 학습시키기 (0) | 2020.11.08 |
---|---|
Deep Learning - CNN을 이용한 Face Expression 파악하기 Part2 (0) | 2020.10.20 |
Deep Learning - Corona Tweets 분석하기 Part3 : 트위터 감정 분석하는 LSTM 기반 모델 만들기 (0) | 2020.10.19 |
Deep Learning - Corona Tweets 분석하기 Part2 : 텍스트 전처리하기 (0) | 2020.10.19 |
Deep Learning - Corona Tweets 분석하기 Part1 : 데이터 분석하기 (0) | 2020.10.19 |