Wilsonnnnn30's picture
Update app.py
b23590e verified
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",
)
# if __name__ == "__main__":
# port = int(os.environ.get("PORT", 8000))
# demo.launch(server_name="0.0.0.0", server_port=port)
demo.launch()