import streamlit as st import google.generativeai as genai # from google import genai from PIL import Image import os from typing import Tuple, Optional import logging # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class MRIScanAnalyzer: def __init__(self, api_key: str): """Initialize the MRI Scan Analyzer with API key and configuration.""" self.client = genai.Client(api_key=api_key) self.setup_page_config() self.apply_custom_styles() @staticmethod def setup_page_config() -> None: """Configure Streamlit page settings.""" st.set_page_config( page_title="MRI Scan Analytics", page_icon="đ§ ", layout="wide" ) @staticmethod def apply_custom_styles() -> None: """Apply custom CSS styles with improved dark theme.""" st.markdown(""" """, unsafe_allow_html=True) def analyze_image(self, img: Image.Image) -> Tuple[Optional[str], Optional[str]]: """ Analyze MRI scan image using Gemini AI. Returns a tuple of (doctor_analysis, patient_analysis). """ try: prompts = { "doctor": """ Provide a structured analysis of this MRI scan for medical professionals without including any introductory or acknowledgment phrases. Follow the structure below: 1. Imaging Observations - Describe key anatomical structures, signal intensities, and any contrast differences 2. Diagnostic Findings - Identify abnormalities and potential areas of concern 3. Clinical Correlation - Suggest possible differential diagnoses and recommendations for further evaluation 4. Technical Quality - Comment on image quality, positioning, and any artifacts present """, "patient": """ Explain the findings of this MRI scan in clear, simple terms for a patient without including any introductory or acknowledgment phrases. Follow the structure below: 1. What We See - Describe the part of the body shown and any notable features in everyday language 2. What It Means - Provide a simple explanation of the findings and their potential implications 3. Next Steps - Outline any recommendations or follow-up actions in a patient-friendly manner """ } responses = {} for audience, prompt in prompts.items(): response = self.client.models.generate_content( model="gemini-2.0-flash", contents=[prompt, img] ) responses[audience] = response.text if hasattr(response, 'text') else None return responses["doctor"], responses["patient"] except Exception as e: logger.error(f"Analysis failed: {str(e)}") return None, None def run(self): """Run the Streamlit MRI scan analysis application.""" st.title("đ§ MRI Scan Analytics") st.markdown(""" Advanced MRI scan analysis powered by AI. Upload your scan for instant insights tailored for both medical professionals and patients. """) col1, col2 = st.columns([1, 1.5]) with col1: uploaded_file = self.handle_file_upload() with col2: if uploaded_file: self.process_analysis(uploaded_file) else: self.show_instructions() self.show_footer() def handle_file_upload(self) -> Optional[object]: """Handle file upload and display image preview.""" uploaded_file = st.file_uploader( "Upload MRI Scan Image", type=["png", "jpg", "jpeg"], help="Supported formats: PNG, JPG, JPEG" ) if uploaded_file: img = Image.open(uploaded_file) st.image(img, caption="Uploaded MRI Scan", use_container_width =True) with st.expander("Image Details"): st.write(f"**Filename:** {uploaded_file.name}") st.write(f"**Size:** {uploaded_file.size/1024:.2f} KB") st.write(f"**Format:** {img.format}") st.write(f"**Dimensions:** {img.size[0]}x{img.size[1]} pixels") return uploaded_file def process_analysis(self, uploaded_file: object) -> None: """Process the uploaded MRI image and display analysis.""" if st.button("đ Analyze MRI Scan", key="analyze_button"): with st.spinner("Analyzing MRI scan..."): img = Image.open(uploaded_file) doctor_analysis, patient_analysis = self.analyze_image(img) if doctor_analysis and patient_analysis: tab1, tab2 = st.tabs(["đ Medical Report", "đĨ Patient Summary"]) with tab1: st.markdown("### Medical Professional's Report") st.markdown(f"
UNDER DEVELOPMENT