import gradio as gr import os import numpy as np from cataract import combined_prediction, save_cataract_prediction_to_db, predict_object_detection from glaucoma import combined_prediction_glaucoma, submit_to_db, predict_image from database import get_db_data, format_db_data, clear_database from chatbot import chatbot, toggle_visibility, update_patient_history, generate_voice_response from PIL import Image # Define the custom theme theme = gr.themes.Soft( primary_hue="neutral", secondary_hue="neutral", neutral_hue="gray", font=[gr.themes.GoogleFont('Libre Franklin'), gr.themes.GoogleFont('Public Sans'), 'system-ui', 'sans-serif'] ).set( body_background_fill="#ffffff", block_background_fill="#0a2b42", block_border_width="1px", block_title_background_fill="#0a2b42", input_background_fill="#ffffff", button_secondary_background_fill="#0a2b42", border_color_primary="#800080", background_fill_secondary="#ffffff", color_accent_soft="transparent" ) # Define custom CSS css = """ body { color: #0a2b42; /* Dark blue font */ } .light body { color: #0a2b42; /* Dark blue font */ } input, textarea { background-color: #ffffff !important; /* White background for text boxes */ color: #0a2b42 !important; /* Dark blue font for text boxes */ } """ logo_url = "https://huggingface.co/spaces/Nexus-Community/nexus-main/resolve/main/Nexus-Hub.png" db_path_cataract = "cataract_results.db" db_path_glaucoma = "glaucoma_results.db" def display_db_data(): """Fetch and format the data from the database for display.""" glaucoma_data, cataract_data = get_db_data(db_path_glaucoma, db_path_cataract) formatted_data = format_db_data(glaucoma_data, cataract_data) return formatted_data def check_db_status(): """Check the status of the databases and return a status message.""" cataract_status = "Loaded" if os.path.exists(db_path_cataract) else "Not Loaded" glaucoma_status = "Loaded" if os.path.exists(db_path_glaucoma) else "Not Loaded" return f"Cataract Database: {cataract_status}\nGlaucoma Database: {glaucoma_status}" def toggle_input_visibility(input_type): if input_type == "Voice": return gr.update(visible=True), gr.update(visible=False) else: return gr.update(visible=False), gr.update(visible=True) def process_image(image): # Run the analyzer model blended_image, red_quantity, green_quantity, blue_quantity, raw_response, stage, save_message, debug_info = combined_prediction(image) # Run the object detection model predicted_image_od, raw_response_od = predict_object_detection(image) return blended_image, red_quantity, green_quantity, blue_quantity, raw_response, stage, save_message, debug_info, predicted_image_od, raw_response_od with gr.Blocks(theme=theme) as demo: gr.HTML(f"Logo") gr.Markdown("## Wellness-Nexus V.1.0") gr.Markdown("This app helps people to diagnose their cataract and glaucoma, both respectively #1 and #2 cause of blindness in the world. You could try our diagnostic model by downloading test image on our Huggingface Repo File.") gr.Markdown("We were sorry that we provide the demo in different file because we misunderstood the 5 minutes rule. we thought that 5 minutes are excluding demo. you can see our demo here : https://youtu.be/yknUdPnbXFg") with gr.Tab("Cataract Screener and Analyzer"): with gr.Row(): image_input = gr.Image(type="numpy", label="Upload an Image") submit_btn = gr.Button("Submit") gr.Examples([["test-cataract-image.jpg"], ["test-cataract-image2.jpg"], ["test-cataract-image3.jpg"], ["test-cataract-image4.jpg"]], inputs=[image_input],label='Or use one of these examples:') with gr.Row(): segmented_image_cataract = gr.Image(type="numpy", label="Segmented Image") predicted_image_od = gr.Image(type="numpy", label="Predicted Image") with gr.Column(): red_quantity_cataract = gr.Slider(label="Red Quantity", minimum=0, maximum=255, interactive=False) green_quantity_cataract = gr.Slider(label="Green Quantity", minimum=0, maximum=255, interactive=False) blue_quantity_cataract = gr.Slider(label="Blue Quantity", minimum=0, maximum=255, interactive=False) with gr.Row(): cataract_stage = gr.Textbox(label="Cataract Stage", interactive=False) raw_response_cataract = gr.Textbox(label="Raw Response", interactive=False) submit_value_btn_cataract = gr.Button("Submit Values to Database") db_response_cataract = gr.Textbox(label="Database Response") debug_cataract = gr.Textbox(label="Debug Message", interactive=False) submit_btn.click( process_image, inputs=image_input, outputs=[ segmented_image_cataract, red_quantity_cataract, green_quantity_cataract, blue_quantity_cataract, raw_response_cataract, cataract_stage, db_response_cataract, debug_cataract, predicted_image_od ] ) submit_value_btn_cataract.click( lambda img, red, green, blue, stage: save_cataract_prediction_to_db(Image.fromarray(img), red, green, blue, stage), inputs=[segmented_image_cataract, red_quantity_cataract, green_quantity_cataract, blue_quantity_cataract, cataract_stage], outputs=[db_response_cataract, debug_cataract] ) with gr.Tab("Glaucoma Analyzer and Screener"): with gr.Row(): image_input = gr.Image(type="numpy", label="Upload an Image") mask_threshold_slider = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, value=0.5, label="Mask Threshold") gr.Examples([["test-glaucoma-image.jpg"], ["test-glaucoma-image2.jpg"], ["test-glaucoma-image3.jpg"], ["test-glaucoma-image4.jpg"]], inputs=[image_input],label='Or use one of these examples:') with gr.Row(): submit_btn_segmentation = gr.Button("Submit Segmentation") submit_btn_od = gr.Button("Submit Object Detection") with gr.Row(): segmented_image = gr.Image(type="numpy", label="Segmented Image") predicted_image_od = gr.Image(type="numpy", label="Predicted Image") with gr.Row(): raw_response_od = gr.Textbox(label="Raw Result") with gr.Column(): cup_area = gr.Textbox(label="Cup Area") disk_area = gr.Textbox(label="Disk Area") rim_area = gr.Textbox(label="Rim Area") rim_to_disc_ratio = gr.Textbox(label="Rim to Disc Ratio") ddls_stage = gr.Textbox(label="DDLS Stage") with gr.Column(): submit_value_btn = gr.Button("Submit Values to Database") db_response = gr.Textbox(label="Database Response") debug_glaucoma = gr.Textbox(label="Debug Message", interactive=False) def process_segmentation_image(img, mask_thresh): # Run the segmentation model return combined_prediction_glaucoma(img, mask_thresh) def process_od_image(img): # Run the object detection model image_with_boxes, raw_predictions = predict_image(img) return image_with_boxes, raw_predictions submit_btn_segmentation.click( fn=process_segmentation_image, inputs=[image_input, mask_threshold_slider], outputs=[ segmented_image, cup_area, disk_area, rim_area, rim_to_disc_ratio, ddls_stage ] ) submit_btn_od.click( fn=process_od_image, inputs=[image_input], outputs=[ predicted_image_od, raw_response_od ] ) submit_value_btn.click( lambda img, cup, disk, rim, ratio, stage: submit_to_db(img, cup, disk, rim, ratio, stage), inputs=[image_input, cup_area, disk_area, rim_area, rim_to_disc_ratio, ddls_stage], outputs=[db_response, debug_glaucoma] ) with gr.Tab("Chatbot"): with gr.Row(): input_type_dropdown = gr.Dropdown(label="Input Type", choices=["Voice", "Text"], value="Voice") tts_model_dropdown = gr.Dropdown(label="TTS Model", choices=["Ryan (ESPnet)", "Nithu (Custom)"], value="Nithu (Custom)") submit_btn_chatbot = gr.Button("Submit") with gr.Row(): audio_input = gr.Audio(type="filepath", label="Record your voice", visible=True) text_input = gr.Textbox(label="Type your question", visible=False) with gr.Row(): answer_textbox = gr.Textbox(label="Answer") answer_audio = gr.Audio(label="Answer as Speech", type="filepath") generate_voice_btn = gr.Button("Generate Voice Response") with gr.Row(): log_messages_textbox = gr.Textbox(label="Log Messages", lines=10) db_status_textbox = gr.Textbox(label="Database Status", interactive=False) input_type_dropdown.change( fn=toggle_input_visibility, inputs=[input_type_dropdown], outputs=[audio_input, text_input] ) submit_btn_chatbot.click( fn=chatbot, inputs=[audio_input, input_type_dropdown, text_input], outputs=[answer_textbox, db_status_textbox] ) generate_voice_btn.click( fn=generate_voice_response, inputs=[tts_model_dropdown, answer_textbox], outputs=[answer_audio, db_status_textbox] ) fetch_db_btn = gr.Button("Fetch Database") fetch_db_btn.click( fn=update_patient_history, inputs=[], outputs=[db_status_textbox] ) with gr.Tab("Database Upload and View"): gr.Markdown("### Store and Retrieve Context Information") db_display = gr.HTML() load_db_btn = gr.Button("Load Database Content") load_db_btn.click(display_db_data, outputs=db_display) # Buttons to clear databases clear_cataract_db_btn = gr.Button("Clear Cataract Database") clear_glaucoma_db_btn = gr.Button("Clear Glaucoma Database") clear_cataract_db_btn.click( fn=clear_database, inputs=[gr.State(value=db_path_cataract), gr.State(value="cataract_results")], outputs=db_display ) clear_glaucoma_db_btn.click( fn=clear_database, inputs=[gr.State(value=db_path_glaucoma), gr.State(value="results")], outputs=db_display ) demo.launch()