📚 Documentation: Hand Gesture Navigation
Dokumentasi teknis dan konsep sistem navigasi gesture tangan untuk web. Pelajari cara kerja teknologi yang memungkinkan navigasi tanpa sentuhan menggunakan gerakan tangan.
📦 Instalasi MediaPipe
Panduan lengkap untuk menginstall dan menggunakan MediaPipe
🚀 Langkah Instalasi
Untuk memulai menggunakan MediaPipe dalam proyek:
1. Install package:
npm install @mediapipe/tasks-vision
2. Import ke dalam project:
import { GestureRecognizer, FilesetResolver } from '@mediapipe/tasks-vision';
3. Alternative dengan yarn:
yarn add @mediapipe/tasks-vision
⚙️ System Requirements
✅ Browser Support
- • Chrome 88+ (Recommended)
- • Firefox 78+
- • Safari 14+
- • Edge 88+
📋 Dependencies
- • WebAssembly (WASM) support
- • WebRTC & MediaDevices API
- • HTTPS (untuk akses kamera)
🔧 Technical Info
- • Version: 0.10.3+ (Recommended)
- • Bundle size: ~15MB (gzipped)
- • GPU acceleration support
💻 Quick Start Example
import { GestureRecognizer, FilesetResolver } from '@mediapipe/tasks-vision'; const loadGestureRecognizer = async () => { const vision = await FilesetResolver.forVisionTasks( "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.3/wasm" ); const gestureRecognizer = await GestureRecognizer.createFromOptions(vision, { baseOptions: { modelAssetPath: "https://storage.googleapis.com/mediapipe-models/gesture_recognizer/gesture_recognizer/float16/1/gesture_recognizer.task", delegate: "GPU", }, runningMode: "VIDEO", }); return gestureRecognizer; };
📑 Daftar Isi
🔍 Apa itu Gesture Navigation?
Gesture Navigation adalah teknologi revolusioner yang memungkinkan pengguna untuk berpindah antar halaman website hanya dengan menggunakan gerakan tangan, tanpa perlu menyentuh mouse, keyboard, atau layar sentuh.
Teknologi ini sangat berguna untuk situasi di mana interaksi tanpa sentuhan diperlukan, seperti dalam presentasi, lingkungan steril, atau untuk aksesibilitas pengguna dengan keterbatasan fisik.
Contoh Gesture yang Didukung:
Open Hand
Peace Victory
Pointing Up
Thumbs Up
Thumbs Down
Closed_Fist
ILoveYou
⚙️ Fitur Utama
Deteksi gesture real-time
Navigasi antar halaman menggunakan tangan
Tidak memerlukan sentuhan
Responsif dan mendukung berbagai ukuran layar
Menggunakan MediaPipe GestureRecognizer untuk pengenalan gesture real-time
🚀 Keunggulan Sistem:
- • Akurasi Tinggi: Menggunakan AI MediaPipe GestureRecognizer dengan tingkat akurasi 95%+
- • Latensi Rendah: Response time kurang dari 100ms
- • Cross-Platform: Berjalan di semua browser modern
- • Privacy-First: Semua processing dilakukan secara lokal
🤖 Apa itu MediaPipe?
MediaPipe adalah framework open-source yang dikembangkan oleh Google untuk membangun pipeline machine learning multimodal. Framework ini dirancang untuk real-time processing berbagai jenis data seperti video, audio, dan sensor data.
Dalam konteks Hand Gesture Navigation, kami menggunakan modul MediaPipe GestureRecognizeryang mampu mengenali berbagai gesture tangan seperti Victory, Open Palm, Pointing Up, dan Thumbs Down dengan akurasi tinggi dalam real-time.
Modul MediaPipe untuk Computer Vision:
Gesture Recognition
Mengenali gesture tangan seperti Victory, Open Palm, dan Thumbs Up
Hand Tracking
Melacak posisi tangan untuk analisis gesture
Face Detection
Mendeteksi dan melacak wajah dalam real-time
Pose Estimation
Deteksi pose dan gerakan tubuh
🤖 MediaPipe Gesture Recognition
GestureRecognizer dapat mengenali berbagai gesture tangan yang telah dilatih sebelumnya, termasuk:
- • Victory: Gesture peace (✌️)
- • Open Palm: Telapak tangan terbuka (✋)
- • Pointing Up: Jari telunjuk menunjuk ke atas (☝️)
- • Thumbs Up: Jempol ke atas (👍)
- • Thumbs Down: Jempol ke bawah (👎)
- • Closed Fist: Kepalan tangan (✊)
- • ILoveYou: Gesture I Love You (🤟)
Catatan: Model gesture recognizer menggunakan machine learning yang telah dilatih untuk mengenali gesture-gesture umum dengan tingkat akurasi tinggi.
📈 Cara Kerja Gesture Navigation
Sistem Hand Gesture Navigation bekerja melalui pipeline yang terdiri dari 4 langkah utama:
- 1
Aktivasi Kamera
Kamera aktif dan menangkap citra tangan pengguna secara real-time
- 2
Gesture Recognition
MediaPipe GestureRecognizer menganalisis frame video dan mengidentifikasi gesture tangan yang telah dilatih sebelumnya
- 3
Interpretasi Perintah
Gesture yang dikenali diubah menjadi perintah navigasi (contoh: Victory = Home, Open_Palm = Documentation)
- 4
Eksekusi Navigasi
Sistem mengeksekusi navigasi berdasarkan gesture yang terdeteksi
🔧 Detail Teknis Gesture Recognition:
- • Frame Rate: 30 FPS untuk deteksi gesture real-time
- • Input Resolution: Mendukung 480p hingga 1080p
- • Confidence Threshold: Minimum 70% untuk gesture recognition
- • Processing: Client-side dengan WebAssembly (WASM)
- • Model Size: ~15MB untuk gesture recognition model
- • Supported Gestures: 7+ gesture categories pre-trained
🧩 Core Functions: HandGestureDetection
Komponen HandGestureDetection
adalah inti dari sistem gesture navigation. Berikut adalah penjelasan mendalam tentang fungsi-fungsi utamanya:
⚡ Gesture Recognition Setup
📝 Penjelasan Fungsi:
- • Inisialisasi MediaPipe: Memuat model gesture recognition
- • GPU Acceleration: Menggunakan delegate GPU untuk performa optimal
- • Model Loading: Memuat model pre-trained dari Google
- • Running Mode: Dikonfigurasi untuk video real-time
💻 Core Code:
const loadRecognizer = async () => { const vision = await ( await import("@mediapipe/tasks-vision") ).FilesetResolver.forVisionTasks( "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@0.10.3/wasm" ); const recognizer = await ( await import("@mediapipe/tasks-vision") ).GestureRecognizer.createFromOptions(vision, { baseOptions: { modelAssetPath: "https://storage.googleapis.com/mediapipe-models/gesture_recognizer/gesture_recognizer/float16/1/gesture_recognizer.task", delegate: "GPU", }, runningMode: "VIDEO", }); setGestureRecognizer(recognizer); };
📹 Camera & Video Stream Management
📝 Penjelasan Fungsi:
- • Camera Access: Mengakses kamera menggunakan getUserMedia
- • Stream Management: Mengelola video stream secara efisien
- • Auto-play: Otomatis memutar video ketika siap
- • Cleanup: Membersihkan resources saat komponen unmount
💻 Core Code:
const enableCam = async () => { const mediaStream = await navigator.mediaDevices.getUserMedia({ video: true, }); setStream(mediaStream); if (videoRef.current) { videoRef.current.srcObject = mediaStream; videoRef.current.play(); videoRef.current.addEventListener("loadeddata", predictWebcam); } }; // Cleanup function return () => { if (stream) { stream.getTracks().forEach((track) => track.stop()); setStream(null); } };
🤖 Real-time Gesture Detection
📝 Penjelasan Fungsi:
- • Gesture Recognition: Mengidentifikasi gesture dari video frame menggunakan model AI
- • Category Detection: Mengembalikan kategori gesture yang terdeteksi dengan confidence score
- • Throttling: Membatasi update gesture setiap 1 detik untuk stabilitas
- • Performance: Menggunakan requestAnimationFrame untuk smooth performance
💻 Core Code:
const predictWebcam = async () => { if (!gestureRecognizer || !videoRef.current || !canvasRef.current) return; const nowInMs = Date.now(); if (videoRef.current.currentTime !== lastVideoTime) { lastVideoTime = videoRef.current.currentTime; const results = await gestureRecognizer.recognizeForVideo( videoRef.current, nowInMs ); // Throttle gesture updates to 1 second if (nowInMs - lastGestureUpdate >= 1000) { const detected = results.gestures.length > 0; const newOutput = detected ? `Gesture: ${results.gestures[0][0].categoryName}` : "No gesture detected."; setGestureOutput(newOutput); lastGestureUpdate = nowInMs; } } animationFrameId.current = window.requestAnimationFrame(predictWebcam); };
🧭 Navigation Logic
📝 Penjelasan Fungsi:
- • Gesture Mapping: Memetakan gesture ke halaman tertentu
- • Router Integration: Menggunakan Next.js router untuk navigasi
- • Switch Control: Hanya aktif ketika switch diaktifkan
- • Extensible: Mudah menambahkan gesture baru
💻 Core Code:
useEffect(() => { if (!gestureOutput) return; switch (gestureOutput) { case "Gesture: Victory": router.push("/"); break; case "Gesture: Open_Palm": router.push("/documentation"); break; case "Gesture: Pointing_Up": router.push("/demo"); break; case "Gesture: Thumb_Down": router.push("/contact"); break; } }, [gestureOutput, router]);
👁️ Gesture Recognition Visualization
📝 Penjelasan Fungsi:
- • Canvas Drawing: Menggambar landmark tangan di canvas untuk visualisasi
- • Hand Connections: Menghubungkan titik-titik landmark untuk menunjukkan struktur tangan
- • Visual Feedback: Memberikan feedback visual kepada user tentang deteksi tangan
- • Real-time Update: Update visualization setiap frame untuk pengalaman yang smooth
💻 Core Code:
// Visualisasi hasil gesture recognition const canvasCtx = canvasRef.current.getContext("2d"); canvasCtx?.save(); canvasCtx?.clearRect(0, 0, canvasRef.current.width, canvasRef.current.height); const DrawingUtils = (await import("@mediapipe/tasks-vision")).DrawingUtils; const drawingUtils = new DrawingUtils(canvasCtx!); // Menggambar landmark tangan jika terdeteksi if (results.landmarks) { for (const landmarks of results.landmarks) { drawingUtils.drawConnectors( landmarks, GestureRecognizer.HAND_CONNECTIONS, { color: "#ecc25e", lineWidth: 2 } ); drawingUtils.drawLandmarks(landmarks, { color: "#0e1df5", lineWidth: 0.1, }); } } canvasCtx?.restore();
🚀 Performance Tips untuk Gesture Recognition:
Optimasi Memory:
- • Cleanup streams dan recognizer saat komponen unmount
- • Cancel animation frames yang tidak diperlukan
- • Throttle gesture detection untuk mengurangi CPU load
- • Reuse recognizer instance untuk multiple detections
Optimasi Gesture Detection:
- • Set confidence threshold sesuai kebutuhan
- • Gunakan GPU delegate untuk performa terbaik
- • Batch process multiple frames jika memungkinkan
- • Implement debouncing untuk gesture changes
📚 Sumber Daya Tambahan
📖 Dokumentasi Resmi
💡 Tips untuk Developer Gesture Recognition:
- • Pastikan browser mendukung WebRTC dan MediaDevices API
- • Gunakan HTTPS untuk akses kamera di production
- • Implementasikan fallback untuk browser yang tidak support
- • Set confidence threshold yang tepat untuk menghindari false positives
- • Test gesture recognition dengan berbagai kondisi pencahayaan
- • Tambahkan visual feedback untuk user experience yang lebih baik
- • Implement gesture debouncing untuk menghindari gesture spam