Spaces:
No application file
No application file
| import os | |
| import cv2 | |
| import numpy as np | |
| import streamlit as st | |
| from google.generativeai import configure, GenerativeModel | |
| import base64 | |
| from datetime import datetime | |
| # Page configuration | |
| st.set_page_config( | |
| page_title="Advanced Dental X-Ray Analysis System", | |
| page_icon="🦷", | |
| layout="wide" | |
| ) | |
| # Custom CSS for better appearance | |
| st.markdown(""" | |
| <style> | |
| .main { | |
| padding: 2rem; | |
| } | |
| .stButton>button { | |
| width: 100%; | |
| background-color: #0083B8; | |
| color: white; | |
| } | |
| .disclaimer { | |
| background-color: #FFF3CD; | |
| padding: 1rem; | |
| border-radius: 5px; | |
| margin: 1rem 0; | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Main title with professional styling | |
| st.title("🦷 Advanced Dental X-Ray Analysis System") | |
| st.markdown("---") | |
| # Initialize session state | |
| if 'patient_history' not in st.session_state: | |
| st.session_state.patient_history = {} | |
| # Sidebar for API configuration | |
| with st.sidebar: | |
| st.header("Configuration") | |
| api_key = st.text_input("Your API Key", type="password") | |
| if not api_key: | |
| api_key = os.getenv("GEMINI_API_KEY") | |
| if not api_key: | |
| st.error("⚠️ Please provide an API key.") | |
| st.stop() | |
| st.markdown("---") | |
| st.header("Patient Information") | |
| # Patient history form | |
| with st.form("patient_history"): | |
| st.session_state.patient_history.update({ | |
| 'name': st.text_input("Patient Name"), | |
| 'age': st.number_input("Age", 1, 120), | |
| 'gender': st.selectbox("Gender", ["Male", "Female", "Other"]), | |
| 'medical_history': st.multiselect("Medical History", | |
| ["Diabetes", "Hypertension", "Heart Disease", "None"]), | |
| 'dental_complaints': st.text_area("Current Dental Complaints"), | |
| 'previous_treatments': st.text_area("Previous Dental Treatments"), | |
| 'smoking': st.selectbox("Smoking Status", ["Non-smoker", "Former smoker", "Current smoker"]), | |
| 'last_dental_visit': st.date_input("Last Dental Visit") | |
| }) | |
| submit_button = st.form_submit_button("Save Patient Information") | |
| # Configure Gemini Pro | |
| configure(api_key=api_key) | |
| model = GenerativeModel("gemini-pro") | |
| # Main content area | |
| col1, col2 = st.columns([1, 1]) | |
| with col1: | |
| st.header("X-Ray Upload & Processing") | |
| uploaded_file = st.file_uploader("Upload a dental X-ray image", type=["jpg", "jpeg", "png"]) | |
| if uploaded_file: | |
| # Display original image | |
| st.image(uploaded_file, caption="Original X-ray", use_column_width=True) | |
| # Image processing options | |
| st.subheader("Image Enhancement Options") | |
| denoise_strength = st.slider("Denoising Strength", 1, 20, 10) | |
| contrast_limit = st.slider("Contrast Enhancement", 1.0, 5.0, 2.0) | |
| # Process image | |
| img = cv2.imdecode(np.frombuffer(uploaded_file.read(), np.uint8), cv2.IMREAD_GRAYSCALE) | |
| # Enhanced preprocessing | |
| img = cv2.fastNlMeansDenoising(img, None, denoise_strength, 7, 21) | |
| clahe = cv2.createCLAHE(clipLimit=contrast_limit, tileGridSize=(8, 8)) | |
| img = clahe.apply(img) | |
| # Display enhanced image | |
| st.image(img, caption="Enhanced X-ray", use_column_width=True) | |
| # Encode image | |
| _, img_encoded = cv2.imencode('.png', img) | |
| base64_image = base64.b64encode(img_encoded).decode('utf-8') | |
| with col2: | |
| if uploaded_file and 'name' in st.session_state.patient_history and st.session_state.patient_history['name']: | |
| st.header("Analysis & Results") | |
| # Analysis options | |
| analysis_type = st.multiselect("Select Analysis Focus Areas", | |
| ["Cavity Detection", "Bone Density", "Root Canal Assessment", | |
| "Periodontal Status", "Wisdom Teeth", "Overall Assessment"]) | |
| if st.button("Generate Analysis"): | |
| with st.spinner("Analyzing X-ray..."): | |
| # Construct detailed prompt | |
| prompt = f""" | |
| Please analyze this dental X-ray image with the following context: | |
| Patient Information: | |
| - Name: {st.session_state.patient_history['name']} | |
| - Age: {st.session_state.patient_history['age']} | |
| - Gender: {st.session_state.patient_history['gender']} | |
| - Medical History: {', '.join(st.session_state.patient_history['medical_history'])} | |
| - Current Complaints: {st.session_state.patient_history['dental_complaints']} | |
| - Previous Treatments: {st.session_state.patient_history['previous_treatments']} | |
| - Smoking Status: {st.session_state.patient_history['smoking']} | |
| Focus Areas: {', '.join(analysis_type)} | |
| Please provide a detailed analysis including: | |
| 1. Identified abnormalities or concerns | |
| 2. Potential diagnosis considerations | |
| 3. Recommended additional examinations if needed | |
| 4. Treatment suggestions | |
| 5. Risk factors based on patient history | |
| Format the response in a clear, structured manner. | |
| """ | |
| response = model.generate_content(prompt) | |
| # Display results | |
| st.markdown("### Analysis Results") | |
| st.write(response.text) | |
| # Generate report | |
| st.markdown("### Report Generation") | |
| if st.button("Generate PDF Report"): | |
| st.info("Report generation functionality can be implemented here") | |
| # Display disclaimer | |
| st.markdown(""" | |
| <div class="disclaimer"> | |
| <h4>⚠️ Medical Disclaimer</h4> | |
| <p>This analysis is generated by AI and is for informational purposes only. | |
| It should not be considered as a definitive diagnosis. Please consult with a | |
| qualified dental professional for accurate diagnosis and treatment planning.</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| else: | |
| st.info("Please upload an X-ray image and complete patient information to proceed with analysis.") | |
| # Footer | |
| st.markdown("---") | |
| st.markdown( | |
| """ | |
| <div style='text-align: center'> | |
| <p>Advanced Dental X-Ray Analysis System v2.0</p> | |
| <p>Developed by:</p> | |
| <p>Supervised and reviewed by:</p> | |
| <p>Participants:</p> | |
| <p>UI Designer:</p> | |
| </div> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |