# Aplikasi Penerjemah Bahasa Isyarat Indonesia Aplikasi penerjemah bahasa isyarat Indonesia (BISINDO & SIBI) berbasis machine learning menggunakan **MediaPipe Hands**, **MediaPipe Face Mesh**, dan **Temporal Convolutional Network (TCN)**. --- ## πŸ“‹ Daftar Isi - [Deskripsi](#deskripsi) - [Fitur](#fitur) - [Arsitektur Sistem](#arsitektur-sistem) - [Struktur Direktori](#struktur-direktori) - [Instalasi](#instalasi) - [Library dan Dependensi](#library-dan-dependensi) - [Pipeline Project](#pipeline-project) - [Penggunaan](#penggunaan) - [1. Ekstraksi Landmark](#1-ekstraksi-landmark) - [2. Normalisasi Landmark](#2-normalisasi-landmark) - [3. Split Dataset](#3-split-dataset) - [4. Training Model](#4-training-model) - [5. Testing Model](#5-testing-model) - [6. Deteksi Realtime](#6-deteksi-realtime) - [7. Menjalankan API Backend](#7-menjalankan-api-backend) - [8. Menjalankan Frontend](#8-menjalankan-frontend) - [API Reference](#api-reference) - [Struktur Dataset](#struktur-dataset) - [Model TCN](#model-tcn) - [Konfigurasi](#konfigurasi) --- ## πŸ“ Deskripsi Project ini merupakan aplikasi penerjemah bahasa isyarat Indonesia yang mendukung: - **BISINDO** (Bahasa Isyarat Indonesia) - **SIBI** (Sistem Isyarat Bahasa Indonesia) - **Angka** - **Kata/Kosakata** ### Teknologi yang Digunakan | Teknologi | Fungsi | |-----------|--------| | **MediaPipe Hands** | Deteksi 21 landmark tangan kiri + 21 landmark tangan kanan | | **MediaPipe Face Mesh** | Deteksi 60 landmark wajah (dagu, mulut, bibir, hidung, mata, pipi) | | **Temporal Convolutional Network (TCN)** | Klasifikasi sequence gesture | | **Flask** | Backend API server | | **React.js** | Frontend web application | --- ## ✨ Fitur - πŸŽ₯ Deteksi realtime gestur bahasa isyarat via webcam - πŸ€– Model ML untuk 4 kategori (Abjad BISINDO, Abjad SIBI, Angka, Kata) - πŸ“Š Visualisasi landmark tangan dan wajah - πŸ“– Kamus isyarat dengan video contoh - πŸ”„ Temporal smoothing untuk prediksi yang stabil - πŸ“‘ REST API untuk komunikasi frontend-backend --- ## πŸ—οΈ Arsitektur Sistem ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FRONTEND (React.js) β”‚ β”‚ http://localhost:3000 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ HTTP/JSON (Base64 Frame) β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ BACKEND (Flask API) β”‚ β”‚ http://localhost:5000 β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ /init β”‚ β”‚ /detect β”‚ β”‚ / β”‚ β”‚ β”‚ β”‚ POST β”‚ β”‚ POST β”‚ β”‚ GET β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β–Ό β–Ό β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MediaPipe β”‚ β”‚ Normalizer β”‚ β”‚ TCN Model Inference β”‚ β”‚ Detector β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - Hands β”‚ β”‚ - Translation β”‚ β”‚ - 30 Frame Window β”‚ β”‚ - Face Mesh β”‚ β”‚ - Scaling β”‚ β”‚ - Temporal Smoothingβ”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Alur Data Processing ``` Video/ webcam β”‚ β–Ό Extract Landmark (MediaPipe) β”‚ β”œβ”€β”€ 21 landmark tangan kiri β”œβ”€β”€ 21 landmark tangan kanan └── 60 landmark wajah β”‚ β–Ό Normalisasi Landmark β”‚ β”œβ”€β”€ Translation ke wrist/nose └── Scaling β”‚ β–Ό Sliding Window (30 frame, stride 5) β”‚ β–Ό Model TCN Inference β”‚ β–Ό Prediksi Label + Confidence ``` --- ## πŸ“ Struktur Direktori ``` APP BAHASA ISYARAT/ β”‚ β”œβ”€β”€ backend/ β”‚ β”‚ β”‚ β”œβ”€β”€ app.py # Flask API server β”‚ β”œβ”€β”€ requirements.txt # Dependensi Python β”‚ β”‚ β”‚ β”œβ”€β”€ dataset/ β”‚ β”‚ β”œβ”€β”€ raw/ # Dataset video mentah β”‚ β”‚ β”‚ β”œβ”€β”€ abjad_bisindo/ β”‚ β”‚ β”‚ β”œβ”€β”€ abjad_sibi/ β”‚ β”‚ β”‚ β”œβ”€β”€ angka/ β”‚ β”‚ β”‚ └── kata/ β”‚ β”‚ β”œβ”€β”€ landmark/ # Landmark hasil ekstraksi β”‚ β”‚ β”œβ”€β”€ normalized/ # Landmark hasil normalisasi β”‚ β”‚ β”œβ”€β”€ train/ # Data training (80%) β”‚ β”‚ └── test/ # Data testing (20%) β”‚ β”‚ β”‚ β”œβ”€β”€ models/ # Model TCN terlatih β”‚ β”‚ β”œβ”€β”€ abjad_bisindo/ β”‚ β”‚ β”‚ β”œβ”€β”€ model_abjad_bisindo.pt β”‚ β”‚ β”‚ └── label_encoder.json β”‚ β”‚ β”œβ”€β”€ abjad_sibi/ β”‚ β”‚ β”œβ”€β”€ angka/ β”‚ β”‚ └── kata/ β”‚ β”‚ β”‚ β”œβ”€β”€ outputs/ # Output training/testing β”‚ β”‚ β”œβ”€β”€ confusion_matrix/ β”‚ β”‚ β”œβ”€β”€ classification_report/ β”‚ β”‚ β”œβ”€β”€ accuracy/ β”‚ β”‚ └── loss/ β”‚ β”‚ β”‚ β”œβ”€β”€ realtime/ # Script deteksi realtime β”‚ β”‚ β”œβ”€β”€ realtime_abjad_bisindo.py β”‚ β”‚ β”œβ”€β”€ realtime_abjad_sibi.py β”‚ β”‚ β”œβ”€β”€ realtime_angka.py β”‚ β”‚ └── realtime_kata.py β”‚ β”‚ β”‚ β”œβ”€β”€ scripts/ # Pipeline preprocessing & training β”‚ β”‚ β”œβ”€β”€ 01_extract_landmark.py β”‚ β”‚ β”œβ”€β”€ 02_normalize_landmark.py β”‚ β”‚ β”œβ”€β”€ 03_split_dataset.py β”‚ β”‚ β”œβ”€β”€ 04_train_kata.py β”‚ β”‚ β”œβ”€β”€ 05_test_kata.py β”‚ β”‚ β”œβ”€β”€ 06_train_abjad_bisindo.py β”‚ β”‚ β”œβ”€β”€ 07_test_abjad_bisindo.py β”‚ β”‚ β”œβ”€β”€ 08_train_abjad_sibi.py β”‚ β”‚ β”œβ”€β”€ 09_test_abjad_sibi.py β”‚ β”‚ β”œβ”€β”€ 10_train_angka.py β”‚ β”‚ └── 11_test_angka.py β”‚ β”‚ β”‚ └── utils/ # Utility modules β”‚ β”œβ”€β”€ mediapipe_detector.py # MediaPipe detector β”‚ β”œβ”€β”€ normalization.py # Normalisasi landmark β”‚ β”œβ”€β”€ dataset.py # PyTorch Dataset β”‚ β”œβ”€β”€ tcn.py # Arsitektur TCN β”‚ β”œβ”€β”€ inference.py # Inference utilities β”‚ └── config.py # Konfigurasi project β”‚ └── frontend/ β”œβ”€β”€ package.json # Dependensi Node.js β”œβ”€β”€ public/ └── src/ β”œβ”€β”€ App.js # Router utama β”œβ”€β”€ index.js # Entry point └── pages/ # Halaman React β”œβ”€β”€ HomePage.jsx β”œβ”€β”€ CategoryPage.jsx β”œβ”€β”€ DetectionPage.jsx # Halaman deteksi webcam β”œβ”€β”€ DictionaryPage.jsx # Kamus isyarat β”œβ”€β”€ AngkaPage.jsx β”œβ”€β”€ SibiPage.jsx β”œβ”€β”€ BisindoPage.jsx └── KataPage.jsx ``` --- ## πŸ”§ Instalasi ### Prasyarat - Python 3.8+ - Node.js 16+ - npm atau yarn - Webcam (untuk deteksi realtime) ### 1. Setup Backend ```bash # Masuk ke direktori backend cd backend # Buat virtual environment (opsional tapi disarankan) python -m venv venv source venv/bin/activate # Linux/Mac # atau .\venv\Scripts\activate # Windows # Install dependensi pip install -r requirements.txt ``` ### 2. Setup Frontend ```bash # Masuk ke direktori frontend cd frontend # Install dependensi npm install ``` --- ## πŸ“š Library dan Dependensi ### Backend (Python) | Library | Versi Minimal | Fungsi | |---------|---------------|--------| | `numpy` | >=1.21.0 | Manipulasi array dan operasi matematika | | `torch` | >=1.10.0 | Framework deep learning | | `torchvision` | >=0.11.0 | Transformasi data PyTorch | | `mediapipe` | >=0.10.0 | Deteksi landmark tangan & wajah | | `opencv-python` | >=4.8.0 | Processing video | | `opencv-python-headless` | >=4.8.0 | OpenCV tanpa GUI | | `scikit-learn` | >=0.24.0 | Evaluasi model (confusion matrix, dll) | | `matplotlib` | >=3.7.0 | Visualisasi data | | `seaborn` | >=0.12.0 | Visualisasi statistik | | `tqdm` | >=4.65.0 | Progress bar | | `Flask` | >=2.3.0 | Web framework | | `flask-cors` | >=4.0.0 | CORS support | | `ml_dtypes` | >=0.3.0 | Dependensi MediaPipe | ### Frontend (JavaScript/React) | Library | Fungsi | |---------|--------| | `react` | UI framework | | `react-dom` | React DOM rendering | | `react-router-dom` | Routing | | `react-scripts` | Build tool (Create React App) | | `@testing-library/*` | Testing utilities | | `web-vitals` | Performance metrics | --- ## πŸ”„ Pipeline Project ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PIPELINE MACHINE LEARNING β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ Raw Video (.mp4) β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 1: Extract Landmark β”‚ β”‚ Script: 01_extract_landmark.py β”‚ β”‚ Output: dataset/landmark/ β”‚ β”‚ Input shape: (30, 306) per window β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 2: Normalize Landmark β”‚ β”‚ Script: 02_normalize_landmark.py β”‚ β”‚ Output: dataset/normalized/ β”‚ β”‚ Proses: Translation + Scaling β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 3: Split Dataset β”‚ β”‚ Script: 03_split_dataset.py β”‚ β”‚ Output: dataset/train/ & dataset/test/ β”‚ β”‚ Rasio: 80% train, 20% test β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 4: Training TCN β”‚ β”‚ Scripts: 04-11_train_*.py β”‚ β”‚ Output: models/{category}/model_*.pt β”‚ β”‚ Output: models/{category}/label_encoder β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 5: Testing Model β”‚ β”‚ Scripts: 05-11_test_*.py β”‚ β”‚ Output: Confusion Matrix, Classificationβ”‚ β”‚ Report, Accuracy, F1-Score β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Tahap 6: Realtime Detection β”‚ β”‚ Scripts: realtime/*.py β”‚ β”‚ Input: Webcam β”‚ β”‚ Output: Prediksi real-time β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸ“– Penggunaan ### 1. Ekstraksi Landmark Ekstrak landmark dari video menggunakan MediaPipe. ```bash cd backend # Ekstrak semua kategori python scripts/01_extract_landmark.py # Ekstrak kategori tertentu python scripts/01_extract_landmark.py --categories abjad_bisindo angka # Custom parameter python scripts/01_extract_landmark.py --window-size 30 --stride 5 ``` **Parameter:** | Parameter | Default | Deskripsi | |-----------|---------|-----------| | `--input` | `dataset/raw/` | Direktori video mentah | | `--output` | `dataset/landmark/` | Direktori output landmark | | `--categories` | Semua | Kategori yang diproses | | `--window-size` | 30 | Jumlah frame per window | | `--stride` | 5 | Step size sliding window | --- ### 2. Normalisasi Landmark Normalisasi koordinat landmark untuk konsistensi. ```bash cd backend # Normalisasi semua kategori python scripts/02_normalize_landmark.py # Custom input/output python scripts/02_normalize_landmark.py --input dataset/landmark --output dataset/normalized ``` --- ### 3. Split Dataset Bagi dataset menjadi training (80%) dan testing (20%). ```bash cd backend # Split semua kategori python scripts/03_split_dataset.py # Custom rasio python scripts/03_split_dataset.py --train-ratio 0.8 # Split kategori tertentu python scripts/03_split_dataset.py --categories abjad_bisindo kata ``` --- ### 4. Training Model Latih model TCN untuk setiap kategori. ```bash cd backend # Training model kata python scripts/04_train_kata.py # Training model abjad BISINDO python scripts/06_train_abjad_bisindo.py # Training model abjad SIBI python scripts/08_train_abjad_sibi.py # Training model angka python scripts/10_train_angka.py # Custom parameter training python scripts/04_train_kata.py --epochs 100 --batch-size 32 --lr 0.001 ``` **Parameter Training:** | Parameter | Default | Deskripsi | |-----------|---------|-----------| | `--epochs` | 100 | Jumlah epoch | | `--batch-size` | 32 | Batch size | | `--lr` | 0.001 | Learning rate | | `--data-dir` | `dataset/` | Direktori dataset | | `--model-dir` | `models/` | Direktori output model | **Output Training:** ``` models/{category}/ β”œβ”€β”€ model_{category}.pt # Model PyTorch β”œβ”€β”€ label_encoder.json # Mapping label ke index └── history.json # History training ``` --- ### 5. Testing Model Evaluasi model menggunakan data test. ```bash cd backend # Test model kata python scripts/05_test_kata.py # Test model abjad BISINDO python scripts/07_test_abjad_bisindo.py # Test model abjad SIBI python scripts/09_test_abjad_sibi.py # Test model angka python scripts/11_test_angka.py ``` **Output Testing:** ``` outputs/ β”œβ”€β”€ confusion_matrix/ β”‚ └── {category}_confusion_matrix.png β”œβ”€β”€ classification_report/ β”‚ └── {category}_classification_report.txt └── {category}_test_results.json ``` **Metrik Evaluasi:** - Accuracy - Precision - Recall - F1-Score - Confusion Matrix --- ### 6. Deteksi Realtime Jalankan deteksi realtime menggunakan webcam (tanpa frontend). ```bash cd backend # Deteksi kata python realtime/realtime_kata.py # Deteksi abjad BISINDO python realtime/realtime_abjad_bisindo.py # Deteksi abjad SIBI python realtime/realtime_abjad_sibi.py # Deteksi angka python realtime/realtime_angka.py # Custom camera index python realtime/realtime_kata.py --camera 0 ``` **Kontrol Keyboard:** | Key | Fungsi | |-----|--------| | `q` | Quit | | `r` | Reset buffer | | `l` | Toggle landmark visibility | --- ### 7. Menjalankan API Backend Jalankan Flask API server untuk komunikasi dengan frontend. ```bash cd backend # Jalankan server python app.py ``` Server akan berjalan di `http://localhost:5000` **Endpoints:** | Endpoint | Method | Deskripsi | |----------|--------|-----------| | `/` | GET | Status server | | `/init` | POST | Inisialisasi session model | | `/detect` | POST | Proses frame dan prediksi | --- ### 8. Menjalankan Frontend Jalankan aplikasi React. ```bash cd frontend # Development mode npm start # Production build npm run build ``` Frontend akan berjalan di `http://localhost:3000` --- ## πŸ”Œ API Reference ### GET / Cek status server. **Response:** ```json { "status": "online", "message": "Backend Penerjemah Bahasa Isyarat Indonesia (TCN) Siap!", "categories": ["abjad_bisindo", "abjad_sibi", "angka", "kata"], "endpoints": { "/init": "POST - Inisialisasi session model", "/detect": "POST - Kirim frame base64 dan dapatkan prediksi" } } ``` ### POST /init Inisialisasi session inferensi untuk kategori tertentu. **Request Body:** ```json { "category": "kata" } ``` **Response:** ```json { "session_id": "uuid-string", "category": "kata", "status": "ready" } ``` **Kategori Valid:** - `abjad_bisindo` - `abjad_sibi` - `angka` - `kata` ### POST /detect Kirim frame webcam dan dapatkan prediksi. **Request Body:** ```json { "session_id": "uuid-string", "frame": "data:image/jpeg;base64,..." } ``` **Response:** ```json { "label": "halo", "confidence": 0.95, "buffer_size": 30, "window_size": 30 } ``` --- ## πŸ“‚ Struktur Dataset ### Format Dataset Raw ``` dataset/raw/ β”œβ”€β”€ abjad_bisindo/ β”‚ β”œβ”€β”€ A/ β”‚ β”‚ β”œβ”€β”€ video1.mp4 β”‚ β”‚ └── video2.mp4 β”‚ β”œβ”€β”€ B/ β”‚ β”‚ └── ... β”‚ └── ... β”œβ”€β”€ abjad_sibi/ β”‚ └── ... β”œβ”€β”€ angka/ β”‚ β”œβ”€β”€ 0/ β”‚ β”œβ”€β”€ 1/ β”‚ └── ... └── kata/ β”œβ”€β”€ halo/ β”œβ”€β”€ terima_kasih/ └── ... ``` ### Format Landmark ``` dataset/landmark/ β”œβ”€β”€ abjad_bisindo/ β”‚ β”œβ”€β”€ A/ β”‚ β”‚ β”œβ”€β”€ video1_w0.npy # Window 0 β”‚ β”‚ β”œβ”€β”€ video1_w1.npy # Window 1 β”‚ β”‚ └── ... β”‚ └── ... └── ... ``` ### Shape Data | Tahap | Shape | Deskripsi | |-------|-------|-----------| | Raw Video | (N, H, W, 3) | N frame | | Landmark | (window, 306) | 30 frame Γ— 306 fitur | | Normalized | (window, 306) | Setelah normalisasi | **Detail Feature Size (306):** - Tangan kiri: 21 Γ— 3 = 63 - Tangan kanan: 21 Γ— 3 = 63 - Wajah: 60 Γ— 3 = 180 - **Total: 306** --- ## 🧠 Model TCN ### Arsitektur ``` TCNClassifier( β”œβ”€β”€ TemporalConvNet β”‚ β”œβ”€β”€ TemporalBlock (dilation 1) β”‚ β”œβ”€β”€ TemporalBlock (dilation 2) β”‚ └── TemporalBlock (dilation 4) β”‚ └── FC Layers β”œβ”€β”€ Linear(256, 512) β”œβ”€β”€ ReLU() β”œβ”€β”€ Dropout(0.2) └── Linear(512, num_classes) ) ``` ### Hyperparameter Default | Parameter | Nilai | |-----------|-------| | Input Size | 306 | | Hidden Channels | [64, 128, 256] | | Kernel Size | 3 | | Dropout | 0.2 | | FC Hidden Size | 512 | | Window Size | 30 | --- ## βš™οΈ Konfigurasi Konfigurasi utama ada di `backend/utils/config.py`: ```python # Paths BASE_DIR = Path(__file__).parent.parent DATASET_DIR = BASE_DIR / "dataset" MODEL_DIR = BASE_DIR / "models" # Categories CATEGORIES = ["abjad_bisindo", "abjad_sibi", "angka", "kata"] # Sliding Window WINDOW_SIZE = 30 STRIDE = 5 # Feature Configuration NUM_HAND_LANDMARKS = 21 NUM_FACE_LANDMARKS = 60 FEATURE_SIZE = 306 # 63 + 63 + 180 # Training BATCH_SIZE = 32 EPOCHS = 100 LEARNING_RATE = 0.001 TRAIN_RATIO = 0.8 # Session SESSION_TIMEOUT_SECONDS = 600 # 10 menit ``` --- ## πŸ“Œ Catatan Penting ### Persyaratan Video - Format: `.mp4` - Durasi minimum: 30 frame (untuk window size 30) - Disarankan: 60-90 frame per video ### GPU Acceleration Model akan otomatis menggunakan GPU jika tersedia: ```python device = 'cuda' if torch.cuda.is_available() else 'cpu' ``` ### Session Management - Session akan expire setelah 10 menit tidak aktif - Frontend akanauto-reconnect saat session expired --- ## πŸ› Troubleshooting ### Error: "ModuleNotFoundError" ```bash pip install -r requirements.txt ``` ### Error: "Camera not found" ```python # Ganti camera index di realtime script cap = cv2.VideoCapture(0) # Coba 0, 1, 2... ``` ### Error: "Model not found" Pastikan model sudah dilatih: ```bash python scripts/04_train_kata.py ``` ### Frontend tidak connect ke Backend 1. Pastikan backend running di port 5000 2. Cek CORS settings di `app.py` 3. Pastikan URL di frontend sesuai --- ## πŸ“„ Lisensi Project ini adalah bagian dari Tugas Akhir (TA) - Aplikasi Penerjemah Bahasa Isyarat Indonesia. --- ## πŸ‘¨β€πŸ’» Kontribusi Project ini dikembangkan menggunakan: - MediaPipe (Google) - PyTorch - Flask - React.js