์ค์๊ฐ์ผ๋ก ์ผ๊ตด, ์์ฑ, ํ ์คํธ 3๊ฐ์ง ๋ชจ๋ฌ๋ฆฌํฐ์์ ๊ฐ์ ์ ๋ถ์ํ๋ ํตํฉ ํ๋ก๊ทธ๋จ์ ๋๋ค.
์ค์๊ฐ ๊ฐ์ ๋ถ์ + ChatGPT AI ์๋ด์ฌ๊ฐ ํตํฉ๋ ์น ๋ฒ์ ์ด ์ถ๊ฐ๋์์ต๋๋ค!
# ์น ์์กด์ฑ ์ค์น
pip install Flask flask-cors openai
# ์๋ฒ ์คํ
python3 app.py
# ๋ธ๋ผ์ฐ์ ์ ์
# http://localhost:5000์น ๋ฒ์ ํน์ง:
- โ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ์คํ (๋ณ๋ ์ค์น ๋ถํ์)
- โ ์ค์๊ฐ ๊ฐ์ ๋ถ์ (5์ด ๊ฐ๊ฒฉ Late Fusion)
- โ ChatGPT ํตํฉ ๊ณต๊ฐ์ AI ์๋ด์ฌ
- โ ๋ฐ์ํ ๋์์ธ (๋ฐ์คํฌํฑ, ๋ชจ๋ฐ์ผ)
- โ 5๊ฐ์ง ๊ฐ์ ํ๋ฅ ์ค์๊ฐ ํ์
๐ ์์ธ ๊ฐ์ด๋: QUICKSTART.md | WEB_APP_GUIDE.md
๋ชจ๋ ๋ชจ๋ฌ๋ฆฌํฐ์์ ๋์ผํ 5๊ฐ์ง ๊ฐ์ ์ ๋ถ๋ฅํฉ๋๋ค:
- ํ๋ณต (happy)
- ์ฐ์ธ (depressed)
- ๋๋ (surprised)
- ํ๋จ (angry)
- ์ค๋ฆฝ (neutral)
๊ฐ ๊ฐ์ ์ ํ๋ฅ ํฉ์ 1.0์ด๋ฉฐ, ์์: [0.1, 0.1, 0.2, 0.5, 0.1]
# ์ ์ฅ์ ํด๋ก (๋๋ ์์ถ ํด์ )
cd seeksick-main
# ์๋ ์ค์น ์คํฌ๋ฆฝํธ ์คํ
python setup.py๋ค์ ๋ชจ๋ธ ํ์ผ๋ค์ models/ ๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํ์ธ์:
models/
โโโ seeksick-resnet18.pth # ์ผ๊ตด ๊ฐ์ ๋ถ์
โโโ seeksick-voice.pt # ์์ฑ ๊ฐ์ ๋ถ์
โโโ seeksick-kobert.pt # ํ
์คํธ ๊ฐ์ ๋ถ์
# ๋ฉํฐ๋ชจ๋ฌ ๊ฐ์ ๋ถ์ ์์
python main.pyํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด:
-
์น์บ ์ด ์๋์ผ๋ก ์์๋ฉ๋๋ค
-
๋ง์ดํฌ์์ ์ค์๊ฐ์ผ๋ก ์์ฑ์ ์์งํฉ๋๋ค
-
3์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ค์ ๋ถ์์ ์ํํฉ๋๋ค:
- ์์ฑ โ ํ ์คํธ ๋ณํ (Whisper)
- ์์ฑ ๊ฐ์ ๋ถ์
- ํ ์คํธ ๊ฐ์ ๋ถ์
- ์ผ๊ตด ๊ฐ์ ๋ถ์ (์ค์๊ฐ)
-
๊ฒฐ๊ณผ๊ฐ ์ฝ์๊ณผ ํ๋ฉด์ ํ์๋ฉ๋๋ค
์ข
๋ฃ: q ํค๋ฅผ ๋๋ฅด์ธ์
๊ฐ ๋ชจ๋ธ์ ๊ฐ๋ณ์ ์ผ๋ก ํ ์คํธํ ์ ์์ต๋๋ค:
# ์ผ๊ตด ๊ฐ์ ๋ถ์ ํ
์คํธ
python -m models.face_emotion_model
# ์์ฑ ๊ฐ์ ๋ถ์ ํ
์คํธ
python -m models.voice_emotion_model
# ํ
์คํธ ๊ฐ์ ๋ถ์ ํ
์คํธ
python -m models.text_emotion_modelseeksick-main/
โโโ main.py # ๋ฉ์ธ ํ๋ก๊ทธ๋จ
โโโ setup.py # ์ค์น ์คํฌ๋ฆฝํธ
โโโ requirements.txt # ์์กด์ฑ ํจํค์ง
โโโ .env # ์ค์ ํ์ผ
โโโ models/ # ๋ชจ๋ธ ๋ชจ๋
โ โโโ __init__.py
โ โโโ face_emotion_model.py # ์ผ๊ตด ๊ฐ์ ๋ถ์
โ โโโ voice_emotion_model.py # ์์ฑ ๊ฐ์ ๋ถ์
โ โโโ text_emotion_model.py # ํ
์คํธ ๊ฐ์ ๋ถ์
โ โโโ seeksick-resnet18.pth # ์ผ๊ตด ๋ชจ๋ธ ํ์ผ
โ โโโ seeksick-voice.pt # ์์ฑ ๋ชจ๋ธ ํ์ผ
โ โโโ seeksick-kobert.pt # ํ
์คํธ ๋ชจ๋ธ ํ์ผ
โโโ README.md
- ์ผ๊ตด ๊ฐ์ : ResNet18 + OpenCV
- ์์ฑ ๊ฐ์ : CNN/Wav2Vec2 + librosa
- ํ ์คํธ ๊ฐ์ : KoBERT + Transformers
- ์์ฑ ์ธ์: OpenAI Whisper
- ์์ฑ ์ฒ๋ฆฌ:
sounddevice,scipy,librosa - ์์ ์ฒ๋ฆฌ:
opencv-python - ๋ฅ๋ฌ๋:
torch,transformers - ์์ฑ ์ธ์:
openai-whisper
.env ํ์ผ์์ ๋ค์ ์ค์ ์ ์กฐ์ ํ ์ ์์ต๋๋ค:
# ๋ชจ๋ธ ํ์ผ ๊ฒฝ๋ก
FACE_MODEL_PATH=models/seeksick-resnet18.pth
VOICE_MODEL_PATH=models/seeksick-voice.pt
TEXT_MODEL_PATH=models/seeksick-kobert.pt
# ์ค๋์ค ์ค์
SAMPLE_RATE=16000
AUDIO_BUFFER_SIZE=3.0
# ๋น๋์ค ์ค์
VIDEO_FPS=10
# ์ ๋ขฐ๋ ์๊ณ๊ฐ
CONFIDENCE_THRESHOLD=0.5=============================================================
์๊ฐ: 14:23:15
ํ
์คํธ: ์ค๋ ์ ๋ง ๊ธฐ๋ถ์ด ์ข์์!
=============================================================
๐ค ์์ฑ ๊ฐ์ ๋ถ์:
happy: 0.782
depressed: 0.045
surprised: 0.123
angry: 0.032
neutral: 0.018
๐ ํ
์คํธ ๊ฐ์ ๋ถ์:
happy: 0.856
depressed: 0.024
surprised: 0.089
angry: 0.015
neutral: 0.016
๐ค ์ผ๊ตด ๊ฐ์ ๋ถ์ (14:23:15):
happy: 0.734
depressed: 0.056
surprised: 0.145
angry: 0.038
neutral: 0.027
โ ๏ธ seeksick-resnet18.pth ์์ (๋์ค์ ์ถ๊ฐ ํ์)
โ ํด๋น ๋ชจ๋ธ ํ์ผ์ models/ ๋๋ ํ ๋ฆฌ์ ๋ฐฐ์นํ์ธ์
โ ์น์บ ์ ์ด ์ ์์ต๋๋ค.
โ ์นด๋ฉ๋ผ ๊ถํ์ ํ์ธํ๊ณ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ๊ณ ์์ง ์์์ง ํ์ธํ์ธ์
โ ๏ธ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
โ ๋ง์ดํฌ ๊ถํ์ ํ์ธํ๊ณ ์ค๋์ค ์ฅ์น๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ์ธ์
CUDA out of memory
โ .env์์ ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ ์ค์ด๊ฑฐ๋ CPU ๋ชจ๋๋ก ์ ํํ์ธ์
models/__init__.py์์EMOTIONS๋ฆฌ์คํธ ์์ - ๊ฐ ๋ชจ๋ธ์ ์ถ๋ ฅ ์ฐจ์ ๋ณ๊ฒฝ
- ๋ชจ๋ธ ์ฌํ๋ จ ๋๋ ๊ฐ์ค์น ์์
models/๋๋ ํ ๋ฆฌ์ ์ ๋ชจ๋ธ ๋ชจ๋ ์์ฑmain.py์MultimodalEmotionAnalyzer์ ํตํฉ- UI ๋ฐ ๊ฒฐ๊ณผ ํ์ ๋ก์ง ์์
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค ํ์ ๋ฐฐํฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ์กฐํ์ธ์.
๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์์ฒญ, ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ํฉ๋๋ค!
Seeksick Team ๐