RootFacts - AI Vegetable Detector
Aplikasi PWA deteksi sayuran secara real-time menggunakan TensorFlow.js dan Transformers.js dengan fun fact berbasis AI
reactvitetensorflow.jstransformers.jspwacomputer-vision
Bagikan proyek ini:
Tentang Proyek
🥦 RootFacts - Detektor Sayuran AI

Aplikasi Progressive Web App yang mendeteksi sayuran secara real-time menggunakan TensorFlow.js (Computer Vision) dan menghasilkan fun fact tentang sayuran tersebut menggunakan Transformers.js (Generative AI) — semuanya berjalan 100% di browser, tanpa server.
👨💻 Pengembang
| Nama |
|---|
| Daffa |
🧠 Deskripsi
RootFacts adalah aplikasi AI berbasis browser yang menggabungkan dua kemampuan machine learning:
- Computer Vision — Mengidentifikasi 18 jenis sayuran dari kamera menggunakan model Teachable Machine yang ditenagai TensorFlow.js
- Generative AI — Menghasilkan fun fact tentang sayuran yang terdeteksi menggunakan model bahasa Flan-T5 via Transformers.js
- PWA Offline-First — Bisa digunakan sepenuhnya secara offline setelah pemuatan awal berkat caching service worker
Sayuran yang Dapat Dideteksi (18 Kelas)
| 🫱 Beetroot | 🌶️ Paprika | 🥬 Kubis | 🥕 Wortel |
| 🥦 Kembang Kol | 🌶️ Cabai | 🌽 Jagung | 🥒 Mentimun |
| 🍆 Terong | 🧄 Bawang Putih | 🫚 Jahe | 🥬 Selada |
| 🧅 Bawang Bombay | 🫛 Kacang Polong | 🥔 Kentang | 🫱 Lobak |
| 🫘 Kedelai | 🥬 Bayam |
⚙️ Teknologi yang Digunakan
AI & Machine Learning
- TensorFlow.js
v4.22— Inferensi ML di perangkat dengan backend adaptif (WebGPU → WebGL fallback) - Transformers.js
v3.8— Model Hugging Face di browser (WebGPU → WASM fallback) - Teachable Machine — Model klasifikasi gambar (berbasis MobileNet)
- Xenova/flan-t5-small — Model generasi teks terkuantisasi (
q4dtype)
Frontend
- React
v19— Framework UI - Vite
v6— Build tool dan dev server - Lucide React — Sistem ikon
- CSS3 — Styling modern dengan glassmorphism dan animasi
PWA & Offline
- vite-plugin-pwa — Pembuatan service worker otomatis
- Workbox — Strategi precaching dan runtime caching
🚀 Memulai
Prasyarat
- Node.js 18+ dan npm terinstal
- Perangkat dengan webcam (atau kamera smartphone)
- Browser modern dengan dukungan WebGPU atau WebGL
Instalasi
# Clone repositori
git clone <repo-url>
cd submission
# Instal dependensi
npm install
# Jalankan server pengembangan
npm run dev
Aplikasi akan berjalan di:
http://localhost:3001
Build Produksi
npm run build
npm run preview
🧩 Struktur Proyek
submission/
├── public/
│ ├── model/
│ │ ├── model.json # Topologi model TF.js
│ │ ├── metadata.json # Label & konfigurasi (18 kelas)
│ │ └── weights.bin # Bobot model
│ ├── icons/
│ │ ├── icon-192x192.png # Ikon PWA
│ │ ├── icon-512x512.png # Ikon PWA
│ │ └── apple-touch-icon.png # Ikon iOS
│ └── favicon.ico
│
├── src/
│ ├── components/
│ │ ├── Header.jsx # Header aplikasi dengan status model
│ │ ├── CameraSection.jsx # Feed kamera, kontrol & pengaturan
│ │ └── InfoPanel.jsx # Hasil deteksi & fun fact
│ ├── hooks/
│ │ └── useAppState.js # Manajemen state global (useReducer)
│ ├── services/
│ │ ├── DetectionService.js # Pemuatan model TF.js & prediksi
│ │ ├── CameraService.js # Manajemen stream kamera WebRTC
│ │ └── RootFactsService.js # Generasi teks Transformers.js
│ ├── utils/
│ │ └── config.js # Konfigurasi, tone, threshold
│ ├── App.jsx # Aplikasi utama dengan loop deteksi
│ ├── main.jsx # Entry point
│ └── index.css # Styles global
│
├── index.html # Template HTML dengan meta tag PWA
├── vite.config.js # Konfigurasi Vite + plugin PWA
├── package.json
├── STUDENT.txt # URL deployment
├── README.md # Versi Inggris
└── README.id.md # File ini (Bahasa Indonesia)
🧠 Cara Kerja
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐
│ Kamera │───▶│ TensorFlow.js │───▶│ Transformers.js │
│ Stream │ │ (Deteksi) │ │ (Generasi Fakta) │
└─────────────┘ └──────────────────┘ └───────────────────┘
│ │ │
getUserMedia() predict() dengan generateFacts() dengan
WebRTC API await data() (async) Flan-T5-small (q4)
Disposal tensor Prompt berbasis tone
manual (lucu/profesional/
WebGPU → WebGL santai/normal)
- Pemuatan Model — Kedua model AI dimuat secara paralel saat aplikasi dimulai
- Aktivasi Kamera — Pengguna mengetuk "Mulai Scan" untuk memulai stream kamera WebRTC
- Deteksi Real-time — Frame ditangkap dan diberikan ke TensorFlow.js setiap 100ms
- Pengecekan Kepercayaan — Hanya deteksi di atas 70% yang diterima
- Generasi Fun Fact — Nama sayuran dikirim ke Flan-T5 dengan prompt berbasis tone
- Tampilkan Hasil — Nama sayuran, bar kepercayaan, dan fun fact ditampilkan
- Salin & Bagikan — Pengguna dapat menyalin fun fact ke clipboard
✨ Fitur
🎯 Computer Vision
- Backend Adaptif — WebGPU (tercepat) dengan fallback WebGL
- Inferensi Async — Menggunakan
await tensor.data()untuk kompatibilitas WebGPU - Manajemen Memori — Disposal tensor secara manual (tanpa kebocoran memori)
- Deteksi 18 Kelas — Mengenali berbagai jenis sayuran
- Threshold Konfigurabel — Minimum kepercayaan 70%
🤖 Generative AI
- Generasi Teks di Perangkat — Tidak perlu panggilan API
- 4 Mode Nada — Normal, Lucu, Profesional, Santai
- Model Terkuantisasi — dtype
q4untuk pemuatan cepat dan ukuran kecil - Backend Adaptif — WebGPU dengan fallback WASM
📱 PWA & Offline
- Dapat Diinstal — Tambahkan ke layar utama di ponsel
- Dukungan Offline — Service worker meng-cache semua aset
- Caching Model — File model TF.js di-precache via Workbox
- Runtime Caching — Unduhan model Hugging Face di-cache untuk penggunaan offline
🎨 UI/UX
- Desain Mobile-first — Dioptimalkan untuk penggunaan smartphone
- Feed Kamera Real-time — Streaming video yang mulus
- State Loading — Feedback jelas saat pemuatan model dan analisis
- Salin ke Clipboard — Berbagi fun fact dengan satu ketukan
- Kontrol FPS — Frame rate yang dapat disesuaikan (15-60 FPS)
- Pergantian Kamera — Toggle kamera depan/belakang
🎮 Panduan Penggunaan
- Buka aplikasi dan tunggu status "Model AI Siap" muncul
- Ketuk tombol scan (lingkaran hijau) untuk memulai kamera
- Arahkan ke sayuran — aplikasi mendeteksinya secara otomatis
- Baca fun fact yang dihasilkan tentang sayuran yang terdeteksi
- Ubah nada — pilih antara lucu, profesional, santai, atau normal
- Salin fakta — ketuk tombol salin untuk berbagi dengan teman
- Hentikan scan — ketuk tombol lagi untuk berhenti
🔧 Konfigurasi
Threshold Deteksi
Di src/utils/config.js:
export const APP_CONFIG = {
detectionConfidenceThreshold: 70, // Kepercayaan minimum (0-100)
analyzingDelay: 2000, // Delay sebelum membuat fakta
factsGenerationDelay: 2000, // Delay setelah fakta dihasilkan
detectionRetryInterval: 100 // Interval loop deteksi (ms)
};
Mode Nada
export const TONE_CONFIG = {
availableTones: [
{ value: 'normal', label: 'Normal' },
{ value: 'funny', label: 'Lucu' },
{ value: 'professional', label: 'Profesional' },
{ value: 'casual', label: 'Santai' }
]
};
Ganti Model AI
Di src/services/RootFactsService.js:
// Ganti dengan model text2text Hugging Face lainnya
this.generator = await pipeline('text2text-generation', 'Xenova/flan-t5-small', {
dtype: 'q4',
device: this.currentBackend
});
🐛 Pemecahan Masalah
Kamera Tidak Berfungsi
- Periksa izin browser untuk akses kamera
- Di desktop: aplikasi otomatis fallback ke
{ video: true }jikafacingModegagal - Pastikan menggunakan HTTPS atau localhost (kamera membutuhkan konteks aman)
Pemuatan Model Lambat
- Pemuatan pertama mengunduh 100MB+ data model
- Pemuatan berikutnya menggunakan cache browser (jauh lebih cepat)
- Cek tab Network di DevTools untuk progres unduhan
Peringatan WebGPU
"The powerPreference option is currently ignored"— Aman diabaikan, bug Chrome"Some nodes were not assigned to preferred execution providers"— Perilaku normal ONNX Runtime
Tidak Ada Deteksi
- Pastikan pencahayaan yang baik
- Pegang sayuran dengan jelas di depan kamera
- Periksa apakah sayuran termasuk dalam 18 kelas yang didukung
📝 Lisensi
Proyek ini bersifat open source dan tersedia untuk tujuan edukasi.
🤝 Kontribusi
Kontribusi, isu, dan permintaan fitur sangat diterima!
🙏 Penghargaan
- TensorFlow.js — Inferensi ML berbasis browser
- Hugging Face Transformers.js — Model bahasa di perangkat
- Google Teachable Machine — Pelatihan model yang mudah
- Vite — Build tool super cepat
- Workbox — Tooling service worker
Dibuat dengan ❤️ menggunakan TensorFlow.js & Transformers.js