Spaces:
Sleeping
Sleeping
File size: 5,374 Bytes
4db7613 75166d9 8a9707a decc13a 75166d9 d475230 decc13a 75166d9 decc13a fe48a9c 8a9707a decc13a fe48a9c decc13a 9b3cdbf decc13a d475230 decc13a d475230 decc13a 75166d9 8a9707a d475230 981eb1e d475230 8a9707a d475230 8a9707a d475230 8a9707a d475230 8a9707a 4db7613 8a9707a |
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 |
import gradio as gr
import pandas as pd
import time
from collections import defaultdict
# Load the symptom-to-disease mapping
symptom_data = {
"Shortness of breath": {
"questions": [
"Do you also have chest pain?",
"Do you feel fatigued often?",
"Have you noticed swelling in your legs?"
],
"diseases": ["Atelectasis", "Emphysema", "Edema"],
"weights_yes": [30, 30, 40],
"weights_no": [10, 20, 30]
},
"Persistent cough": {
"questions": [
"Is your cough dry or with mucus?",
"Do you experience fever?",
"Do you have difficulty breathing?"
],
"diseases": ["Pneumonia", "Fibrosis", "Infiltration"],
"weights_yes": [35, 30, 35],
"weights_no": [10, 15, 20]
},
"Sharp chest pain": {
"questions": [
"Does it worsen with deep breaths?",
"Do you feel lightheaded?",
"Have you had recent trauma or surgery?"
],
"diseases": ["Pneumothorax", "Effusion", "Cardiomegaly"],
"weights_yes": [40, 30, 30],
"weights_no": [15, 20, 25]
},
"Fatigue & swelling": {
"questions": [
"Do you feel breathless when lying down?",
"Have you gained weight suddenly?",
"Do you experience irregular heartbeat?"
],
"diseases": ["Edema", "Cardiomegaly"],
"weights_yes": [50, 30, 20],
"weights_no": [20, 15, 15]
},
"Chronic wheezing": {
"questions": [
"Do you have a history of smoking?",
"Do you feel tightness in your chest?",
"Do you have frequent lung infections?"
],
"diseases": ["Emphysema", "Fibrosis"],
"weights_yes": [40, 30, 30],
"weights_no": [15, 25, 20]
}
}
# Global variables to track user state
user_state = {}
def chatbot(user_input):
if "state" not in user_state:
user_state["state"] = "greet"
if user_state["state"] == "greet":
user_state["state"] = "ask_symptom"
return "Hello! I'm a medical AI assistant. Please describe your primary symptom."
elif user_state["state"] == "ask_symptom":
if user_input not in symptom_data:
return "I don't recognize that symptom. Please enter one of these: " + ", ".join(symptom_data.keys())
user_state["symptom"] = user_input
user_state["state"] = "ask_duration"
return "How long have you been experiencing this symptom? (Less than a week / More than a week)"
elif user_state["state"] == "ask_duration":
if user_input.lower() == "less than a week":
user_state.clear()
return "It might be a temporary issue. Please monitor your symptoms and consult a doctor if they persist."
elif user_input.lower() == "more than a week":
user_state["state"] = "follow_up"
user_state["current_question"] = 0
user_state["disease_scores"] = defaultdict(int)
return symptom_data[user_state["symptom"]]["questions"][0]
else:
return "Please respond with 'Less than a week' or 'More than a week'."
elif user_state["state"] == "follow_up":
symptom = user_state["symptom"]
question_index = user_state["current_question"]
# Update probabilities
if user_input.lower() == "yes":
for i, disease in enumerate(symptom_data[symptom]["diseases"]):
user_state["disease_scores"][disease] += symptom_data[symptom]["weights_yes"][i]
else:
for i, disease in enumerate(symptom_data[symptom]["diseases"]):
user_state["disease_scores"][disease] += symptom_data[symptom]["weights_no"][i]
# Move to the next question or finish
user_state["current_question"] += 1
if user_state["current_question"] < len(symptom_data[symptom]["questions"]):
return symptom_data[symptom]["questions"][user_state["current_question"]]
# Final diagnosis
probable_disease = max(user_state["disease_scores"], key=user_state["disease_scores"].get)
user_state.clear()
return f"Based on your symptoms, the most likely condition is: {probable_disease}. Please consult a doctor for confirmation."
# Gradio Chatbot UI with improved features
with gr.Blocks() as demo:
gr.Markdown("# Conversational Image Recognition Assistant: AI-Powered X-ray Diagnosis for Healthcare")
chatbot_ui = gr.Chatbot()
user_input = gr.Textbox(placeholder="Enter your response...", label="Your Message")
submit = gr.Button("Send")
clear_chat = gr.Button("Clear Chat")
def respond(user_message, history):
history.append((user_message, "Thinking...")) # Show thinking message
yield history, "" # Immediate update
time.sleep(1.5) # Simulate processing delay
bot_response = chatbot(user_message)
history[-1] = (user_message, bot_response) # Update with real response
yield history, ""
submit.click(respond, [user_input, chatbot_ui], [chatbot_ui, user_input])
user_input.submit(respond, [user_input, chatbot_ui], [chatbot_ui, user_input])
clear_chat.click(lambda: ([], ""), outputs=[chatbot_ui, user_input])
demo.launch() |