---
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 Keras λͺ¨λΈ(`keras_model.h5`) κΈ°λ° ASL A-Z μνλ²³ μ΄λ―Έμ§ λΆλ₯
- `labels.txt`λ₯Ό μ΄μ©ν ν΄λμ€ λΌλ²¨ λ‘λ© λ° κ²μν νν° μμ±
- μ΄λ―Έμ§ μ
λ‘λ, λλκ·Έ μ€ λλ‘, μΉμΊ 촬μ λΆμ
- μμΈ‘ κ²°κ³Ό Top 5, μ λ’°λ, λͺ¨λΈ μ 보, μΆλ‘ μκ° νμ
- μμΈ‘ κ²°κ³Ό κ²μν μ μ₯, λͺ©λ‘ μ‘°ν, μμΈ μ‘°ν
- κ²μκΈ μ λͺ© μμ λ° μμ
- μνλ μμ΄ λ¨μ΄λ₯Ό μ
λ ₯ν΄ ASL μνλ²³ μνμ μμλλ‘ νμ΅
- μΉμΊ κ±°μΈ λͺ¨λλ‘ μν μ¬μ§κ³Ό λ΄ μ λͺ¨μ λΉκ΅
- SQLite κΈ°λ° λ‘컬 λ°μ΄ν° μ μ₯
## νλ©΄ ꡬμ±
μ£Όμ κ²½λ‘:
- `/`: ν νλ©΄
- `/classify`: ASL μνλ²³ λΆλ₯ νλ©΄
- `/learning`: λ¨μ΄ μ
λ ₯ν ASL νμ΅ νλ©΄
- `/board`: μ μ₯λ νμ΅ κΈ°λ‘ κ²μν
- `/post/{id}`: κ²μκΈ μμΈ νλ©΄
- `/webcam-test`: μΉμΊ μ₯μΉ ν
μ€νΈ νλ©΄
## μ€ν λ°©λ²
Python ν¨ν€μ§λ₯Ό μ€μΉν©λλ€.
```bash
pip install -r requirements.txt
```
React νλ©΄μ λΉλν©λλ€.
```bash
cd frontend
npm install
npm run build
cd ..
```
FastAPI μλ²λ₯Ό μ€νν©λλ€.
```bash
python -m uvicorn backend.app.main:app --reload
```
λΈλΌμ°μ μμ μλ μ£Όμλ‘ μ μν©λλ€.
```text
http://127.0.0.1:8000
```
μΉμΊ κΈ°λ₯μ λΈλΌμ°μ κΆνμ΄ νμν©λλ€. κΆν μμ²μ΄ λ¨λ©΄ νμ©ν΄μΌ 촬μ λΆμκ³Ό κ±°μΈ μ°μ΅μ μ¬μ©ν μ μμ΅λλ€.
κ°λ° μ€ React dev serverλ₯Ό λ°λ‘ μ€ννλ €λ©΄ μλ λͺ
λ Ήμ μ¬μ©ν©λλ€. Vite proxyκ° `/api`, `/word-images`, `/static` μμ²μ FastAPI μλ²λ‘ μ λ¬ν©λλ€.
```bash
cd frontend
npm run dev
```
## λͺ¨λΈ νμΌ
Teachable Machineμμ TensorFlow/Keras νμμΌλ‘ λ΄λ³΄λΈ λͺ¨λΈ νμΌμ μλ μμΉμ λ‘λλ€.
```text
ai/model/keras_model.h5
ai/model/labels.txt
```
`labels.txt`λ Teachable Machine κΈ°λ³Έ νμμ μ§μν©λλ€.
```text
0 A
1 B
2 C
...
25 Z
```
μλΉμ€λ λΌλ²¨ νμΌμ μ½μ΄ μμΈ‘ κ²°κ³Ό μ΄λ¦κ³Ό κ²μν νν°λ₯Ό ꡬμ±ν©λλ€.
## λ¨μ΄ νμ΅ μ΄λ―Έμ§
λ¨μ΄ νμ΅ νλ©΄μ `docs/image/test_image`μ μλ A-Z ν
μ€νΈ μ΄λ―Έμ§λ₯Ό μνλ²³ μνλ‘ μ¬μ©ν©λλ€. νμΌλͺ
μ `{μνλ²³}_test.jpg` νμμ μ¬μ©ν©λλ€.
```text
docs/image/test_image/
ββ A_test.jpg
ββ B_test.jpg
ββ C_test.jpg
...
ββ Z_test.jpg
```
FastAPIλ μ΄ ν΄λλ₯Ό `/test-images` κ²½λ‘λ‘ μ 곡ν©λλ€.
```text
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
### μ΄λ―Έμ§ μμΈ‘
```http
POST /api/v1/predict
Content-Type: multipart/form-data
```
μμ² νλ:
- `file`: jpg, jpeg, png μ΄λ―Έμ§ νμΌ
μλ΅ μμ:
```json
{
"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
}
```
### λΌλ²¨ μ‘°ν
```http
GET /api/v1/predict/labels
```
μλ΅ μμ:
```json
{
"classes": ["A", "B", "C"],
"count": 3
}
```
### κ²μκΈ
```http
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}
```
κ²μκΈ μ μ₯ μμ² μμ:
```json
{
"title": "ASL A λΆλ₯ κ²°κ³Ό",
"image_url": "data:image/png;base64,...",
"prediction": "A",
"confidence": 0.95
}
```
## νλ‘μ νΈ κ΅¬μ‘°
```text
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__`μ μ€ν μ€ μμ± νμΌμ μ»€λ° λμμμ μ μΈνλ κ²μ κΆμ₯ν©λλ€.