Deeplearning_Board / README.md
eunzzang's picture
Restore Hugging Face Space Docker metadata
8e38632 verified
|
Raw
History Blame Contribute Delete
8.18 kB
metadata
title: Deeplearning Board
emoji: 🧠
colorFrom: pink
colorTo: yellow
sdk: docker
pinned: false

ASL Letter Board

Teachable Machine으둜 ν•™μŠ΅ν•œ ASL μ•ŒνŒŒλ²³ 이미지 λΆ„λ₯˜ λͺ¨λΈμ„ FastAPI와 React 화면에 μ—°κ²°ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€. μ‚¬μš©μžλŠ” 이미지 μ—…λ‘œλ“œ λ˜λŠ” μ›ΉμΊ  촬영으둜 ASL A-Z μ•ŒνŒŒλ²³μ„ μ˜ˆμΈ‘ν•˜κ³ , 예츑 κ²°κ³Όλ₯Ό κ²Œμ‹œνŒμ— μ €μž₯ν•΄ ν•™μŠ΅ 기둝처럼 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

단어 ν•™μŠ΅ 화면은 νŠΉμ • λ‹¨μ–΄λ§Œ λ³΄μ—¬μ£ΌλŠ” λ°©μ‹μ—μ„œ λ²—μ–΄λ‚˜, μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μ˜μ–΄ 단어λ₯Ό μž…λ ₯ν•˜λ©΄ 각 μ•ŒνŒŒλ²³μ˜ ASL μƒ˜ν”Œ 이미지λ₯Ό μˆœμ„œλŒ€λ‘œ ν™•μΈν•˜λŠ” λ°©μ‹μœΌλ‘œ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€. λͺ¨λΈ νŒμ •μ΄ 아직 μ™„μ „νžˆ μ•ˆμ •μ μ΄μ§€ μ•Šμ€ 점을 κ³ λ €ν•΄, ν•™μŠ΅ ν™”λ©΄μ—μ„œλŠ” μžλ™ 채점보닀 웹캠을 거울처럼 μ‚¬μš©ν•΄ μƒ˜ν”Œκ³Ό μžμ‹ μ˜ 손 λͺ¨μ–‘을 직접 λΉ„κ΅ν•˜λŠ” 흐름에 μ§‘μ€‘ν–ˆμŠ΅λ‹ˆλ‹€.

Teachable Machine ν•™μŠ΅ ν™”λ©΄

μ£Όμš” κΈ°λŠ₯

  • Teachable Machine Keras λͺ¨λΈ(keras_model.h5) 기반 ASL A-Z μ•ŒνŒŒλ²³ 이미지 λΆ„λ₯˜
  • labels.txtλ₯Ό μ΄μš©ν•œ 클래슀 라벨 λ‘œλ”© 및 κ²Œμ‹œνŒ ν•„ν„° 생성
  • 이미지 μ—…λ‘œλ“œ, λ“œλž˜κ·Έ μ•€ λ“œλ‘­, μ›ΉμΊ  촬영 뢄석
  • 예츑 κ²°κ³Ό Top 5, 신뒰도, λͺ¨λΈ 정보, μΆ”λ‘  μ‹œκ°„ ν‘œμ‹œ
  • 예츑 κ²°κ³Ό κ²Œμ‹œνŒ μ €μž₯, λͺ©λ‘ 쑰회, 상세 쑰회
  • κ²Œμ‹œκΈ€ 제λͺ© μˆ˜μ • 및 μ‚­μ œ
  • μ›ν•˜λŠ” μ˜μ–΄ 단어λ₯Ό μž…λ ₯ν•΄ ASL μ•ŒνŒŒλ²³ μƒ˜ν”Œμ„ μˆœμ„œλŒ€λ‘œ ν•™μŠ΅
  • μ›ΉμΊ  거울 λͺ¨λ“œλ‘œ μƒ˜ν”Œ 사진과 λ‚΄ 손 λͺ¨μ–‘ 비ꡐ
  • SQLite 기반 둜컬 데이터 μ €μž₯

ν™”λ©΄ ꡬ성

Start screen Home screen
Classification screen Learn screen
Board screen

μ£Όμš” 경둜:

  • /: ν™ˆ ν™”λ©΄
  • /classify: ASL μ•ŒνŒŒλ²³ λΆ„λ₯˜ ν™”λ©΄
  • /learning: 단어 μž…λ ₯ν˜• ASL ν•™μŠ΅ ν™”λ©΄
  • /board: μ €μž₯된 ν•™μŠ΅ 기둝 κ²Œμ‹œνŒ
  • /post/{id}: κ²Œμ‹œκΈ€ 상세 ν™”λ©΄
  • /webcam-test: μ›ΉμΊ  μž₯치 ν…ŒμŠ€νŠΈ ν™”λ©΄

μ‹€ν–‰ 방법

Python νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

pip install -r requirements.txt

React 화면을 λΉŒλ“œν•©λ‹ˆλ‹€.

