Spaces:
Build error
Build error
| 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() | |