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()