cd frontend
npm install
npm run build
cd ..

FastAPI μ„œλ²„λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

python -m uvicorn backend.app.main:app --reload

λΈŒλΌμš°μ €μ—μ„œ μ•„λž˜ μ£Όμ†Œλ‘œ μ ‘μ†ν•©λ‹ˆλ‹€.

http://127.0.0.1:8000

μ›ΉμΊ  κΈ°λŠ₯은 λΈŒλΌμš°μ € κΆŒν•œμ΄ ν•„μš”ν•©λ‹ˆλ‹€. κΆŒν•œ μš”μ²­μ΄ 뜨면 ν—ˆμš©ν•΄μ•Ό 촬영 뢄석과 거울 μ—°μŠ΅μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

개발 쀑 React dev serverλ₯Ό λ”°λ‘œ μ‹€ν–‰ν•˜λ €λ©΄ μ•„λž˜ λͺ…령을 μ‚¬μš©ν•©λ‹ˆλ‹€. Vite proxyκ°€ /api, /word-images, /static μš”μ²­μ„ FastAPI μ„œλ²„λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€.

cd frontend
npm run dev

λͺ¨λΈ 파일

Teachable Machineμ—μ„œ TensorFlow/Keras ν˜•μ‹μœΌλ‘œ 내보낸 λͺ¨λΈ νŒŒμΌμ„ μ•„λž˜ μœ„μΉ˜μ— λ‘‘λ‹ˆλ‹€.

ai/model/keras_model.h5
ai/model/labels.txt

labels.txtλŠ” Teachable Machine κΈ°λ³Έ ν˜•μ‹μ„ μ§€μ›ν•©λ‹ˆλ‹€.

0 A
1 B
2 C
...
25 Z

μ„œλΉ„μŠ€λŠ” 라벨 νŒŒμΌμ„ 읽어 예츑 κ²°κ³Ό 이름과 κ²Œμ‹œνŒ ν•„ν„°λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

단어 ν•™μŠ΅ 이미지

단어 ν•™μŠ΅ 화면은 docs/image/test_image에 μžˆλŠ” A-Z ν…ŒμŠ€νŠΈ 이미지λ₯Ό μ•ŒνŒŒλ²³ μƒ˜ν”Œλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. 파일λͺ…은 {μ•ŒνŒŒλ²³}_test.jpg ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

docs/image/test_image/
β”œβ”€ A_test.jpg
β”œβ”€ B_test.jpg
β”œβ”€ C_test.jpg
...
└─ Z_test.jpg

FastAPIλŠ” 이 폴더λ₯Ό /test-images 경둜둜 μ œκ³΅ν•©λ‹ˆλ‹€.

http://127.0.0.1:8000/test-images/A_test.jpg
http://127.0.0.1:8000/test-images/Z_test.jpg

ν˜„μž¬ μ΄λ―Έμ§€λŠ” ν…ŒμŠ€νŠΈμš©μ΄λΌ λ‹€μ†Œ μ–΄λ‘μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. 이후 밝기와 배경을 λ³΄μ •ν•œ A-Z λŒ€ν‘œ 이미지λ₯Ό 같은 파일λͺ…μœΌλ‘œ κ΅μ²΄ν•˜λ©΄ ν™”λ©΄ λ‘œμ§μ„ λ°”κΎΈμ§€ μ•Šκ³  ν’ˆμ§ˆμ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

API

이미지 예츑

POST /api/v1/predict
Content-Type: multipart/form-data

μš”μ²­ ν•„λ“œ:

  • file: jpg, jpeg, png 이미지 파일

응닡 μ˜ˆμ‹œ:

{
  "success": true,
  "filename": "sample.png",
  "predicted_class": "A",
  "confidence": 0.9821,
  "top_k": [
    { "label": "A", "score": 0.9821 },
    { "label": "B", "score": 0.0121 }
  ],
  "model": {
    "name": "keras_model.h5",
    "version": "v1"
  },
  "inference_time_ms": 123
}

라벨 쑰회

GET /api/v1/predict/labels

응닡 μ˜ˆμ‹œ:

{
  "classes": ["A", "B", "C"],
  "count": 3
}

κ²Œμ‹œκΈ€

GET /api/v1/posts
GET /api/v1/posts?category=A
GET /api/v1/posts/{post_id}
POST /api/v1/posts
PUT /api/v1/posts/{post_id}
DELETE /api/v1/posts/{post_id}

κ²Œμ‹œκΈ€ μ €μž₯ μš”μ²­ μ˜ˆμ‹œ:

{
  "title": "ASL A λΆ„λ₯˜ κ²°κ³Ό",
  "image_url": "data:image/png;base64,...",
  "prediction": "A",
  "confidence": 0.95
}

ν”„λ‘œμ νŠΈ ꡬ쑰

