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