Memuat
Project
  • Machine Learning
  • Tanggal:   Mei 2026

Edelweiss Detection: Deteksi Kesehatan Edelweis Jawa

Sampul project Edelweiss Detection: Deteksi Kesehatan Edelweis Jawa

Sistem web yang mengenali bunga Edelweis Jawa di dalam foto lalu menentukan fase kesehatannya, untuk pendaki dan peneliti yang memantau tanaman endemik pegunungan.

Landing (desktop)
Deteksi hasil (desktop)

Latar Belakang

Edelweis Jawa (Anaphalis javanica) tumbuh di jalur pendakian gunung-gunung Indonesia dan statusnya dilindungi. Masalahnya, memantau kondisi tanaman ini butuh mata yang terlatih. Satu rumpun bisa berisi bunga yang masih kuncup, yang sedang mekar, yang bijinya mulai matang, sampai tunas baru hasil regenerasi. Pendaki yang tiap akhir pekan melewati habitatnya justru paling sering melihat tanaman ini, tapi paling jarang bisa membedakan fase-fase tadi.

Saya mengerjakan sistem ini sebagai skripsi di Universitas Nusa Putra. Idenya sederhana: kalau pendaki sudah pasti membawa kamera ponsel, kenapa tidak sekalian dipakai untuk mencatat kondisi Edelweis.

Solusi

Sistemnya terdiri dari dua bagian yang berjalan terpisah. Laravel mengurus web dan data, service Python mengurus model. Saat pengguna mengunggah foto, Laravel meneruskan file ke FastAPI, YOLOv11 mencari posisi setiap bunga di gambar, tiap kotak hasil deteksi dipotong, lalu MLP menentukan fase kesehatannya. Hasilnya kembali sebagai JSON berisi koordinat kotak, label, dan dua nilai keyakinan (dari YOLO dan dari MLP). Browser menggambar ulang kotak itu di atas foto dengan warna sesuai fase.

Pemisahan dua tahap ini disengaja. YOLO bagus mencari posisi, tapi kurang teliti membedakan fase yang bentuknya mirip. Jadi klasifikasi saya pindahkan ke MLP yang dilatih khusus untuk itu. Input MLP bukan piksel mentah, melainkan vektor 64 dimensi berisi histogram HSV, histogram gradien Sobel, dan statistik warna dari potongan gambar. Modelnya jadi ringan, dan itu penting karena service ini berjalan di container dengan batas memori 1,5 GB tanpa GPU.

Fitur Utama

  • Deteksi dari unggahan gambar maupun kamera langsung, lengkap dengan mode fullscreen untuk pemakaian di lapangan
  • Riwayat deteksi dengan filter tanggal, kondisi, metode input, dan asal pengguna
  • Dashboard berisi tren harian, sebaran jam deteksi, dan distribusi lima fase
  • Laporan periodik yang bisa diekspor ke PDF dan Excel
  • Unduh massal berbentuk ZIP, dengan pilihan gambar polos atau gambar yang sudah dibubuhi kotak deteksi
  • Pendaftaran admin dengan alur persetujuan dan notifikasi email
  • Pengelolaan konten tim peneliti, mitra, dan galeri foto
  • Antarmuka dua bahasa (Indonesia dan Inggris) serta mode gelap

Tantangan Teknis

Bagian paling merepotkan justru bukan modelnya, melainkan kamera langsung. Mengirim setiap frame ke server jelas tidak masuk akal. Saya beri jeda 800 milidetik antar frame, dan yang lebih penting: frame dari loop realtime tidak pernah masuk database. Gambar baru benar-benar disimpan saat pengguna menekan tombol potret. Aturan serupa saya pasang untuk unggahan biasa, kalau tidak ada bunga yang terdeteksi fotonya tidak ikut disimpan, supaya folder penyimpanan tidak penuh foto yang bukan Edelweis.

Masalah kedua datang dari urutan label. Roboflow mengekspor kelas secara alfabet, jadi Biji_Matang menempati indeks nol, padahal dalam siklus hidup fase itu justru ada di belakang. Saya putuskan kedua sistem tidak perlu sepakat. Model memakai urutan alfabet di mlp_model.py, web memakai urutan siklus hidup di config/edelweiss.php, dan web hanya menerima label dalam bentuk string, tidak pernah indeks. Efek sampingnya menyenangkan: warna badge, warna chart, urutan filter, sampai kelas CSS di PDF semuanya membaca satu file konfigurasi. Menambah fase baru berarti menambah satu entri dan terjemahannya, tanpa menyentuh controller atau blade.

Ketiga, soal akurasi yang memang belum selesai. Fase Pematangan_Biji dan Biji_Matang mirip secara visual karena sama-sama menampilkan mahkota yang mengering, dan itu terlihat jelas di hasil evaluasi. Sementara Penyemaian_Baru dan Mekar nyaris sempurna, dua kelas fase biji inilah yang menahan angka keseluruhan.

Terakhir, kegagalan service ML harus disampaikan jujur ke pengguna. Saya pisahkan penanganan antara service yang tidak bisa dihubungi, request yang kehabisan waktu, dan error lain, masing-masing dengan pesan berbeda. Panel admin juga punya pengecekan status service, jadi saya tidak perlu masuk ke server hanya untuk tahu FastAPI hidup atau mati.

Peran Saya

Saya mengerjakan semuanya sendiri: mengumpulkan dan menganotasi dataset di Roboflow, melatih kedua model di Google Colab, menulis service FastAPI, membangun aplikasi Laravel beserta antarmukanya, menyiapkan dua bahasa, sampai proses deploy. Awalnya sistem saya pasang manual di VPS dengan Nginx dan systemd. Belakangan saya pindahkan ke Docker yang di-deploy lewat Coolify, supaya proses update tidak lagi bergantung pada skrip shell di server.

Hasil dan Pengembangan Selanjutnya

Model dilatih dari 5.000 gambar teranotasi (3.987 latih, 516 validasi, 497 uji). Pada test set, YOLOv11n mencapai mAP@0.5 sebesar 91,8 persen dengan precision 82,1 persen dan recall 89,5 persen, dengan waktu inferensi 4,3 milidetik per gambar. MLP mencapai akurasi validasi 90,1 persen dari 6.540 potongan bunga. Per kelas, Penyemaian_Baru paling akurat (mAP@0.5 99,5 persen) dan Pematangan_Biji paling lemah (78,7 persen).

Yang ingin saya kerjakan berikutnya: menambah variasi data untuk dua fase biji yang masih tertukar, menyimpan koordinat lokasi pada hasil deteksi supaya sebaran populasi bisa dipetakan, dan membuka API publik agar peneliti lain dapat memakai model ini tanpa lewat antarmuka web.

Teknologi

Laravel 13 PHP 8.3 Tailwind CSS Alpine.js MySQL FastAPI Python 3.11 PyTorch YOLOv11 Docker Coolify

Project serupa

Siap mewujudkan ide Anda? Saya siap membantu

© 2026 Axa Rajandrya. Seluruh hak cipta dilindungi.

+
+