Spaces:
Sleeping
Sleeping
File size: 7,862 Bytes
14aebdf 1c87170 14aebdf 1c87170 14aebdf 1c87170 14aebdf 1c87170 14aebdf 1c87170 14aebdf 1c87170 14aebdf 1c87170 14aebdf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
import gradio as gr
from model_utils import predict_outcome
from styles import RTL_CSS, HTML_HEAD
from config import (
APP_TITLE, MODEL_ACCURACY, MODEL_AUC,
DEFAULT_VALUES, FIELD_RANGES, EXAMPLE_CASES
)
def create_patient_info_section():
with gr.Column():
gr.Markdown("### 📝 اطلاعات بیمار")
age = gr.Number(label="سن", value=DEFAULT_VALUES['age'],
minimum=FIELD_RANGES['age']['min'], maximum=FIELD_RANGES['age']['max'])
weight = gr.Number(label="وزن (کیلوگرم)", value=DEFAULT_VALUES['weight'],
minimum=FIELD_RANGES['weight']['min'], maximum=FIELD_RANGES['weight']['max'])
height = gr.Number(label="قد (سانتیمتر)", value=DEFAULT_VALUES['height'],
minimum=FIELD_RANGES['height']['min'], maximum=FIELD_RANGES['height']['max'])
with gr.Row():
gravidity = gr.Number(label="تعداد بارداری", value=DEFAULT_VALUES['gravidity'],
minimum=FIELD_RANGES['gravidity']['min'], maximum=FIELD_RANGES['gravidity']['max'])
parity = gr.Number(label="تعداد زایمان", value=DEFAULT_VALUES['parity'],
minimum=FIELD_RANGES['parity']['min'], maximum=FIELD_RANGES['parity']['max'])
with gr.Row():
h_abortion = gr.Number(label="تعداد سقط", value=DEFAULT_VALUES['h_abortion'],
minimum=FIELD_RANGES['h_abortion']['min'], maximum=FIELD_RANGES['h_abortion']['max'])
living_child = gr.Number(label="فرزند زنده", value=DEFAULT_VALUES['living_child'],
minimum=FIELD_RANGES['living_child']['min'], maximum=FIELD_RANGES['living_child']['max'])
gestational_age = gr.Number(label="سن بارداری (هفته)", value=DEFAULT_VALUES['gestational_age'],
minimum=FIELD_RANGES['gestational_age']['min'], maximum=FIELD_RANGES['gestational_age']['max'])
return age, weight, height, gravidity, parity, h_abortion, living_child, gestational_age
def create_lab_tests_section():
with gr.Column():
gr.Markdown("### 🧪 آزمایشات خون")
hemoglobin = gr.Number(label="هموگلوبین", value=DEFAULT_VALUES['hemoglobin'],
minimum=FIELD_RANGES['hemoglobin']['min'], maximum=FIELD_RANGES['hemoglobin']['max'])
hematocrit = gr.Number(label="هماتوکریت", value=DEFAULT_VALUES['hematocrit'],
minimum=FIELD_RANGES['hematocrit']['min'], maximum=FIELD_RANGES['hematocrit']['max'])
platelet = gr.Number(label="پلاکت", value=DEFAULT_VALUES['platelet'],
minimum=FIELD_RANGES['platelet']['min'], maximum=FIELD_RANGES['platelet']['max'])
with gr.Row():
mpv = gr.Number(label="MPV", value=DEFAULT_VALUES['mpv'],
minimum=FIELD_RANGES['mpv']['min'], maximum=FIELD_RANGES['mpv']['max'])
pdw = gr.Number(label="PDW", value=DEFAULT_VALUES['pdw'],
minimum=FIELD_RANGES['pdw']['min'], maximum=FIELD_RANGES['pdw']['max'])
with gr.Row():
neutrophil = gr.Number(label="نوتروفیل", value=DEFAULT_VALUES['neutrophil'],
minimum=FIELD_RANGES['neutrophil']['min'], maximum=FIELD_RANGES['neutrophil']['max'])
lymphocyte = gr.Number(label="لنفوسیت", value=DEFAULT_VALUES['lymphocyte'],
minimum=FIELD_RANGES['lymphocyte']['min'], maximum=FIELD_RANGES['lymphocyte']['max'])
return hemoglobin, hematocrit, platelet, mpv, pdw, neutrophil, lymphocyte
def predict_with_explanation(age, weight, height, gravidity, parity, h_abortion,
living_child, gestational_age, hemoglobin, hematocrit,
platelet, mpv, pdw, neutrophil, lymphocyte):
required_fields = [age, weight, height, gravidity, parity, h_abortion,
living_child, gestational_age, hemoglobin, hematocrit,
platelet, mpv, pdw, neutrophil, lymphocyte]
if any(field is None or field == "" for field in required_fields):
return "⚠️ لطفاً تمام فیلدها را پر کنید", "برای پیشبینی دقیق، تمام اطلاعات مورد نیاز است.", None
result, detailed_report, shap_plot = predict_outcome(
age, weight, height, gravidity, parity, h_abortion,
living_child, gestational_age, hemoglobin, hematocrit,
platelet, mpv, pdw, neutrophil, lymphocyte
)
return result, detailed_report, shap_plot
def clear_all_fields():
return tuple([None] * 17) + ("", "", None)
def load_example(example_name):
example_data = EXAMPLE_CASES[example_name]
return tuple(example_data[key] for key in [
'age', 'weight', 'height', 'gravidity', 'parity', 'h_abortion',
'living_child', 'gestational_age', 'hemoglobin', 'hematocrit',
'platelet', 'mpv', 'pdw', 'neutrophil', 'lymphocyte'
])
def create_interface():
with gr.Blocks(title=APP_TITLE, theme=gr.themes.Soft(), css=RTL_CSS, head=HTML_HEAD) as demo:
gr.Markdown(f"""
# {APP_TITLE}
این سیستم با استفاده از مدل هوش مصنوعی **AdaBoost**، احتمال بروز عوارض در بارداری را پیشبینی میکند.
**📊 عملکرد مدل:** دقت {MODEL_ACCURACY} | AUC {MODEL_AUC}
🔍 **ویژگیهای سیستم:**
- پیشبینی دقیق با استفاده از هوش مصنوعی
- تحلیل SHAP برای توضیح تأثیر هر ویژگی
- گزارش تفصیلی و قابل فهم برای پزشکان
- نمودار تصویری تأثیر پارامترها
📝 **راهنما:** تمام فیلدها را پر کنید یا از مثالهای آماده استفاده کنید.
""")
with gr.Row():
patient_inputs = create_patient_info_section()
lab_inputs = create_lab_tests_section()
with gr.Row():
predict_btn = gr.Button("🔍 پیشبینی", variant="primary", size="lg")
clear_btn = gr.Button("🗑️ پاک کردن", variant="secondary")
with gr.Row():
with gr.Column(scale=2):
result_text = gr.Textbox(label="نتیجه پیشبینی", lines=2)
detailed_report = gr.Markdown(label="گزارش تفصیلی")
with gr.Column(scale=1):
shap_plot = gr.Image(label="نمودار SHAP - تأثیر ویژگیها", type="filepath")
gr.Markdown("---")
gr.Markdown("## 📚 مثالهای آماده")
with gr.Row():
for example_name in EXAMPLE_CASES.keys():
example_btn = gr.Button(f"📋 {example_name}", variant="secondary")
example_btn.click(
fn=lambda name=example_name: load_example(name),
outputs=list(patient_inputs) + list(lab_inputs)
)
predict_btn.click(
fn=predict_with_explanation,
inputs=list(patient_inputs) + list(lab_inputs),
outputs=[result_text, detailed_report, shap_plot]
)
clear_btn.click(
fn=clear_all_fields,
outputs=list(patient_inputs) + list(lab_inputs) + [result_text, detailed_report, shap_plot]
)
return demo
|