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