| | import gradio as gr
|
| | import random, math
|
| | from transformers import pipeline
|
| | from PyPDF2 import PdfReader
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | def sigmoid(x):
|
| | return 1 / (1 + math.exp(-x))
|
| |
|
| | def extract_pdf_text(pdf_file):
|
| | """Extract text from an uploaded PDF file using PyPDF2."""
|
| | try:
|
| | reader = PdfReader(pdf_file.name)
|
| | text = ""
|
| | for page in reader.pages:
|
| | text += page.extract_text()
|
| | return text
|
| | except Exception as e:
|
| | return f"Error extracting PDF text: {e}"
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | def update_visibility(choice):
|
| | if choice == "Other":
|
| | return gr.update(visible=True)
|
| | else:
|
| | return gr.update(visible=False)
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | def predict_without_mri(
|
| |
|
| | age, gender, ethnicity, education, pincode, mobile,
|
| |
|
| | family_history, family_relationship, conditions, medications,
|
| |
|
| | basic_memory_changes, basic_memory_desc, basic_difficulty_recent,
|
| | basic_trouble_words, basic_problem_solving, basic_trouble_appointments,
|
| | basic_changes_reaction, basic_driving_concern,
|
| |
|
| | smoking_status, alcohol_consumption, physical_activity,
|
| |
|
| | reflexes_choice, reflexes_other,
|
| | muscle_tone_choice, muscle_tone_other,
|
| | coordination_choice, coordination_other,
|
| | balance_choice, balance_other,
|
| | sight_hearing_choice, sight_hearing_other,
|
| |
|
| |
|
| | mem_diff_recent, mem_forget_appointments, mem_repeat, mem_learning,
|
| |
|
| | lang_find_words, lang_understand, lang_follow,
|
| |
|
| | exec_plan, exec_decide, exec_finance,
|
| |
|
| | visuospatial_judge, visuospatial_navigate, visuospatial_recognize,
|
| |
|
| | attention_focus, attention_distracted, attention_instructions,
|
| |
|
| | func_ADL, func_medications, func_transport,
|
| |
|
| | behavior_mood_change, behavior_mood_change_desc, behavior_anxiety, behavior_irritability, behavior_loss_interest,
|
| |
|
| | additional_comments,
|
| |
|
| | p_tau217, abeta42, abeta40, miRNAs,
|
| |
|
| | mmse, adas_cog, faq, ravlt,
|
| |
|
| | pdf_report
|
| | ):
|
| |
|
| | try:
|
| | mmse = float(mmse)
|
| | except:
|
| | mmse = 0.0
|
| | try:
|
| | adas = float(adas_cog)
|
| | except:
|
| | adas = 0.0
|
| | try:
|
| | p_tau217 = float(p_tau217)
|
| | except:
|
| | p_tau217 = 0.0
|
| | try:
|
| | abeta42 = float(abeta42)
|
| | except:
|
| | abeta42 = 0.0
|
| | try:
|
| | abeta40 = float(abeta40)
|
| | except:
|
| | abeta40 = 1.0
|
| | try:
|
| | abeta_ratio = abeta42 / abeta40
|
| | except:
|
| | abeta_ratio = 0.0
|
| |
|
| |
|
| | w_age = 0.05
|
| | w_education = -0.1
|
| | w_mmse = -0.05
|
| | w_adas = 0.05
|
| | w_ptau = 0.02
|
| | w_abeta_ratio = 0.5
|
| | bias = -5.0
|
| |
|
| | risk_value = (w_age * age + w_education * education + w_mmse * mmse +
|
| | w_adas * adas + w_ptau * p_tau217 + w_abeta_ratio * abeta_ratio + bias)
|
| | risk_probability = sigmoid(risk_value)
|
| |
|
| | if risk_probability < 0.33:
|
| | risk_category = "Low Risk"
|
| | elif risk_probability < 0.66:
|
| | risk_category = "Moderate Risk"
|
| | else:
|
| | risk_category = "High Risk"
|
| |
|
| |
|
| | if pdf_report is not None:
|
| | pdf_text = extract_pdf_text(pdf_report)
|
| | else:
|
| | pdf_text = "No PDF report provided."
|
| |
|
| | result = f"""### Prediction Result: {risk_category}
|
| | Calculated Risk Probability: {risk_probability*100:.2f}%
|
| |
|
| | **Section A: Patient Demographics**
|
| | - Age: {age}
|
| | - Gender: {gender}
|
| | - Ethnicity: {ethnicity}
|
| | - Years of Education: {education}
|
| | - Pincode: {pincode}
|
| | - Mobile Number: {mobile}
|
| |
|
| | **Section B: Medical History**
|
| | - Family history of Alzheimer's/dementia: {family_history}
|
| | - Relationship: {family_relationship if family_history == "Yes" else "N/A"}
|
| | - Conditions: {', '.join(conditions) if conditions else 'None'}
|
| | - Current Medications: {medications}
|
| |
|
| | **Section C: Basic Cognitive Assessment**
|
| | - Recent changes in memory: {basic_memory_changes}
|
| | - Description: {basic_memory_desc}
|
| | - Difficulty remembering recent events: {basic_difficulty_recent}
|
| | - Trouble finding the right words: {basic_trouble_words}
|
| | - Difficulty with problem-solving: {basic_problem_solving}
|
| | - Trouble with appointments/medications: {basic_trouble_appointments}
|
| | - Changes in reactions: {basic_changes_reaction}
|
| | - Concerns about driving: {basic_driving_concern}
|
| |
|
| | **Section IV: Lifestyle Factors**
|
| | - Smoking status: {smoking_status}
|
| | - Alcohol consumption: {alcohol_consumption}
|
| | - Physical activity level: {physical_activity}
|
| |
|
| | **Section E: Physical & Neurological Exam**
|
| | - Reflexes: {reflexes_choice if reflexes_choice != "Other" else reflexes_other}
|
| | - Muscle tone and strength: {muscle_tone_choice if muscle_tone_choice != "Other" else muscle_tone_other}
|
| | - Coordination: {coordination_choice if coordination_choice != "Other" else coordination_other}
|
| | - Balance: {balance_choice if balance_choice != "Other" else balance_other}
|
| | - Sense of sight and hearing: {sight_hearing_choice if sight_hearing_choice != "Other" else sight_hearing_other}
|
| |
|
| | **Section V: Detailed Cognitive & Functional Assessment**
|
| | *A. Memory*
|
| | - Difficulty remembering recent events: {mem_diff_recent}
|
| | - Forget appointments or important dates: {mem_forget_appointments}
|
| | - Repeat questions or statements: {mem_repeat}
|
| | - Trouble learning new information: {mem_learning}
|
| |
|
| | *B. Language*
|
| | - Trouble finding the right words: {lang_find_words}
|
| | - Difficulty understanding what people say: {lang_understand}
|
| | - Trouble following conversations: {lang_follow}
|
| |
|
| | *C. Executive Function*
|
| | - Difficulty planning/organizing tasks: {exec_plan}
|
| | - Trouble making decisions/solving problems: {exec_decide}
|
| | - Hard to manage finances: {exec_finance}
|
| |
|
| | *D. Visuospatial Skills*
|
| | - Difficulty judging distances: {visuospatial_judge}
|
| | - Trouble finding your way around familiar places: {visuospatial_navigate}
|
| | - Difficulty recognizing faces: {visuospatial_recognize}
|
| |
|
| | *E. Attention and Concentration*
|
| | - Difficulty focusing: {attention_focus}
|
| | - Easily distracted: {attention_distracted}
|
| | - Trouble following instructions: {attention_instructions}
|
| |
|
| | *F. Functional Abilities*
|
| | - Need assistance with ADLs: {func_ADL}
|
| | - Difficulty managing medications: {func_medications}
|
| | - Difficulty driving/using public transport: {func_transport}
|
| |
|
| | **Section VI: Behavioral and Emotional Changes**
|
| | - Changes in mood or personality: {behavior_mood_change}
|
| | - Description of mood changes: {behavior_mood_change_desc if behavior_mood_change == "Yes" else "N/A"}
|
| | - More anxious or depressed: {behavior_anxiety}
|
| | - More irritable or agitated: {behavior_irritability}
|
| | - Lost interest in activities: {behavior_loss_interest}
|
| |
|
| | **Section VII: Additional Comments**
|
| | {additional_comments}
|
| |
|
| | **Section G: Blood-Based Biomarkers**
|
| | - p-tau217: {p_tau217}
|
| | - Aβ42: {abeta42}
|
| | - Aβ40: {abeta40}
|
| | - miRNAs: {miRNAs}
|
| |
|
| | **Section H: Basic Cognitive & Functional Assessment Scores**
|
| | - MMSE: {mmse}
|
| | - ADAS-Cog: {adas_cog}
|
| | - FAQ: {faq}
|
| | - RAVLT: {ravlt}
|
| |
|
| | **Uploaded PDF Report Details:**
|
| | {pdf_text}
|
| | """
|
| | return result
|
| |
|
| |
|
| |
|
| |
|
| | pipe = pipeline("image-classification", model="evanrsl/resnet-Alzheimer")
|
| |
|
| |
|
| | def predict_alzheimer(image, age, gender, ethnicity):
|
| | """
|
| | Predict Alzheimer’s status from an uploaded image using the pretrained pipeline,
|
| | and include demographic information (age, gender, ethnicity) in the output.
|
| | """
|
| |
|
| | results = pipe(image)
|
| |
|
| | print(results)
|
| | label = results[0]['label']
|
| | confidence = results[0]['score'] * 100
|
| |
|
| |
|
| | output_text = (f"**Prediction:** {label}\n"
|
| | f"**Confidence:** {confidence:.2f}%\n\n"
|
| | f"**Demographics:**\n"
|
| | f"- Age: {age}\n"
|
| | f"- Gender: {gender}\n"
|
| | f"- Ethnicity: {ethnicity}\n"
|
| | f"Note: Prediction may be Non-Demented to High-Demented\n Confidence suggests that how the model is sure of this prediction")
|
| | return output_text
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | with gr.Blocks() as demo:
|
| | gr.Markdown("# ADAP System : Alzheimer Detection, Assessment & Prediction System")
|
| |
|
| | with gr.Tabs():
|
| |
|
| |
|
| |
|
| | with gr.Tab("Without MRI Data"):
|
| | gr.Markdown("### Please fill out the following form:")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section A: Patient Demographics")
|
| | age = gr.Number(label="Age (years)", value=60)
|
| | gender = gr.Radio(label="Gender", choices=["Male", "Female", "Other"])
|
| | ethnicity = gr.Textbox(label="Ethnicity", placeholder="Enter ethnicity")
|
| | education = gr.Number(label="Years of Education", value=12)
|
| | pincode = gr.Textbox(label="Pincode", placeholder="Enter your pincode")
|
| | mobile = gr.Textbox(label="Mobile Number", placeholder="Enter your mobile number")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section B: Medical History")
|
| | family_history = gr.Radio(label="Do you have a family history of Alzheimer's disease or dementia?", choices=["Yes", "No"])
|
| | family_relationship = gr.Textbox(label="If yes, please specify the relationship", placeholder="e.g., Mother, Father, Grandparent")
|
| | conditions = gr.CheckboxGroup(label="Do you have any of the following conditions?", choices=["High blood pressure", "Heart disease", "Stroke", "Diabetes", "High cholesterol", "Head injuries"])
|
| | medications = gr.Textbox(label="List any current medications", lines=3, placeholder="Enter current medications")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section C: Basic Cognitive Assessment")
|
| | basic_memory_changes = gr.Radio(label="Have you noticed any recent changes in your memory?", choices=["Yes", "No"])
|
| | basic_memory_desc = gr.Textbox(label="If yes, please describe", lines=3, placeholder="Describe any changes")
|
| | basic_difficulty_recent = gr.Radio(label="Do you have difficulty remembering recent events?", choices=["Not at all", "Mild", "Moderate", "Severe"])
|
| | basic_trouble_words = gr.Radio(label="Do you have trouble finding the right words?", choices=["Not at all", "Mild", "Moderate", "Severe"])
|
| | basic_problem_solving = gr.Radio(label="Do you have difficulty with problem-solving or decision-making?", choices=["Not at all", "Mild", "Moderate", "Severe"])
|
| | basic_trouble_appointments = gr.Radio(label="Are you having trouble remembering healthcare appointments or when to take your medicines?", choices=["Yes", "No"])
|
| | basic_changes_reaction = gr.Radio(label="Have you noticed any changes in the way you tend to react to people or events?", choices=["Yes", "No"])
|
| | basic_driving_concern = gr.Radio(label="Does anyone express unusual concern about your driving?", choices=["Yes", "No"])
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section IV: Lifestyle Factors")
|
| | smoking_status = gr.Radio(label="Smoking status", choices=["Yes", "No"])
|
| | alcohol_consumption = gr.Dropdown(label="Alcohol consumption", choices=["None", "Occasional", "Regular", "Heavy"])
|
| | physical_activity = gr.Dropdown(label="Physical activity level", choices=["Sedentary", "Moderate", "Active"])
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section E: Physical & Neurological Exam")
|
| | reflexes_choice = gr.Radio(label="Reflexes", choices=["Normal", "Diminished", "Hyperactive", "Other"], value="Normal")
|
| | reflexes_other = gr.Textbox(label="If Other, please describe", placeholder="Describe reflexes", visible=False)
|
| | reflexes_choice.change(fn=update_visibility, inputs=reflexes_choice, outputs=reflexes_other)
|
| |
|
| | muscle_tone_choice = gr.Radio(label="Muscle tone and strength", choices=["Normal", "Reduced", "Increased", "Other"], value="Normal")
|
| | muscle_tone_other = gr.Textbox(label="If Other, please describe", placeholder="Describe muscle tone and strength", visible=False)
|
| | muscle_tone_choice.change(fn=update_visibility, inputs=muscle_tone_choice, outputs=muscle_tone_other)
|
| |
|
| | coordination_choice = gr.Radio(label="Coordination", choices=["Normal", "Impaired", "Other"], value="Normal")
|
| | coordination_other = gr.Textbox(label="If Other, please describe", placeholder="Describe coordination", visible=False)
|
| | coordination_choice.change(fn=update_visibility, inputs=coordination_choice, outputs=coordination_other)
|
| |
|
| | balance_choice = gr.Radio(label="Balance", choices=["Stable", "Impaired", "Other"], value="Stable")
|
| | balance_other = gr.Textbox(label="If Other, please describe", placeholder="Describe balance", visible=False)
|
| | balance_choice.change(fn=update_visibility, inputs=balance_choice, outputs=balance_other)
|
| |
|
| | sight_hearing_choice = gr.Radio(label="Sense of sight and hearing", choices=["Normal", "Impaired", "Other"], value="Normal")
|
| | sight_hearing_other = gr.Textbox(label="If Other, please describe", placeholder="Describe any issues", visible=False)
|
| | sight_hearing_choice.change(fn=update_visibility, inputs=sight_hearing_choice, outputs=sight_hearing_other)
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section V: Detailed Cognitive & Functional Assessment")
|
| | gr.Markdown("**A. Memory**")
|
| | mem_diff_recent = gr.Radio(label="Do you have difficulty remembering recent events?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | mem_forget_appointments = gr.Radio(label="Do you forget appointments or important dates more often than before?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | mem_repeat = gr.Radio(label="Do you repeat questions or statements during a conversation?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | mem_learning = gr.Radio(label="Do you have trouble learning new information?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | gr.Markdown("**B. Language**")
|
| | lang_find_words = gr.Radio(label="Do you have trouble finding the right words to express yourself?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | lang_understand = gr.Radio(label="Do you have difficulty understanding what people are saying?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | lang_follow = gr.Radio(label="Do you have trouble following conversations?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | gr.Markdown("**C. Executive Function**")
|
| | exec_plan = gr.Radio(label="Do you have difficulty planning and organizing tasks?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | exec_decide = gr.Radio(label="Do you have trouble making decisions or solving problems?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | exec_finance = gr.Radio(label="Do you find it hard to manage your finances?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | gr.Markdown("**D. Visuospatial Skills**")
|
| | visuospatial_judge = gr.Radio(label="Do you have difficulty judging distances?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | visuospatial_navigate = gr.Radio(label="Do you have trouble finding your way around familiar places?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | visuospatial_recognize = gr.Radio(label="Do you have trouble recognizing faces?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | gr.Markdown("**E. Attention and Concentration**")
|
| | attention_focus = gr.Radio(label="Do you have difficulty focusing your attention?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | attention_distracted = gr.Radio(label="Are you easily distracted?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | attention_instructions = gr.Radio(label="Do you have trouble following instructions?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | gr.Markdown("**F. Functional Abilities**")
|
| | func_ADL = gr.Radio(label="Do you need assistance with activities of daily living (bathing, dressing, eating)?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | func_medications = gr.Radio(label="Do you have difficulty managing your medications?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| | func_transport = gr.Radio(label="Do you have difficulty driving or using public transportation?", choices=["Not at all", "Mildly", "Moderately", "Severely"])
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section VI: Behavioral and Emotional Changes")
|
| | behavior_mood_change = gr.Radio(label="Have you noticed any changes in your mood or personality?", choices=["Yes", "No"])
|
| | behavior_mood_change_desc = gr.Textbox(label="If Yes, please describe", lines=3, placeholder="Describe changes")
|
| | behavior_anxiety = gr.Radio(label="Do you feel more anxious or depressed than usual?", choices=["Yes", "No"])
|
| | behavior_irritability = gr.Radio(label="Are you more irritable or agitated than usual?", choices=["Yes", "No"])
|
| | behavior_loss_interest = gr.Radio(label="Have you lost interest in activities you used to enjoy?", choices=["Yes", "No"])
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section VII: Additional Comments")
|
| | additional_comments = gr.Textbox(label="Please provide any additional comments", lines=3, placeholder="Enter additional comments here")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section G: Blood-Based Biomarkers")
|
| | p_tau217 = gr.Textbox(label="p-tau217 (pg/mL)", placeholder="Enter value")
|
| | abeta42 = gr.Textbox(label="Aβ42 (pg/mL)", placeholder="Enter value")
|
| | abeta40 = gr.Textbox(label="Aβ40 (pg/mL)", placeholder="Enter value")
|
| | miRNAs = gr.Textbox(label="miRNAs (List with values)", lines=2, placeholder="e.g., miR-1: 2.5, miR-2: 3.0")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Section H: Basic Cognitive & Functional Assessment Scores")
|
| | mmse = gr.Textbox(label="MMSE Score", placeholder="Enter MMSE score")
|
| | adas_cog = gr.Textbox(label="ADAS-Cog Score", placeholder="Enter ADAS-Cog score")
|
| | faq = gr.Textbox(label="FAQ Score", placeholder="Enter FAQ score")
|
| | ravlt = gr.Textbox(label="RAVLT Score", placeholder="Enter RAVLT score")
|
| |
|
| | with gr.Column():
|
| | gr.Markdown("#### Additional Document (Optional)")
|
| | pdf_report = gr.File(label="Upload PDF Report (optional)", file_types=['.pdf'])
|
| |
|
| | predict_btn_no_mri = gr.Button("Predict Alzheimer's Risk")
|
| | output_no_mri = gr.Textbox(label="Prediction Result", lines=35)
|
| | predict_btn_no_mri.click(
|
| | fn=predict_without_mri,
|
| | inputs=[
|
| | age, gender, ethnicity, education, pincode, mobile,
|
| | family_history, family_relationship, conditions, medications,
|
| | basic_memory_changes, basic_memory_desc, basic_difficulty_recent,
|
| | basic_trouble_words, basic_problem_solving, basic_trouble_appointments,
|
| | basic_changes_reaction, basic_driving_concern,
|
| | smoking_status, alcohol_consumption, physical_activity,
|
| | reflexes_choice, reflexes_other,
|
| | muscle_tone_choice, muscle_tone_other,
|
| | coordination_choice, coordination_other,
|
| | balance_choice, balance_other,
|
| | sight_hearing_choice, sight_hearing_other,
|
| | mem_diff_recent, mem_forget_appointments, mem_repeat, mem_learning,
|
| | lang_find_words, lang_understand, lang_follow,
|
| | exec_plan, exec_decide, exec_finance,
|
| | visuospatial_judge, visuospatial_navigate, visuospatial_recognize,
|
| | attention_focus, attention_distracted, attention_instructions,
|
| | func_ADL, func_medications, func_transport,
|
| | behavior_mood_change, behavior_mood_change_desc, behavior_anxiety, behavior_irritability, behavior_loss_interest,
|
| | additional_comments,
|
| | p_tau217, abeta42, abeta40, miRNAs,
|
| | mmse, adas_cog, faq, ravlt,
|
| | pdf_report
|
| | ],
|
| | outputs=output_no_mri
|
| | )
|
| |
|
| |
|
| |
|
| |
|
| | with gr.Tab("With MRI Image"):
|
| | gr.Markdown("# ADAP System : Alzheimer Detection, Assessment & Prediction System")
|
| | gr.Markdown("### With MRI Data: Upload an MRI scan and provide your demographic details")
|
| |
|
| | with gr.Row():
|
| | image_input = gr.Image(label="Upload MRI Scan", type="pil")
|
| | age_input = gr.Number(label="Age (years)", value=65)
|
| |
|
| | gender_input = gr.Radio(label="Gender", choices=["Male", "Female", "Other"], value="Male")
|
| | ethnicity_input = gr.Textbox(label="Ethnicity", placeholder="Enter your ethnicity")
|
| |
|
| | predict_button = gr.Button("Predict Alzheimer's")
|
| | output_box = gr.Textbox(label="Prediction Result", lines=8)
|
| |
|
| | predict_button.click(fn=predict_alzheimer, inputs=[image_input, age_input, gender_input, ethnicity_input], outputs=output_box)
|
| |
|
| |
|
| | demo.launch()
|
| |
|