SeoMiYoung / MultiPresso

동국대학교 멀티미디어소프트웨어공학과 졸업작품으로 진행된 딥러닝 프로젝트 입니다.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

wave



🥤 프로젝트 소개

해당 프로젝트는 동국대 멀티미디어소프트웨어공학과 졸업작품으로 진행되었습니다.

image

여러분은 키오스크에서 메뉴를 주문하실 때, 마음에 드는 메뉴를 추천받으신적이 있으신가요? 잘 없으셨을텐데요, 저희 팀원들은 동국대학교 근처 카페인 바나프레소를 자주 이용하면서, 키오스크 화면에 뜨는 추천 메뉴들이 사용자를 고려하지 않은 일반적인 추천 메뉴들이라는 점을 발견했습니다. 이에 따라, 키오스크가 사용자를 분석하여 사용자 맞춤의 추천 메뉴를 제공한다면 사용자의 편의성을 높일 수 있을 것이라고 생각했고, 따라서 해당 주제를 졸업 작품에 적용해보기로 했습니다.

🗓️ 프로젝트 기간

2023.09.05 ~ 2023.12.15

👩‍💻 팀명과 팀원(Contributors)

팀명: 멀티20들
팀원: 서미영, 이유정, 안정민, 이채린

⚙️ 사용 툴

✔️ ML(Machine Learning) / DL(Deep Learning)

TensorFlow Keras Matplotlib Pandas NumPy scikit-learn

✔️ Languages

Python HTML5 CSS3 JavaScript

✔️ Frameworks, Platforms and Libraries

OpenCV Flask

✔️ Developer/Forums

Kaggle

✔️ Cloud Storage

Google Drive

✔️ IDEs/Editors

Jupyter Notebook Visual Studio Code

📂 목차

💻 디렉터리 구조

📦multi20_finalcode
 ┣ 📂model // 최종 적용 모델 h5 파일
 ┃ ┣ 📜age_model.h5
 ┃ ┗ 📜emotion_model.h5
 ┣ 📂practice // 코랩 pro plus에서 사용했던 학습 관련 파일들
 ┃ ┣ 📂bright // 밝기 조절 관련 파일들
 ┃ ┃ ┣ 📜age_add_darkedData.ipynb
 ┃ ┃ ┣ 📜age_add_lightedData.ipynb
 ┃ ┃ ┣ 📜Change_Darked.ipynb
 ┃ ┃ ┣ 📜Change_Lighted.ipynb
 ┃ ┃ ┣ 📜darked_UTK.csv
 ┃ ┃ ┗ 📜lighted_UTK.csv
 ┃ ┣ 📂capture // 직접 웹캠을 수집하고 학습시킬때 사용한 파일들
 ┃ ┃ ┣ 📂image // 웹캠으로 수집한 사진들 저장(얼굴 사진들로, 깃헙에는 미첨부)
 ┃ ┃ ┣ 📜age_add_webcam_captured.ipynb
 ┃ ┃ ┣ 📜age_add_webcam_captured.txt
 ┃ ┃ ┗ 📜capture.ipynb
 ┃ ┗ 📂sample // 모델을 학습시키는데 있어서 사용한 ipynb파일들
 ┃ ┃ ┣ 📜Age_Model_VGG16.ipynb
 ┃ ┃ ┣ 📜Emotion_Model_CK_Plus.ipynb
 ┃ ┃ ┗ 📜Emotion_Model_Fer2013.ipynb
 ┣ 📂static // 정적 이미지 모음
 ┃ ┣ 📂common
 ┃ ┃ ┣ 📜logo.png
 ┃ ┃ ┣ 📜new_logo.png
 ┃ ┃ ┗ 📜rabbit.png
 ┃ ┗ 📂product 
 ┃ ┃ ┣ 📜americano.png
 ┃ ┃ ┣ 📜BlackSugarBubbleTea.png
 ┃ ┃ ┣ 📜CafeLatte.png
 ┃ ┃ ┣ 📜ChamomileTea.png
 ┃ ┃ ┣ 📜GrapefruitHoneyBlackTea.png
 ┃ ┃ ┣ 📜JavachipBanaccino.png
 ┃ ┃ ┣ 📜JujubeBlackHerbalTea.png
 ┃ ┃ ┣ 📜MilkCaramelMacchiato.png
 ┃ ┃ ┣ 📜RoastedGrainLatte.png
 ┃ ┃ ┣ 📜Sikhye.png
 ┃ ┃ ┣ 📜StrawberryJuice.png
 ┃ ┃ ┗ 📜ToffeeNutLatte.png
 ┣ 📂templates // 테스트 웹페이지 구현 템플릿들
 ┃ ┣ 📜base.html
 ┃ ┣ 📜loading.html
 ┃ ┗ 📜menu.html
 ┣ 📜.gitattributes
 ┣ 📜base.py // 테스트 웹페이지를 실행하는 파일
 ┣ 📜haarcascade_frontalface_default.xml
 ┗ 📜README.md

📢 서비스 프로세스

image

