Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
from PIL import Image | |
import google.generativeai as genai | |
import json | |
from datetime import datetime | |
# Configure Gemini API key (ideally load from environment variable in production) | |
# Using st.secrets for better security in Streamlit | |
api_key = "AIzaSyDWm-Z7X4H-b41r2ZRN61UfABdv81D2Gxo" # In production, use st.secrets["GEMINI_API_KEY"] | |
genai.configure(api_key=api_key) | |
# --- Generation Configuration and Chat Session Setup --- | |
generation_config = { | |
"temperature": 0.8, # Slightly reduced for more consistent medical responses | |
"top_p": 0.95, | |
"top_k": 40, | |
"max_output_tokens": 8192, | |
"response_mime_type": "application/json", # Changed to JSON for structured parsing | |
} | |
model = genai.GenerativeModel( | |
model_name="gemini-1.5-flash", | |
generation_config=generation_config, | |
) | |
# Define the system prompt for structured JSON responses | |
SYSTEM_PROMPT = """ | |
As a highly skilled medical practitioner specializing in image analysis, | |
you are tasked with examining medical images for a renowned hospital. | |
Your expertise is crucial in identifying any anomalies, diseases, or health issues | |
that may be present in the images. | |
Your responsibilities: | |
1. **Detailed Analysis**: Thoroughly examine the image for abnormalities. | |
2. **Analysis Report**: Document findings clearly. | |
3. **Recommendations**: Suggest necessary tests or treatments. | |
4. **Treatments**: Provide possible treatments for better recovery. | |
5. **Risk Level**: Indicate the severity level as "Low", "Medium", "High", or "Critical". | |
**Important Notes**: | |
- Only respond if the image is related to human health. | |
- If the image is unclear, state: "Unable to determine based on the uploaded image." | |
- Include a disclaimer about consulting with a doctor. | |
Format the response as a JSON object with these fields: | |
{ | |
"image_type": "String describing the type of medical image", | |
"detailed_analysis": "Thorough analysis of visible features", | |
"analysis_report": "Summary of findings", | |
"recommendations": "Suggested tests or follow-ups", | |
"treatments": "Possible treatment options", | |
"risk_level": "Low/Medium/High/Critical", | |
"confidence_score": 75, | |
"areas_of_concern": ["List of specific areas or features of concern"] | |
} | |
""" | |
# --- Functions for UI Components --- | |
def display_sidebar(): | |
with st.sidebar: | |
st.title("π₯ Cure Connect") | |
st.subheader("Your AI Medical Assistant") | |
st.markdown("---") | |
st.markdown("### About This Tool") | |
st.markdown(""" | |
Cure Connect uses advanced AI to analyze medical images and provide potential insights. | |
**IMPORTANT:** This tool is for educational purposes only and should not replace professional medical advice. | |
""") | |
st.markdown("---") | |
st.markdown("### Supported Image Types") | |
st.markdown(""" | |
- X-rays | |
- MRI scans | |
- CT scans | |
- Ultrasound images | |
- Dermatological photos | |
""") | |
st.markdown("---") | |
st.markdown("### Usage Tips") | |
st.markdown(""" | |
1. Upload a clear medical image | |
2. Click "Analyze Image" | |
3. Review the AI analysis | |
4. Share results with your healthcare provider | |
""") | |
def create_analysis_card(title, content, color): | |
st.markdown( | |
f""" | |
<div style=" | |
background-color: {color}; | |
padding: 20px; | |
border-radius: 10px; | |
margin-bottom: 10px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
"> | |
<h3 style="color: white;">{title}</h3> | |
<p style="color: white;">{content}</p> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
def display_risk_gauge(risk_level, confidence): | |
# Map risk levels to numerical values | |
risk_values = {"Low": 1, "Medium": 2, "High": 3, "Critical": 4} | |
risk_value = risk_values.get(risk_level, 0) | |
# Colors for different risk levels | |
colors = { | |
"Low": "#4CAF50", # Green | |
"Medium": "#FFC107", # Amber | |
"High": "#FF5722", # Deep Orange | |
"Critical": "#F44336" # Red | |
} | |
col1, col2 = st.columns(2) | |
with col1: | |
st.markdown("### Risk Assessment") | |
st.markdown( | |
f""" | |
<div style=" | |
background-color: {colors.get(risk_level, "#607D8B")}; | |
color: white; | |
text-align: center; | |
padding: 20px; | |
border-radius: 10px; | |
font-size: 24px; | |
font-weight: bold; | |
"> | |
{risk_level} | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
with col2: | |
st.markdown("### AI Confidence") | |
# Ensure confidence is an integer before using it | |
if isinstance(confidence, str): | |
try: | |
confidence = int(float(confidence)) | |
except (ValueError, TypeError): | |
confidence = 75 # Default value if conversion fails | |
st.progress(confidence / 100) | |
st.markdown(f"<h1 style='text-align: center;'>{confidence}%</h1>", unsafe_allow_html=True) | |
def generate_pdf_report(analysis_data, image): | |
# In a real app, you would implement PDF generation here | |
st.download_button( | |
label="π Download PDF Report", | |
data=f"Sample report for {analysis_data['image_type']} - {datetime.now().strftime('%Y-%m-%d')}", | |
file_name="medical_report.txt", | |
mime="text/plain" | |
) | |
# --- Main Application UI --- | |
st.set_page_config(page_title='Cure Connect - Medical Image Analytics', | |
page_icon='π₯', | |
layout='wide', | |
initial_sidebar_state='expanded') | |
# Apply custom CSS for better styling | |
st.markdown(""" | |
<style> | |
.main { | |
padding: 2rem; | |
background-color: #f8f9fa; | |
} | |
.stButton button { | |
background-color: #4285F4; | |
color: white; | |
border-radius: 10px; | |
padding: 0.5rem 1rem; | |
font-weight: bold; | |
} | |
h1, h2, h3 { | |
color: #01579B; | |
} | |
.stProgress > div > div { | |
background-color: #4285F4; | |
} | |
.disclaimer { | |
background-color: #FFECB3; | |
padding: 10px; | |
border-radius: 5px; | |
border-left: 5px solid #FFC107; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Display sidebar | |
display_sidebar() | |
# Main content area | |
st.title("π©Ί Cure Connect - Medical Image Analysis") | |
st.subheader("AI-assisted diagnostic support platform") | |
st.markdown(""" | |
This platform uses advanced AI to analyze medical images and provide potential insights. | |
Upload your medical scan below to get started. | |
""") | |
# Create tabs for different sections | |
tab1, tab2, tab3 = st.tabs(["π Analysis", "βΉοΈ How It Works", "β FAQ"]) | |
with tab1: | |
# File upload with enhanced UI | |
col1, col2 = st.columns([1, 1]) | |
with col1: | |
st.markdown("### Upload Medical Image") | |
uploaded_file = st.file_uploader('Select an image file', | |
type=['png', 'jpg', 'jpeg'], | |
help="Upload a clear, high-resolution medical image") | |
analyze_col, clear_col = st.columns([1, 1]) | |
with analyze_col: | |
analyze_button = st.button('π Analyze Image', use_container_width=True) | |
with clear_col: | |
clear_button = st.button('ποΈ Clear Results', use_container_width=True) | |
# Analysis section | |
if analyze_button and uploaded_file: | |
try: | |
# Open and display the uploaded image | |
img = Image.open(uploaded_file) | |
with col2: | |
st.markdown("### Uploaded Medical Image") | |
st.image(img, use_column_width=True) | |
st.caption("The AI model will analyze this image to identify potential areas of concern.") | |
# Show processing indicator | |
with st.spinner('Analyzing image... Please wait'): | |
# In a production app, you would handle the JSON response properly | |
# For this prototype, we'll simulate a structured response | |
try: | |
# Generate analysis using the system prompt and the uploaded image | |
response = model.generate_content([SYSTEM_PROMPT, img]) | |
# Try to parse as JSON first | |
try: | |
# Parse JSON response | |
analysis_data = json.loads(response.text) | |
except json.JSONDecodeError: | |
# If not valid JSON, create a structured dictionary from text | |
analysis_data = { | |
"image_type": "Medical scan", | |
"detailed_analysis": response.text[:500], | |
"analysis_report": "See detailed analysis", | |
"recommendations": "Consult with a healthcare professional", | |
"treatments": "To be determined by your doctor", | |
"risk_level": "Medium", | |
"confidence_score": 75, | |
"areas_of_concern": ["Unable to parse specific areas from text response"] | |
} | |
# Ensure confidence_score is an integer | |
if isinstance(analysis_data["confidence_score"], str): | |
try: | |
analysis_data["confidence_score"] = int(float(analysis_data["confidence_score"])) | |
except (ValueError, TypeError): | |
analysis_data["confidence_score"] = 75 # Default if conversion fails | |
# Display results in a structured format | |
st.markdown("## Analysis Results") | |
st.markdown(f"### Image Type: {analysis_data['image_type']}") | |
# Display risk gauge | |
display_risk_gauge(analysis_data['risk_level'], analysis_data['confidence_score']) | |
# Display color-coded analysis sections | |
st.markdown("### Key Findings") | |
create_analysis_card("Detailed Analysis", analysis_data['detailed_analysis'], "#0277BD") | |
create_analysis_card("Analysis Report", analysis_data['analysis_report'], "#00897B") | |
create_analysis_card("Recommendations", analysis_data['recommendations'], "#7B1FA2") | |
create_analysis_card("Treatments", analysis_data['treatments'], "#C2185B") | |
# Areas of concern | |
st.markdown("### Areas of Concern") | |
for i, area in enumerate(analysis_data['areas_of_concern']): | |
st.markdown(f"- **Area {i + 1}:** {area}") | |
# Disclaimer | |
st.markdown(""" | |
<div class="disclaimer"> | |
<strong>β οΈ IMPORTANT DISCLAIMER:</strong> This analysis is for informational purposes only | |
and should not be considered medical advice. Always consult with a qualified healthcare | |
professional for proper diagnosis and treatment options. | |
</div> | |
""", unsafe_allow_html=True) | |
# Generate PDF report option | |
st.markdown("### Export Options") | |
generate_pdf_report(analysis_data, img) | |
except Exception as e: | |
st.error(f"Error processing response: {str(e)}") | |
except Exception as e: | |
st.error(f"Analysis failed: {str(e)}") | |
st.error("Please ensure you're using a valid medical image format (JPEG/PNG)") | |
with tab2: | |
st.markdown("## How Cure Connect Works") | |
st.markdown(""" | |
### 1. Image Analysis | |
When you upload a medical image, our AI system processes it using advanced computer vision techniques | |
to identify patterns, abnormalities, and potential areas of concern. | |
### 2. Medical Knowledge Base | |
The analysis is informed by a vast medical knowledge base that includes information about various | |
conditions, diseases, and their visual presentations in medical imaging. | |
### 3. Risk Assessment | |
Based on the analysis, the system provides a risk assessment categorized as: | |
- **Low Risk** (Green): Minor or no abnormalities detected | |
- **Medium Risk** (Amber): Notable findings that should be discussed with a healthcare provider | |
- **High Risk** (Orange): Significant findings that require prompt medical attention | |
- **Critical Risk** (Red): Urgent findings that may require immediate medical intervention | |
### 4. Confidence Score | |
The confidence score indicates how certain the AI is about its analysis based on image quality, | |
clarity of findings, and comparison with known patterns. | |
""") | |
# Add a simple diagram | |
st.markdown(""" | |
``` | |
βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ | |
β Image β β AI β β Analysis β β Results β | |
β Upload β -> β Processing β -> β Generation β -> β Display β | |
βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ | |
``` | |
""") | |
st.warning(""" | |
**Remember:** While our system uses advanced technology to analyze medical images, | |
it is designed to be a supportive tool for healthcare professionals, not a replacement | |
for proper medical consultation and diagnosis. | |
""") | |
with tab3: | |
st.markdown("## Frequently Asked Questions") | |
faq_data = [ | |
{ | |
"question": "How accurate is the AI analysis?", | |
"answer": "The AI analysis provides an estimated confidence score with each result. However, accuracy varies based on image quality, the type of medical condition, and other factors. Always consult with a healthcare professional for accurate diagnosis." | |
}, | |
{ | |
"question": "Is my medical data secure?", | |
"answer": "We take data privacy seriously. Your uploaded images are processed securely and not stored permanently unless explicitly requested. All processing is done in compliance with healthcare data protection standards." | |
}, | |
{ | |
"question": "What types of medical images can I upload?", | |
"answer": "The system can analyze various medical imaging types including X-rays, MRIs, CT scans, ultrasound images, and dermatological photos. The clearer and higher resolution the image, the better the analysis will be." | |
}, | |
{ | |
"question": "How should I use the results?", | |
"answer": "Consider the results as informational insights that you can discuss with your healthcare provider. The analysis is meant to supplement, not replace, professional medical advice." | |
}, | |
{ | |
"question": "Can I share the analysis with my doctor?", | |
"answer": "Yes! You can download a PDF report of the analysis to share with your healthcare provider. This can be a helpful starting point for discussions about your health concerns." | |
} | |
] | |
for i, faq in enumerate(faq_data): | |
with st.expander(f"{i + 1}. {faq['question']}"): | |
st.markdown(faq['answer']) | |
st.markdown(""" | |
### Have more questions? | |
If you have any other questions about using Cure Connect, please contact our support team | |
at support@cureconnect.example.com. | |
""") |