File size: 6,305 Bytes
b23590e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
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() |