eleaf / app.py
wildanzm's picture
Update app.py
3114e20 verified
Raw
History Blame Contribute Delete
4.76 kB
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()