Skip to content

zlwmxkdla/multipresso

 
 

Repository files navigation

wave



🥤 프로젝트 소개

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

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

📂 목차

📢 서비스 프로세스

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기반 모델로 학습한 결과는 다음과 같습니다.

시행착오

// 레즈넷 내용 담을거임

👍 메뉴 추천 알고리즘

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

image

🎉 서비스 시현

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

Animation

☑️ 첫 시작 페이지

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

☑️ 로딩 페이지 (연령과 감정 예측)

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

☑️ 메뉴 페이지

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

☑️ 실행 방법

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

python base.py

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 91.1%
  • HTML 6.3%
  • Python 2.6%