|
|
import gradio as gr |
|
|
import tensorflow as tf |
|
|
import numpy as np |
|
|
from PIL import Image |
|
|
import json |
|
|
import os |
|
|
|
|
|
try: |
|
|
model = tf.keras.models.load_model( |
|
|
"model_Final.keras", |
|
|
custom_objects={ |
|
|
"preprocess_input": tf.keras.applications.resnet50.preprocess_input |
|
|
} |
|
|
) |
|
|
with open('labels.json', 'r') as f: |
|
|
class_label = json.load(f) |
|
|
except Exception as e: |
|
|
print(f"Error loading model/labels: {e}") |
|
|
class_label = ["plastic", "paper", "metal", "organic", "trash"] |
|
|
|
|
|
deskripsi_sampah = { |
|
|
"E-waste": { |
|
|
"deskripsi": "Sampah elektronik berbahaya. Jangan buang di tempat sampah biasa. Bawa ke drop box e-waste.", |
|
|
"tong_warna": "Merah (B3)", |
|
|
"dapat_didaur_ulang": "Ya, melalui fasilitas khusus B3", |
|
|
"dampak_jika_tidak_diolah": "Pelepasan zat beracun (merkuri, timbal, kadmium) ke tanah dan air. Zat ini mencemari rantai makanan dan sangat berbahaya bagi kesehatan manusia. (Referensi: UNEP/Basel Convention)" |
|
|
}, |
|
|
"Glass": { |
|
|
"deskripsi": "Kaca bisa didaur ulang tanpa batas. Pastikan tidak pecah saat dibuang agar aman bagi petugas.", |
|
|
"tong_warna": "Kuning (Anorganik)", |
|
|
"dapat_didaur_ulang": "Ya", |
|
|
"dampak_jika_tidak_diolah": "Tidak terurai (inert) dan memenuhi TPA. Pecahan kaca dapat melukai hewan dan petugas, serta berpotensi menyebabkan kebakaran karena efek lensa. (Referensi: Ilmu Lingkungan Material)" |
|
|
}, |
|
|
"Organic Waste": { |
|
|
"deskripsi": "Sampah organik (sisa makanan/daun). Bagus untuk dijadikan kompos.", |
|
|
"tong_warna": "Hijau (Organik)", |
|
|
"dapat_didaur_ulang": "Ya (Diolah menjadi kompos)", |
|
|
"dampak_jika_tidak_diolah": "Dalam TPA, penguraian anaerobik menghasilkan gas **metana ($CH_4$)**, yaitu gas rumah kaca yang 25 kali lebih kuat dari karbon dioksida ($CO_2$) dalam memerangkap panas. (Referensi: IPCC/Lembaga Penelitian Lingkungan)" |
|
|
}, |
|
|
"Textiles": { |
|
|
"deskripsi": "Limbah tekstil seperti baju bekas. Bisa disumbangkan atau didaur ulang menjadi kain lap.", |
|
|
"tong_warna": "Kuning (Anorganik)", |
|
|
"dapat_didaur_ulang": "Ya (Didaur ulang/Digunakan kembali)", |
|
|
"dampak_jika_tidak_diolah": "Membutuhkan lahan TPA yang besar. Tekstil modern melepaskan **serat mikroplastik** saat terurai di lingkungan dan membutuhkan waktu puluhan hingga ratusan tahun. (Referensi: Studi Limbah Tekstil/Microplastic Research)" |
|
|
}, |
|
|
"cardboard": { |
|
|
"deskripsi": "Kardus/Karton. Lipat hingga pipih sebelum dibuang untuk menghemat ruang. Bisa didaur ulang menjadi kertas.", |
|
|
"tong_warna": "Biru (Kertas)", |
|
|
"dapat_didaur_ulang": "Ya", |
|
|
"dampak_jika_tidak_diolah": "Memenuhi TPA dan penguraiannya di TPA juga dapat menghasilkan metana jika basah. Daur ulang kardus menghemat energi dan mengurangi penebangan pohon. (Referensi: WWF/Pusat Daur Ulang Kertas)" |
|
|
}, |
|
|
"metal": { |
|
|
"deskripsi": "Logam/Kaleng. Cuci bersih sisa makanan sebelum dibuang ke tempat daur ulang.", |
|
|
"tong_warna": "Kuning (Anorganik)", |
|
|
"dapat_didaur_ulang": "Ya", |
|
|
"dampak_jika_tidak_diolah": "Logam membutuhkan waktu ratusan tahun untuk terurai. Logam yang berkarat dapat mencemari air tanah dan memerlukan ekstraksi sumber daya alam (penambangan) yang intensif energi. (Referensi: US Geological Survey/Ilmu Material)" |
|
|
}, |
|
|
"paper": { |
|
|
"deskripsi": "Kertas. Pastikan kering dan tidak berminyak agar bisa didaur ulang.", |
|
|
"tong_warna": "Biru (Kertas)", |
|
|
"dapat_didaur_ulang": "Ya", |
|
|
"dampak_jika_tidak_diolah": "Menyumbang volume besar di TPA. Kegagalan mendaur ulang berarti peningkatan permintaan kayu dan energi untuk memproduksi kertas baru. (Referensi: Studi Konservasi Energi dan Sumber Daya Alam)" |
|
|
}, |
|
|
"plastic": { |
|
|
"deskripsi": "Plastik butuh waktu lama terurai. Pisahkan botol dan gelas plastik untuk didaur ulang.", |
|
|
"tong_warna": "Kuning (Anorganik)", |
|
|
"dapat_didaur_ulang": "Ya", |
|
|
"dampak_jika_tidak_diolah": "Membutuhkan ratusan hingga ribuan tahun untuk terurai, mencemari lautan, dan terpecah menjadi **mikroplastik** yang masuk ke rantai makanan dan ekosistem. (Referensi: Jurnal Ilmu Kelautan/Plastics Pollution Coalition)" |
|
|
}, |
|
|
"shoes": { |
|
|
"deskripsi": "Sepatu bekas. Jika masih layak pakai, sebaiknya didonasikan.", |
|
|
"tong_warna": "Kuning (Anorganik)", |
|
|
"dapat_didaur_ulang": "Ya (Digunakan kembali/Daur ulang terbatas)", |
|
|
"dampak_jika_tidak_diolah": "Terbuat dari material campuran kompleks (karet, kulit, plastik, busa) yang hampir mustahil terurai secara alami, sehingga menumpuk di TPA. (Referensi: Analisis Material Limbah Kompleks)" |
|
|
}, |
|
|
"trash": { |
|
|
"deskripsi": "Sampah residu atau lainnya yang sulit didaur ulang. Buang ke tempat sampah umum.", |
|
|
"tong_warna": "Abu-abu (Residu)", |
|
|
"dapat_didaur_ulang": "Tidak", |
|
|
"dampak_jika_tidak_diolah": "Menyebabkan penumpukan di TPA, memerlukan lahan yang terus bertambah, dan menjadi sumber bau tidak sedap, serta lindi (air sampah) yang mencemari lingkungan. (Referensi: Pedoman Pengelolaan TPA)" |
|
|
} |
|
|
} |
|
|
|
|
|
def predict_input(img): |
|
|
img = img.resize((224, 224)) |
|
|
img = np.array(img) |
|
|
img = np.expand_dims(img, axis=0) |
|
|
img = tf.keras.applications.resnet50.preprocess_input(img) |
|
|
|
|
|
pred = model.predict(img)[0] |
|
|
idx = np.argmax(pred) |
|
|
hasil_label = class_label[idx] |
|
|
|
|
|
info = deskripsi_sampah.get(hasil_label) |
|
|
|
|
|
if info: |
|
|
deskripsi_markdown = f""" |
|
|
### Hasil Deteksi: **{hasil_label}** |
|
|
|
|
|
* **📄 Deskripsi:** {info['deskripsi']} |
|
|
* **🗑️ Buang Pada Tong Sampah:** {info['tong_warna']} |
|
|
* **♻️ Dapat Didaur Ulang:** {info['dapat_didaur_ulang']} |
|
|
|
|
|
--- |
|
|
#### ⚠️ Dampak Jika Tidak Diolah: |
|
|
{info['dampak_jika_tidak_diolah']} |
|
|
""" |
|
|
else: |
|
|
deskripsi_markdown = f"### {hasil_label}\ninformasi detail untuk kategori ini belum tersedia." |
|
|
|
|
|
return {class_label[i]: float(pred[i]) for i in range(len(class_label))}, deskripsi_markdown |
|
|
|
|
|
|
|
|
|
|
|
demo = gr.Interface( |
|
|
fn=predict_input, |
|
|
inputs=gr.Image(type="pil"), |
|
|
outputs=[ |
|
|
gr.Label(num_top_classes=3, label="Prediksi Kategori"), |
|
|
gr.Markdown(label="Saran Pengolahan") |
|
|
], |
|
|
title="Klasifikasi Sampah & Saran Pengolahan", |
|
|
description="Unggah foto sampah untuk mengetahui jenisnya dan cara mengolahnya", |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
demo.launch() |