| import gradio as gr |
| from ultralytics import YOLO |
| import google.generativeai as genai |
| import os |
| from PIL import Image |
| import warnings |
|
|
| import torch |
| from ultralytics.nn.tasks import ClassificationModel |
| from ultralytics.nn.modules import conv, block, head |
| from torch.nn import Sequential, Conv2d, Module, BatchNorm2d, SiLU, ModuleList, AdaptiveAvgPool2d, Dropout, Linear |
| from torchvision.transforms import transforms |
| from torchvision.transforms.functional import InterpolationMode |
|
|
| torch.serialization.add_safe_globals([ |
| ClassificationModel, |
| Sequential, |
| conv.Conv, |
| Conv2d, |
| block.C2f, |
| block.Bottleneck, |
| block.SPPF, |
| Module, |
| BatchNorm2d, |
| SiLU, |
| ModuleList, |
| head.Classify, |
| AdaptiveAvgPool2d, |
| Dropout, |
| Linear, |
| transforms.Compose, |
| transforms.Resize, |
| transforms.CenterCrop, |
| transforms.ToTensor, |
| transforms.Normalize, |
| InterpolationMode |
| ]) |
|
|
| warnings.filterwarnings("ignore") |
|
|
| yolo_model = None |
| gemini_model = None |
| try: |
| yolo_model = YOLO('./weights/best.pt') |
| except Exception as e: |
| print(f"Error memuat model YOLO: {e}") |
|
|
| GEMINI_API_KEY = os.environ.get('GEMINI_API_KEY') |
| if GEMINI_API_KEY: |
| try: |
| genai.configure(api_key=GEMINI_API_KEY) |
| gemini_model = genai.GenerativeModel('gemini-2.0-flash') |
| except Exception as e: |
| print(f"Error konfigurasi Gemini: {e}") |
| else: |
| print("Peringatan: Secret 'GEMINI_API_KEY' tidak ditemukan.") |
|
|
| kamus_hama = { |
| 'aphids': 'Kutu Daun', 'armyworm': 'Ulat Grayak', 'beetle': 'Kumbang', |
| 'bollworm': 'Ulat Penggerek Buah', 'grasshopper': 'Belalang', 'mites': 'Tungau', |
| 'mosquito': 'Nyamuk', 'sawfly': 'Lalat Gergaji', 'stem_borer': 'Penggerek Batang', |
| 'ants': 'Semut', 'bees': 'Lebah', 'catterpillar': 'Ulat Bulu', |
| 'earthworms': 'Cacing Tanah', 'earwig': 'Gegat', 'moth': 'Ngengat', |
| 'slug': 'Siput Telanjang', 'snail': 'Siput', 'wasp': 'Tawon', 'weevil': 'Kumbang Bubuk' |
| } |
|
|
| def dapatkan_panduan_hama(nama_hama_indonesia): |
| if not gemini_model: |
| return "โ ๏ธ **Model Gemini tidak terkonfigurasi.**\nHarap atur secret `GEMINI_API_KEY` di pengaturan Hugging Face Space untuk mendapatkan panduan penanganan." |
| prompt = f""" |
| Sebagai seorang ahli pertanian, berikan panduan penanganan yang jelas dan praktis untuk hama '{nama_hama_indonesia}'. |
| Struktur jawaban Anda harus mencakup poin-poin berikut dengan penjelasan dengan jelas: |
| - Deskripsi : Penampilan dan siklus hidup hama. (buat dalam bentuk paragraf) |
| - Gejala Serangan: Tanda-tanda pada tanaman yang diserang. (buat dalam bentuk poin dan subpoin penting) |
| - Metode Pencegahan: Cara-cara mencegah hama datang. (buat dalam bentuk poin dan subpoin penting) |
| - Penanganan Non-Kimiawi: Contoh musuh alami atau pestisida nabati. (buat dalam bentuk poin dan subpoin penting) |
| - Penanganan Kimiawi : Contoh bahan aktif insektisida yang efektif. (buat dalam bentuk poin dan subpoin penting) |
| """ |
| try: |
| response = gemini_model.generate_content(prompt) |
| return response.text |
| except Exception as e: |
| return f"โ Gagal mendapatkan panduan dari Gemini. Error: {e}" |
|
|
| def identifikasi_hama_dan_panduan(gambar_input): |
| if not yolo_model: |
| return None, "Model YOLO tidak berhasil dimuat." |
| results = yolo_model.predict(gambar_input, verbose=False) |
| result = results[0] |
| probabilities = result.probs |
| nama_inggris = yolo_model.names[probabilities.top1] |
| keyakinan = probabilities.top1conf |
| nama_indonesia = kamus_hama.get(nama_inggris, nama_inggris) |
| hasil_prediksi = f"### ๐ฏ Hasil Identifikasi\n- **Jenis Hama:** {nama_indonesia} (*{nama_inggris}*)\n- **Tingkat Akurasi:** {keyakinan.item():.2%}" |
| panduan_penanganan = dapatkan_panduan_hama(nama_indonesia) |
| return gambar_input, hasil_prediksi, panduan_penanganan |
|
|
| with gr.Blocks(theme=gr.themes.Soft(primary_hue="lime", secondary_hue="green")) as app: |
| gr.Markdown("# ๐ฟ Eleaf : Pest Identification AI ๐ฟ") |
| gr.Markdown("Unggah gambar hama pada tanaman Anda. AI akan mengidentifikasi jenisnya dan memberikan panduan penanganan lengkap.") |
| with gr.Row(): |
| with gr.Column(scale=1): |
| input_image = gr.Image(type="pil", label="Unggah Gambar di Sini") |
| submit_button = gr.Button("๐ Identifikasi Hama", variant="primary") |
| with gr.Column(scale=2): |
| output_image = gr.Image(label="Gambar yang Dianalisis", interactive=False) |
| output_prediksi = gr.Markdown(label="Hasil Analisis") |
| output_panduan = gr.Markdown(label="Panduan Penanganan") |
| submit_button.click(fn=identifikasi_hama_dan_panduan, inputs=input_image, outputs=[output_image, output_prediksi, output_panduan]) |
|
|
| if __name__ == "__main__": |
| app.launch() |