Deeplearning_Board/
β”œβ”€ ai/
β”‚  └─ model/
β”‚     β”œβ”€ keras_model.h5
β”‚     └─ labels.txt
β”œβ”€ backend/
β”‚  └─ app/
β”‚     β”œβ”€ main.py
β”‚     β”œβ”€ routers/
β”‚     β”‚  β”œβ”€ pages.py
β”‚     β”‚  β”œβ”€ post.py
β”‚     β”‚  └─ predict.py
β”‚     └─ services/
β”‚        β”œβ”€ classifier_service.py
β”‚        └─ post_service.py
β”œβ”€ data/
β”‚  └─ app.db
β”œβ”€ docs/
β”‚  └─ image/
β”‚     β”œβ”€ test_image/
β”‚     β”‚  β”œβ”€ A_test.jpg
β”‚     β”‚  └─ ...
β”‚     └─ words/
β”‚        β”œβ”€ LOVE/
β”‚        β”œβ”€ APPLE/
β”‚        └─ manifest.json
β”œβ”€ frontend/
β”‚  β”œβ”€ src/
β”‚  β”‚  β”œβ”€ api/client.js
β”‚  β”‚  β”œβ”€ main.jsx
β”‚  β”‚  └─ style.css
β”‚  β”œβ”€ static/
β”‚  β”‚  β”œβ”€ css/style.css
β”‚  β”‚  └─ images/placeholder.jpg
β”‚  β”œβ”€ index.html
β”‚  β”œβ”€ package.json
β”‚  β”œβ”€ package-lock.json
β”‚  └─ vite.config.js
β”œβ”€ Dockerfile
β”œβ”€ requirements.txt
└─ README.md

배포

이 ν”„λ‘œμ νŠΈλŠ” Hugging Face Spaces의 Docker ν™˜κ²½μ— λ°°ν¬ν–ˆμŠ΅λ‹ˆλ‹€. Docker λΉŒλ“œλŠ” React 앱을 λ¨Όμ € λΉŒλ“œν•œ λ’€, FastAPIκ°€ λΉŒλ“œλœ 정적 파일과 APIλ₯Ό ν•˜λ‚˜μ˜ μ„œλ²„μ—μ„œ μ œκ³΅ν•©λ‹ˆλ‹€.

https://huggingface.co/spaces/eunzzang/Deeplearning_Board

주의:

  • 무료 SpaceλŠ” μž¬μ‹œμž‘ μ‹œ SQLite 데이터가 μ΄ˆκΈ°ν™”λ  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μž₯κΈ° μ €μž₯이 ν•„μš”ν•˜λ©΄ 별도 λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ persistent storageκ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • 첫 λΉŒλ“œλŠ” TensorFlow μ„€μΉ˜ λ•Œλ¬Έμ— μ‹œκ°„μ΄ 걸릴 수 μžˆμŠ΅λ‹ˆλ‹€.

ν˜„μž¬ ν•œκ³„μ™€ ν–₯ν›„ κ°œμ„ 

  • ν˜„μž¬ 단어 ν•™μŠ΅ μƒ˜ν”Œμ€ ν…ŒμŠ€νŠΈμš© 이미지라 밝기와 λ°°κ²½ ν’ˆμ§ˆμ„ μΆ”κ°€λ‘œ 보정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이미지 λΆ„λ₯˜ λͺ¨λΈμ€ μ‘°λͺ…, λ°°κ²½, 손 μœ„μΉ˜, 카메라 각도에 영ν–₯을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 단어 ν•™μŠ΅ ν™”λ©΄μ˜ 웹캠은 ν˜„μž¬ μžλ™ 채점이 μ•„λ‹Œ 거울 비ꡐ μš©λ„μž…λ‹ˆλ‹€.
  • λͺ¨λΈ 정확도가 μΆ©λΆ„νžˆ κ°œμ„ λ˜λ©΄ κΈ€μžλ³„ μˆ˜λ™ 확인 κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μžλ™μ²΄ν¬ λͺ¨λ“œλŠ” μ•ˆμ •μ μΈ 예츑 μ„±λŠ₯κ³Ό 호좜 μ œν•œ 정책이 μ€€λΉ„λœ λ’€ λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œ λ„μž…ν•˜λŠ” 것이 μ μ ˆν•©λ‹ˆλ‹€.

μ°Έκ³  사항

  • κ²Œμ‹œκΈ€ λ°μ΄ν„°λŠ” data/app.db에 μ €μž₯λ©λ‹ˆλ‹€.
  • data/app.dbλŠ” μ‹€ν–‰ 쀑 μžλ™ μƒμ„±λ©λ‹ˆλ‹€.
  • 웹캠은 http://127.0.0.1 λ˜λŠ” HTTPS ν™˜κ²½μ—μ„œ μ•ˆμ •μ μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€.
  • Teachable Machine λͺ¨λΈ ν˜Έν™˜μ„ μœ„ν•΄ tf-kerasλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
  • __pycache__와 μ‹€ν–‰ 쀑 생성 νŒŒμΌμ€ 컀밋 λŒ€μƒμ—μ„œ μ œμ™Έν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.