--- 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 ν•™μŠ΅ ν™”λ©΄](docs/image/teachable_machine_page.png) ## μ£Όμš” κΈ°λŠ₯ - 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 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€. ```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__`와 μ‹€ν–‰ 쀑 생성 νŒŒμΌμ€ 컀밋 λŒ€μƒμ—μ„œ μ œμ™Έν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.