Aplikasi Flutter yang memakai YOLO (TensorFlow Lite) secara lokal di perangkat (edge computing) untuk mengenali objek lewat kamera dan mengklasifikasikannya ke dalam 3 kategori sampah Indonesia:
| Kategori | Warna | Contoh |
|---|---|---|
| Organik | hijau | sisa makanan, buah, sayur |
| Anorganik | biru | plastik, kaca, kertas, logam |
| B3 (Bahan Berbahaya & Beracun) | merah | elektronik, baterai, bola lampu |
Tidak ada data yang dikirim ke server — inferensi 100% di HP.
lib/
├── main.dart # entry point + enumerasi kamera
├── models/
│ ├── detection.dart # representasi 1 hasil deteksi
│ └── waste_category.dart # enum 3 kategori + mapping label → kategori
├── services/
│ └── yolo_detector.dart # load TFLite, letterbox, NMS, post-process
├── utils/
│ └── image_converter.dart # YUV420/BGRA → image.Image
├── widgets/
│ ├── bounding_box_painter.dart
│ └── category_legend.dart
└── screens/
├── home_screen.dart # landing page + legend
└── camera_screen.dart # live kamera + overlay deteksi
flutter pub getKamu wajib menambahkan file model TFLite sendiri — file ini tidak ikut dalam repository karena ukurannya besar.
Cara paling cepat (Python 3.10+):
pip install ultralyticsfrom ultralytics import YOLO
YOLO("yolov8n.pt").export(format="tflite", imgsz=640)Salin hasilnya:
runs/detect/.../weights/yolov8n_float32.tflite
↓
assets/models/yolov8n_float32.tflite
Detail lebih lengkap (termasuk cara training custom dataset sampah) ada
di assets/models/README.md.
flutter runMinimal Android SDK 24. Hidupkan USB debugging atau jalankan di emulator dengan kamera virtual aktif.
- Camera plugin men-stream frame dari kamera belakang dalam format YUV420.
- Tiap frame dikonversi ke RGB pakai
image_converter.dart. - Frame di-letterbox ke 640×640 (jaga aspect ratio, padding abu-abu) dan dinormalisasi 0..1.
- TFLite Interpreter (
tflite_flutter) menjalankan inferensi — output: tensor[1, 84, 8400]. - Output di-decode (cx,cy,w,h → x1,y1,x2,y2), difilter dengan confidence threshold, lalu di-NMS untuk membuang box duplikat.
- Setiap label COCO (mis.
bottle,apple,cell phone) dipetakan ke Organik / Anorganik / B3 lewat tabel diwaste_category.dart. - Bounding box digambar di atas
CameraPreviewdenganCustomPainter.
- Ganti threshold: edit
confidenceThreshold&iouThresholddiYoloDetector()(default 0.35 dan 0.45). - Tambah/ubah kelas sampah: edit map
_labelToCategorydilib/models/waste_category.dart. - Pakai model custom: ekspor
.tflitekamu, taruh diassets/models/, dan gantimodelAsset/labelsAssetdi constructorYoloDetector.
- Resolusi kamera dipasang
ResolutionPreset.mediumuntuk seimbang antara akurasi dan FPS. - Frame baru di-drop selama frame sebelumnya masih diproses
(lihat
_isDetectingdicamera_screen.dart) — mencegah backlog. - Untuk meningkatkan FPS, kamu bisa: pakai model
yolov8n(sudah default), ekspor model keint8quantization, atau pindahkan preprocessing keIsolate(TODO).
Lisensi model dan label mengikuti lisensi Ultralytics YOLO & dataset COCO. Kode aplikasi ini bebas dipakai untuk keperluan tugas / pembelajaran.