durian-ai / app.py
Benny-Tang's picture
Update app.py
2c3d6ab verified
import gradio as gr
import pandas as pd
# -----------------------------
# Top 10 Durian Varieties
# -----------------------------
TOP10_DURIANS = [
"Musang King (D197)", "D24 (Sultan)", "Black Thorn (D200)",
"XO", "Red Prawn (D175)", "Hor Lor (D163)",
"Tekka (D160)", "Chanee (D123)", "Golden Phoenix (D198)", "Green Skin"
]
# -----------------------------
# Analysis Function
# -----------------------------
def analyze_durian(variety, soil_pH, nitrogen, potassium, rainfall):
try:
soil_pH = float(soil_pH)
nitrogen = float(nitrogen)
potassium = float(potassium)
rainfall = float(rainfall)
except:
return "❌ Please enter valid numeric values. / Sila masukkan nilai berangka yang sah. / 请输入有效的数值。"
# Simple rules
risk = "Low" if 5.5 <= soil_pH <= 6.5 else "Medium"
fert = f"Add {30-nitrogen} kg nitrogen/ha" if nitrogen < 30 else "Nitrogen level OK"
irrig = "Irrigate twice a week" if rainfall < 150 else "Rainfall sufficient"
yield_proj = "+12% yield expected"
# 🔥 Multilingual output
output = f"""
🌳 **Analysis Report / Laporan Analisis / 分析报告**
**Durian Variety / Varieti Durian / 榴莲品种:** {variety}
**English**
- Risk Assessment: {risk}
- Fertilizer Recommendation: {fert}
- Irrigation Recommendation: {irrig}
- Yield Projection: {yield_proj}
**Bahasa Melayu**
- Penilaian Risiko: { 'Rendah' if risk=='Low' else 'Sederhana' }
- Cadangan Baja: { 'Tambah ' + str(30-nitrogen) + ' kg nitrogen sehektar' if nitrogen < 30 else 'Tahap nitrogen mencukupi' }
- Cadangan Pengairan: { 'Siram dua kali seminggu' if rainfall < 150 else 'Hujan mencukupi' }
- Unjuran Hasil: Anggaran kesan hasil { '+12% berbanding asas' }
**中文**
- 风险评估: { '低' if risk=='Low' else '中等' }
- 施肥建议: { '每公顷增加 ' + str(30-nitrogen) + ' 公斤氮肥' if nitrogen < 30 else '氮水平正常' }
- 灌溉建议: { '每周浇水两次' if rainfall < 150 else '雨量充足' }
- 产量预测: 预计增产 { '+12%' }
"""
return output
# -----------------------------
# CSV Upload Analysis
# -----------------------------
def analyze_csv(file):
if file is None:
return "❌ Please upload a CSV file. / Sila muat naik fail CSV. / 请上传CSV文件。"
try:
df = pd.read_csv(file.name)
except:
return "❌ Failed to read CSV file. Ensure it is valid. / Gagal membaca fail CSV. / 无法读取CSV文件。"
reports = []
for _, row in df.iterrows():
reports.append(
analyze_durian(
row.get("variety", "Unknown"),
row.get("soil_pH", 6.0),
row.get("nitrogen", 20),
row.get("potassium", 20),
row.get("rainfall", 100)
)
)
return "\n\n---\n\n".join(reports)
# -----------------------------
# Case Studies
# -----------------------------
CASE_STUDIES = [
{
"title": "Case Study 1 / Kajian Kes 1 / 案例研究 1: Musang King – Phytophthora Disease",
"desc_en": "Root rot due to Phytophthora. Treatment: fungicide drenching & better drainage.",
"desc_bm": "Reput akar disebabkan oleh Phytophthora. Rawatan: siraman racun kulat & saliran lebih baik.",
"desc_cn": "由霜霉病引起的根腐病。治疗方法:杀菌剂灌根 & 改善排水。",
"image": "static/images/cs1.png",
"link": "https://www.mardi.gov.my/"
},
{
"title": "Case Study 2 / Kajian Kes 2 / 案例研究 2: D24 – Leaf Spot",
"desc_en": "Caused by fungal infection. Treatment: remove infected leaves, apply copper fungicide.",
"desc_bm": "Disebabkan oleh jangkitan kulat. Rawatan: buang daun berpenyakit, gunakan racun kulat kuprum.",
"desc_cn": "由真菌感染引起。治疗方法:去除病叶,喷洒铜制杀菌剂。",
"image": "static/images/cs2.png",
"link": "https://www.upm.edu.my/"
},
{
"title": "Case Study 3 / Kajian Kes 3 / 案例研究 3: Black Thorn – Stem Canker",
"desc_en": "Fungal infection on stem. Treatment: cut affected bark, apply fungicide.",
"desc_bm": "Jangkitan kulat pada batang. Rawatan: potong kulit kayu berpenyakit, sapu racun kulat.",
"desc_cn": "树干真菌感染。治疗方法:刮除受感染树皮并涂抹杀菌剂。",
"image": "static/images/cs3.png",
"link": "https://www.mardi.gov.my/"
},
{
"title": "Case Study 4 / Kajian Kes 4 / 案例研究 4: Red Prawn – Fruit Borer",
"desc_en": "Pest attack inside fruits. Treatment: pheromone traps, insecticide spray.",
"desc_bm": "Serangan perosak dalam buah. Rawatan: perangkap feromon, semburan racun serangga.",
"desc_cn": "害虫蛀果。治疗方法:信息素陷阱,喷洒杀虫剂。",
"image": "static/images/cs4.png",
"link": "https://www.upm.edu.my/"
},
{
"title": "Case Study 5 / Kajian Kes 5 / 案例研究 5: XO – Dieback Disease",
"desc_en": "Branch dieback due to fungus. Treatment: prune branches, systemic fungicide.",
"desc_bm": "Dahan mati akibat kulat. Rawatan: cantas dahan, racun kulat sistemik.",
"desc_cn": "真菌导致枝条枯死。治疗方法:修剪枯枝并使用内吸性杀菌剂。",
"image": "static/images/cs5.png",
"link": "https://www.mardi.gov.my/"
},
{
"title": "Case Study 6 / Kajian Kes 6 / 案例研究 6: Yellow Leaf Diagnosis",
"desc_en": """
Common causes: aging, nutrient deficiency, watering issues, pests/diseases.
- Old leaves only = natural aging.
- Older leaves, uniform yellow = nitrogen deficiency.
- Older leaves, veins green = magnesium deficiency.
- Young leaves yellow, veins green = iron deficiency.
- Waterlogged = overwatering/root rot.
- Dry/crispy = underwatering.
""",
"desc_bm": """
Punca biasa: penuaan, kekurangan nutrien, masalah siraman, perosak/penyakit.
- Daun lama sahaja = penuaan semula jadi.
- Daun lama kuning sekata = kekurangan nitrogen.
- Daun lama, urat hijau = kekurangan magnesium.
- Daun muda kuning, urat hijau = kekurangan zat besi.
- Tanah terlalu basah = terlebih siram / reput akar.
- Daun kering/rapuh = kekurangan siraman.
""",
"desc_cn": """
常见原因: 老化、养分缺乏、浇水问题、病虫害。
- 仅老叶变黄 = 自然老化。
- 老叶整体变黄 = 氮元素缺乏。
- 老叶叶脉仍绿 = 镁缺乏。
- 幼叶发黄但叶脉仍绿 = 缺铁。
- 土壤过湿 = 浇水过多 / 根腐病。
- 叶片干枯脆裂 = 浇水不足。
""",
"image": "static/images/cs6.png",
"link": "https://www.mardi.gov.my/"
}
]
# -----------------------------
# Build UI
# -----------------------------
with gr.Blocks() as demo:
gr.Markdown("## 🌱 AI Crop Genomics & Precision Agritech (Durian POC) / AI Genomik Tanaman & Agritek Tepat (POC Durian) / 作物基因组学与精准农业 (榴莲 POC)")
with gr.Tab("Manual Input / Input Manual / 手动输入"):
variety = gr.Dropdown(TOP10_DURIANS, label="Durian Variety / Varieti Durian / 榴莲品种")
soil_pH = gr.Textbox(label="Soil pH / pH Tanah / 土壤酸碱度")
nitrogen = gr.Textbox(label="Nitrogen (kg/ha) / Nitrogen (kg/ha) / 氮 (kg/公顷)")
potassium = gr.Textbox(label="Potassium (kg/ha) / Kalium (kg/ha) / 钾 (kg/公顷)")
rainfall = gr.Textbox(label="Rainfall (mm/month) / Hujan (mm/bulan) / 降雨量 (毫米/月)")
analyze_btn = gr.Button("Analyze / Analisis / 分析")
manual_output = gr.Markdown()
analyze_btn.click(
analyze_durian,
inputs=[variety, soil_pH, nitrogen, potassium, rainfall],
outputs=manual_output
)
with gr.Tab("Upload CSV / Muat Naik CSV / 上传CSV"):
csv_file = gr.File(label="Upload Orchard CSV Report / Muat Naik Laporan Ladang CSV / 上传果园CSV报告", file_types=[".csv"])
csv_output = gr.Markdown()
csv_btn = gr.Button("Analyze CSV / Analisis CSV / 分析CSV")
csv_btn.click(analyze_csv, inputs=csv_file, outputs=csv_output)
with gr.Tab("Case Studies / Kajian Kes / 案例研究"):
for cs in CASE_STUDIES:
with gr.Group():
gr.Markdown(f"### {cs['title']}")
gr.Image(value=cs["image"], type="filepath", label="Disease Image / Imej Penyakit / 病害图像")
gr.Markdown(f"""
**English:** {cs['desc_en']}
**Bahasa Melayu:** {cs['desc_bm']}
**中文:** {cs['desc_cn']}
🔗 [Reference / Rujukan / 参考]({cs['link']})
""")
# -----------------------------
# Launch
# -----------------------------
if __name__ == "__main__":
demo.launch()