import gradio as gr import random, math from transformers import pipeline from PyPDF2 import PdfReader ############################## # Helper Functions ############################## 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) # pdf_file.name gives the filename in Colab text = "" for page in reader.pages: text += page.extract_text() return text except Exception as e: return f"Error extracting PDF text: {e}" ############################## # Callback to update visibility of "Other" fields ############################## def update_visibility(choice): if choice == "Other": return gr.update(visible=True) else: return gr.update(visible=False) ############################## # Prediction function for non-MRI data (with PDF extraction) ############################## def predict_without_mri( # Section A: Patient Demographics age, gender, ethnicity, education, pincode, mobile, # Section B: Medical History family_history, family_relationship, conditions, medications, # Section C: Basic Cognitive Assessment basic_memory_changes, basic_memory_desc, basic_difficulty_recent, basic_trouble_words, basic_problem_solving, basic_trouble_appointments, basic_changes_reaction, basic_driving_concern, # Section IV: Lifestyle Factors smoking_status, alcohol_consumption, physical_activity, # Section E: Physical & Neurological Exam (using "Other" options) reflexes_choice, reflexes_other, muscle_tone_choice, muscle_tone_other, coordination_choice, coordination_other, balance_choice, balance_other, sight_hearing_choice, sight_hearing_other, # Section V: Detailed Cognitive & Functional Assessment # A. Memory mem_diff_recent, mem_forget_appointments, mem_repeat, mem_learning, # B. Language lang_find_words, lang_understand, lang_follow, # C. Executive Function exec_plan, exec_decide, exec_finance, # D. Visuospatial Skills visuospatial_judge, visuospatial_navigate, visuospatial_recognize, # E. Attention and Concentration attention_focus, attention_distracted, attention_instructions, # F. Functional Abilities func_ADL, func_medications, func_transport, # Section VI: Behavioral and Emotional Changes behavior_mood_change, behavior_mood_change_desc, behavior_anxiety, behavior_irritability, behavior_loss_interest, # Section VII: Additional Comments additional_comments, # Section G: Blood-Based Biomarkers p_tau217, abeta42, abeta40, miRNAs, # Section H: Basic Cognitive & Functional Assessment Scores mmse, adas_cog, faq, ravlt, # PDF Report Upload (new) pdf_report ): # Convert numeric strings to floats 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 # avoid division by zero try: abeta_ratio = abeta42 / abeta40 except: abeta_ratio = 0.0 # Dummy calculative model with illustrative coefficients 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" # Extract text from PDF if provided 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 ############################## # Prediction function for MRI using a Hugging Face pipeline ############################## pipe = pipeline("image-classification", model="evanrsl/resnet-Alzheimer") #pipe = pipeline("image-classification", model="evanrsl/resnet-Alzheimer") #def predict_with_mri(image): 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. """ # Run the pipeline on the input image results = pipe(image) # Assume the pipeline returns a list of dictionaries; we'll take the top result. print(results) label = results[0]['label'] confidence = results[0]['score'] * 100 # convert to percentage # Create output text combining prediction and demographic info 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 ############################## # Gradio App Interface Configuration ############################## with gr.Blocks() as demo: gr.Markdown("# ADAP System : Alzheimer Detection, Assessment & Prediction System") with gr.Tabs(): ########################### # Tab: Without MRI Data # ########################### with gr.Tab("Without MRI Data"): gr.Markdown("### Please fill out the following form:") # Section A: Patient Demographics 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") # Section B: Medical History 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") # Section C: Basic Cognitive Assessment 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"]) # Section IV: Lifestyle Factors 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"]) # Section E: Physical & Neurological Exam with "Other" options 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) # Section V: Detailed Cognitive & Functional Assessment 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"]) # Section VI: Behavioral and Emotional Changes 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"]) # Section VII: Additional Comments 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") # Section G: Blood-Based Biomarkers 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") # Section H: Basic Cognitive & Functional Assessment Scores 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") # Section: Upload PDF Report for additional details 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 ) ########################### # Tab: With MRI Image # ########################### 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) # Launch the Gradio app demo.launch()