nexus-main / app.py
ariankhalfani's picture
Update app.py
54dd1d1 verified
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"<img src='{logo_url}' alt='Logo' width='150'/>")
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()