💁 연령 모델 학습

아래의 과정을 기반으로 학습된 연령 모델은 model/age_model.h5 입니다.

저희는 연령 모델에 대한 데이터셋을 다음의 세단계로 순차적으로 학습시켰습니다. image

☑️ STEP1 - 기본 Dataset으로 학습

✔️ 데이터 전처리

  • 연령이 라벨링되어있는 UTK Faces 데이터셋과 Facial Age 데이터셋을 사용
  • Kaggle에서 다운로드
  • 두 데이터셋을 결합한 후, 모델 학습을 위해 train과 test 데이터셋으로 분리하였으며, 모델 성능 향상을 위해 train데이터셋을 10배 증강하여 학습을 진행
  • 연령에 대해서는 총 11개의 class로 분류

image

✔️ CNN 모델 선정

  • 준비한 데이터셋으로 VGG16, VGG19, ResNet 모델로 학습(에폭 30) 진행해서 결과 비교
  • VGG기반 모델들과 달리, ResNet 모델의 경우, 초기 학습 때 과적합의 문제가 발생했으나, 모델의 layer를 단순화시키고 채널값을 3에서 1로 조절함으로써 해결할 수 있었음
  • 세 모델의 비교 결과, VGG16이 성능이 제일 좋아서, VGG16으로 최종 모델을 결정하고, 에폭 100으로 재학습시킴

image image

✔️ STEP1 학습 결과의 문제점

  • 정확한 나이가 예측되지 않았으며, 그 원인으로 웹캠 환경에서 찍어오는 데이터가 학습한 데이터와 차이가 있기 때문이라고 예상 --> 2차 학습 진행

☑️ STEP2 - 성능 향상을 위한 여러가지 시도: 광조 고려

✔️ 기존 데이터셋의 밝기를 랜덤으로 변화시켜 재구성

  • 웹캠으로 촬영하는 환경에 따라 밝기 차이가 있을 수 있다고 판단하여, 기존 데이터셋의 밝기를 랜덤으로 변화시켜 재구성한 데이터셋으로 학습 진행
  • 정확도와 성능이 높아짐
    • 아래 사진을 보면 20대 학생을 STEP1 모델을 적용했을때는 66-116살로 예측했지만, STEP2 모델을 적용했을때는 33-39살로 예측되는 걸 확인할 수 있음

image

☑️ STEP3 - 성능 향상을 위한 여러가지 시도: 웹캠 환경을 고려한 웹캠 데이터 추가

✔️ 웹캠으로 데이터 직접 수집

  • 시현 환경이 웹캠이기 때문에 웹캠에서 찍은 얼굴이 필요하다고 판단
  • 웹캠으로 데이터를 직접 수집하여 마지막으로 모델 학습 진행
  • 데이터 균등을 고려하여 11개의 연령 클래스 당, 35명의 웹 캠 사진을 다음과 같이 8배 증강하여, 총 3080장에 대해 모델 학습 진행
  • 정확도와 성능이 높아짐
    • 아래 사진을 보면 20대 학생을 STEP2 모델을 적용했을때는 33-39살로 예측했지만, STEP3 모델을 적용했을때는 27-32살로 예측되는 걸 확인할 수 있음

image

☑️ STEP1 결과와 STEP3 결과를 웹캠상으로(gif이미지 첨부) 비교

웹캠 출연 모델 정보: 20대 초중반

✔️ STEP1 결과

움직일때마다 예측 나이 변동이 심한 걸 확인할 수 있음

✔️ STEP3 결과

예측 값 변동이 심하지 않고, 예측 성능이 많이 향상된 걸 확인할 수 있음

😆 감정 모델 학습

아래의 과정을 기반으로 학습된 연령 모델은 model/emotion_model.h5 입니다.

☑️ 데이터셋을 결정하는데 있어서 발생한 시행착오

✔️ 기존에 결정한 데이터셋: CK+

image

  • 기존에는 CK+ 데이터셋을 사용해서 학습 진행 --> But, 문제점 발견
    • [문제점1] 무표정 데이터셋이 존재하지 않음 -> 키오스크를 이용하는 대부분의 사용자는 무표정인데, 무표정 데이터셋이 없다는점은 원하는 결과를 얻기에는 큰 문제였음
    • [문제점2] CK+는 데이터셋의 규모가 작아서 정확한 예측이 불가능하다고 판단
    • [문제점3] 데이터셋이 매우 중앙에 위치한 얼굴로 구성되어있어서 웹캠과 같이 얼굴 움직임이 불안정한 경우, 정확한 예측을 하는데 취약하다고 판단

✔️ 바꾼 데이터셋: FER2013

image

  • Kaggle에서 다운로드
  • FER2013의 경우 약 35000장의 대규모 감정 데이터셋을 가지고 있음
  • 무표정 데이터셋 포함

☑️ FER2013 재라벨링

FER2013 데이터셋은 기존에는 7개의 감정으로 라벨링되어 있었으나, 저희의 키오스크 시스템의 경우, 손님들이 주문하는 순간의 표정이 다양하지 않을 것이라고 판단하여 아래 사진과 같이 negative, non-negative, neutral 이렇게 3가지 감정으로 재분류하였습니다.

☑️ CNN 모델 학습

연령과 동일하게 VGG기반 모델로 학습한 결과는 다음과 같습니다.

💥 ResNet 시행착오

저희는 위에서 언급했듯이, 준비한 데이터셋으로 VGG16, VGG19, ResNet 모델에 학습을 진행하였습니다. VGG기반 모델들과 달리, ResNet 모델의 경우 과적합이 발생하였습니다. 저희는 이 과적합의 원인을 찾기 위해 많은 시간들을 쏟았습니다.

☑️ [시도1] Shuffle값 조정, 에폭 늘리기, Layer 추가 -> 미해결

image 처음 ResNet에 오버피팅이 발생한 후, Shuffe값을 TRUE로 설정해보기, 에폭 늘려보기, Layer추가하기 등 다양한 방법을 시도했지만 위의 사진에서 보면 알 수 있듯이 과적합이 해결되지 않았습니다.

☑️ [시도2] Dropout, 언더샘플링, 오버샘플링 -> 미해결

image 과적합을 해결하는 방법들인 Dropout, 언더샘플링, 오버샘플링을 적용해보았지만 마찬가지로 과적합이 해결되지 않았습니다.

☑️ [시도3] 사전훈련된 모델을 사용하지 않기 & 채널 값 조정 & ResNet50에서 ResNet18로 변경 -> 해결

image 기존에 사용했던 ResNet50 모델이 사전에 훈련된 모델이였는데, 사전 훈련된 모델 말고, 모델을 저희가 사용하는 데이터셋에 맞게 구현해서 사용하였습니다. 또한 사실상 이미 프로젝트에는 VGG기반 모델을 사용하기로 결정했기 때문에 간단히 과적합의 원인만 찾기 위해서 ResNet50보다는 더 얕은 네트워크 구조를 가진 ResNet18로 변경하여서 원인을 찾기로 했습니다.
결정적으로 과적합의 원인을 찾을 수 있었던 가장 큰 이유는 채널 조정이었습니다. 저희가 가진 데이터셋에는 흑백 이미지들과 컬러 이미지들이 모두 섞여있습니다. 기존에 저희는 채널3으로 학습을 시켰었는데요, 데이터셋에서 흑백 이미지들을 강제로 컬러 이미지로 바꾸는 과정속에서 문제가 발생했던 것 같습니다. 그래서 저희는 grayscale을 적용해, 채널을 3에서 1로 변경해서 학습시켰고, 이로써 과적합 원인을 해결할 수 있었습니다.

👍 메뉴 추천 알고리즘

웹캠을 통해 사용자의 연령과 감정을 인식하면, 연령에 대한 음료 정렬 순서에서 상위 4개의 메뉴를 가져옵니다. 이 4개의 메뉴는 추천 메뉴로 띄우게 되는데, 감정에 따라 추천 메뉴를 화면에 띄우는 순서가 달라집니다. 예측한 감정이 긍정일 경우 당이 낮은 순서대로, 부정일 경우 당이 높은 순서대로 재정렬해서 화면에 띄우고, neutral일 경우에는 받아온 순서 그대로 화면에 띄웁니다.

image

🎉 서비스 시현

딥러닝 모델을 만들고, 성능을 높히는 과정에 초점을 두어서, 웹페이지는 테스트용으로만 간단히 제작하였습니다.

Animation

☑️ 첫 시작 페이지 - templates/base.html

  • 키오스크에서 사용자가 주문하기 버튼을 누름

☑️ 로딩 페이지 (연령과 감정 예측) - templates/loading.html

  • 일정 시간동안 웹캠을 통하여 사용자의 얼굴 촬영
  • OpenCV를 사용하여 웹캠으로부터 영상 캡처
  • 웹캠에서 가장 앞에 있는 사람 한 명만을 감지하도록 구현
  • 예측 연령 범위가 변동이 심할 수 있기 때문에 moving average 적용
  • 각 프레임이 예측한 연령과 감정의 최빈값을 구해 최종적인 예측 연령과 감정 결정
  • 웹캠 좌측 상단에 confidence를 넣어서 모델이 예측한 결과에 대한 신뢰 수준을 확인할 수 있게 함

☑️ 메뉴 페이지 - templates/menu.html

  • 최종적으로 결정된 예측 연령과 감정을 바탕으로, 전체 메뉴를 보여주기 전에 메뉴 페이지 상단에 추천 음료 4개를 띄움

☑️ 실행 방법

실행하기전에, html파일 내부의 경로들을 각자의 경로로 수정해야합니다.

python base.py

👀 기대효과 및 한계점

image

💗 프로젝트 리뷰

image

About

동국대학교 멀티미디어소프트웨어공학과 졸업작품으로 진행된 딥러닝 프로젝트 입니다.


Languages

Language:Jupyter Notebook 96.4%Language:HTML 2.5%Language:Python 1.1%