|
|
from huggingface_hub import hf_hub_download |
|
|
import tensorflow as tf |
|
|
|
|
|
|
|
|
model_path = hf_hub_download( |
|
|
repo_id="sowmyaiyer21/tetanus", |
|
|
filename="final_tetanus_model.keras" |
|
|
) |
|
|
|
|
|
|
|
|
model = tf.keras.models.load_model(model_path) |
|
|
|
|
|
import os |
|
|
import warnings |
|
|
warnings.filterwarnings('ignore', category=UserWarning) |
|
|
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' |
|
|
|
|
|
import streamlit as st |
|
|
import tensorflow as tf |
|
|
from tensorflow.keras.models import load_model |
|
|
from tensorflow.keras.preprocessing import image |
|
|
import numpy as np |
|
|
import matplotlib.pyplot as plt |
|
|
from PIL import Image |
|
|
import io |
|
|
import plotly.express as px |
|
|
import plotly.graph_objects as go |
|
|
from plotly.subplots import make_subplots |
|
|
|
|
|
|
|
|
st.set_page_config( |
|
|
page_title="Tetanus Risk Classifier", |
|
|
page_icon="🩺", |
|
|
layout="wide", |
|
|
initial_sidebar_state="expanded" |
|
|
) |
|
|
|
|
|
|
|
|
st.markdown(""" |
|
|
<style> |
|
|
/* Import Google Fonts */ |
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); |
|
|
|
|
|
/* Global Styling */ |
|
|
.main { |
|
|
font-family: 'Inter', sans-serif; |
|
|
background: linear-gradient(135deg, #fffaf0 0%, #fdf6e3 100%); |
|
|
min-height: 100vh; |
|
|
} |
|
|
|
|
|
.stApp { |
|
|
background: #fefcf7; |
|
|
color: #3a3a3a; |
|
|
} |
|
|
|
|
|
/* Header Styling */ |
|
|
.main-title { |
|
|
font-size: 3rem; |
|
|
font-weight: 700; |
|
|
text-align: center; |
|
|
color: #2b2b2b; |
|
|
margin-bottom: 0.5rem; |
|
|
text-shadow: 1px 1px 2px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
.sub-title { |
|
|
font-size: 1.2rem; |
|
|
text-align: center; |
|
|
color: #7a6a4f; |
|
|
margin-bottom: 3rem; |
|
|
font-weight: 400; |
|
|
} |
|
|
|
|
|
/* Card Styling */ |
|
|
.custom-card { |
|
|
background: #fffdf8; |
|
|
border-radius: 16px; |
|
|
padding: 2rem; |
|
|
box-shadow: 0 6px 18px rgba(0,0,0,0.08); |
|
|
border: 1px solid #f1e7d0; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.upload-card { |
|
|
background: #fffef9; |
|
|
border-radius: 16px; |
|
|
padding: 2rem; |
|
|
text-align: center; |
|
|
border: 2px dashed #e0d6b8; |
|
|
transition: all 0.3s ease; |
|
|
margin: 1rem 0; |
|
|
} |
|
|
|
|
|
.upload-card:hover { |
|
|
border-color: #b08968; |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 12px 25px rgba(0,0,0,0.1); |
|
|
} |
|
|
|
|
|
/* Risk Level Indicators */ |
|
|
.risk-badge-high { |
|
|
background: #fbe9e7; |
|
|
color: #c62828; |
|
|
padding: 1rem 2rem; |
|
|
border-radius: 12px; |
|
|
text-align: center; |
|
|
font-size: 1.2rem; |
|
|
font-weight: 700; |
|
|
margin: 1rem 0; |
|
|
border: 1px solid #ef9a9a; |
|
|
} |
|
|
|
|
|
.risk-badge-mid { |
|
|
background: #fff8e1; |
|
|
color: #b37400; |
|
|
padding: 1rem 2rem; |
|
|
border-radius: 12px; |
|
|
text-align: center; |
|
|
font-size: 1.2rem; |
|
|
font-weight: 700; |
|
|
margin: 1rem 0; |
|
|
border: 1px solid #ffd54f; |
|
|
} |
|
|
|
|
|
.risk-badge-low { |
|
|
background: #f1fbe9; |
|
|
color: #2e7d32; |
|
|
padding: 1rem 2rem; |
|
|
border-radius: 12px; |
|
|
text-align: center; |
|
|
font-size: 1.2rem; |
|
|
font-weight: 700; |
|
|
margin: 1rem 0; |
|
|
border: 1px solid #a5d6a7; |
|
|
} |
|
|
|
|
|
/* Section Headers */ |
|
|
.section-header { |
|
|
font-size: 1.5rem; |
|
|
font-weight: 700; |
|
|
color: #5c4d36; |
|
|
margin: 2rem 0 1rem 0; |
|
|
padding-bottom: 0.5rem; |
|
|
border-bottom: 2px solid #e0d6b8; |
|
|
text-align: center; |
|
|
} |
|
|
|
|
|
/* Metrics Styling */ |
|
|
.metric-container { |
|
|
background: #fffdf6; |
|
|
border-radius: 12px; |
|
|
padding: 1.2rem; |
|
|
text-align: center; |
|
|
border: 1px solid #e7dbc2; |
|
|
margin: 1rem 0; |
|
|
color: #3a3a3a; |
|
|
} |
|
|
|
|
|
/* Recommendations */ |
|
|
.recommendation-box { |
|
|
padding: 1.5rem; |
|
|
margin: 1.5rem 0; |
|
|
border-radius: 12px; |
|
|
border-left: 5px solid; |
|
|
background: #fffdf9; |
|
|
box-shadow: 0 6px 12px rgba(0,0,0,0.05); |
|
|
} |
|
|
|
|
|
.recommendation-high { |
|
|
border-left-color: #c62828; |
|
|
} |
|
|
|
|
|
.recommendation-mid { |
|
|
border-left-color: #b37400; |
|
|
} |
|
|
|
|
|
.recommendation-low { |
|
|
border-left-color: #2e7d32; |
|
|
} |
|
|
|
|
|
/* Sidebar Styling */ |
|
|
.sidebar .sidebar-content { |
|
|
background: #fffef9; |
|
|
border-radius: 12px; |
|
|
padding: 1rem; |
|
|
margin: 0.5rem 0; |
|
|
box-shadow: 0 4px 8px rgba(0,0,0,0.05); |
|
|
border: 1px solid #f1e7d0; |
|
|
} |
|
|
|
|
|
/* Hide Streamlit branding */ |
|
|
.stDeployButton, footer { |
|
|
display: none !important; |
|
|
} |
|
|
|
|
|
/* Custom info boxes */ |
|
|
.info-box { |
|
|
background: #fffdf6; |
|
|
border-radius: 10px; |
|
|
padding: 1.2rem; |
|
|
margin: 1rem 0; |
|
|
border-left: 4px solid #b08968; |
|
|
color: #3a3a3a; |
|
|
} |
|
|
|
|
|
.info-title { |
|
|
font-weight: 700; |
|
|
color: #7a6a4f; |
|
|
font-size: 1.1rem; |
|
|
margin-bottom: 0.8rem; |
|
|
} |
|
|
|
|
|
/* Progress bars */ |
|
|
.stProgress > div > div > div > div { |
|
|
background: linear-gradient(90deg, #b08968, #d4a373); |
|
|
border-radius: 6px; |
|
|
} |
|
|
|
|
|
/* Upload button styling */ |
|
|
.stFileUploader label { |
|
|
background: #f1e3cf !important; |
|
|
color: #3a3a3a !important; |
|
|
border-radius: 10px !important; |
|
|
border: 1px solid #d9c9a8 !important; |
|
|
padding: 0.8rem 1.5rem !important; |
|
|
font-weight: 600 !important; |
|
|
transition: all 0.3s ease !important; |
|
|
} |
|
|
|
|
|
.stFileUploader label:hover { |
|
|
background: #e6d3b3 !important; |
|
|
transform: translateY(-2px) !important; |
|
|
box-shadow: 0 6px 12px rgba(0,0,0,0.15) !important; |
|
|
} |
|
|
.stAlert div { |
|
|
color: black !important; |
|
|
} |
|
|
</style> |
|
|
|
|
|
|
|
|
|
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
st.markdown('<h1 class="main-title">Tetanus Risk Assessment System</h1>', unsafe_allow_html=True) |
|
|
st.markdown('<p class="sub-title">AI-powered medical imaging analysis for tetanus risk evaluation</p>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
with st.sidebar: |
|
|
st.markdown('<div class="sidebar-content">', unsafe_allow_html=True) |
|
|
st.markdown("## Configuration") |
|
|
|
|
|
|
|
|
model_path = st.text_input( |
|
|
"Model File Path", |
|
|
value="final_tetanus_model.keras", |
|
|
help="Enter the path to your trained .keras model file" |
|
|
) |
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
st.markdown("## Risk Categories") |
|
|
|
|
|
col1, col2 = st.columns([1, 3]) |
|
|
with col1: |
|
|
st.markdown("●", unsafe_allow_html=True) |
|
|
st.markdown("●", unsafe_allow_html=True) |
|
|
st.markdown("●", unsafe_allow_html=True) |
|
|
with col2: |
|
|
st.markdown("**High Risk** - Immediate medical attention") |
|
|
st.markdown("**Moderate Risk** - Clinical evaluation needed") |
|
|
st.markdown("**Low Risk** - Standard wound care") |
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
with st.expander("Detailed Risk Information"): |
|
|
st.markdown(""" |
|
|
**High Risk Indicators:** |
|
|
- Deep puncture wounds |
|
|
- Contaminated wounds |
|
|
- Foreign object presence |
|
|
- Rusty metal exposure |
|
|
|
|
|
**Moderate Risk Indicators:** |
|
|
- Minor cuts with debris |
|
|
- Moderate depth wounds |
|
|
- Delayed treatment (>6 hours) |
|
|
- Animal bites |
|
|
|
|
|
**Low Risk Indicators:** |
|
|
- Superficial cuts |
|
|
- Clean wounds |
|
|
- Fresh injuries (<1 hour) |
|
|
- Proper wound cleaning |
|
|
""") |
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
st.markdown("## System Info") |
|
|
st.info("**Model Status:** Ready for analysis") |
|
|
st.info("**Processing:** Real-time inference") |
|
|
st.info("**Accuracy:** Clinical-grade assessment") |
|
|
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
@st.cache_resource |
|
|
def load_tetanus_model(model_path): |
|
|
"""Load the trained model with enhanced error handling""" |
|
|
try: |
|
|
if os.path.exists(model_path): |
|
|
model = load_model(model_path) |
|
|
return model, None |
|
|
else: |
|
|
return None, f"Model file not found at: {model_path}" |
|
|
except Exception as e: |
|
|
return None, f"Error loading model: {str(e)}" |
|
|
|
|
|
|
|
|
def preprocess_image(img): |
|
|
"""Enhanced image preprocessing with validation""" |
|
|
if img.mode != 'RGB': |
|
|
img = img.convert('RGB') |
|
|
|
|
|
|
|
|
original_size = img.size |
|
|
|
|
|
|
|
|
img = img.resize((224, 224)) |
|
|
img_array = image.img_to_array(img) |
|
|
img_array = np.expand_dims(img_array, axis=0) |
|
|
img_array = img_array / 255.0 |
|
|
|
|
|
return img_array, original_size |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_prediction(model, img_array): |
|
|
"""Make prediction with detailed probability analysis""" |
|
|
try: |
|
|
risk_categories = ['High Risk', 'Mid Risk', 'Low Risk'] |
|
|
|
|
|
|
|
|
prediction = model.predict(img_array, verbose=0) |
|
|
|
|
|
predicted_index = np.argmax(prediction) |
|
|
predicted_label = risk_categories[predicted_index] |
|
|
confidence = prediction[0][predicted_index] * 100 |
|
|
all_probabilities = prediction[0] * 100 |
|
|
|
|
|
return predicted_label, confidence, all_probabilities, None |
|
|
except Exception as e: |
|
|
return None, None, None, f"Error making prediction: {str(e)}" |
|
|
|
|
|
|
|
|
def create_confidence_chart(confidence): |
|
|
"""Create an enhanced confidence visualization""" |
|
|
fig = go.Figure(go.Indicator( |
|
|
mode = "gauge+number+delta", |
|
|
value = confidence, |
|
|
domain = {'x': [0, 1], 'y': [0, 1]}, |
|
|
title = {'text': "Confidence Level"}, |
|
|
delta = {'reference': 80}, |
|
|
gauge = { |
|
|
'axis': {'range': [None, 100]}, |
|
|
'bar': {'color': "#4f46e5"}, |
|
|
'steps': [ |
|
|
{'range': [0, 50], 'color': "#fee2e2"}, |
|
|
{'range': [50, 80], 'color': "#fef3c7"}, |
|
|
{'range': [80, 100], 'color': "#d1fae5"}], |
|
|
'threshold': { |
|
|
'line': {'color': "red", 'width': 4}, |
|
|
'thickness': 0.75, |
|
|
'value': 90}})) |
|
|
|
|
|
fig.update_layout( |
|
|
height=300, |
|
|
font={'color': "#4f46e5", 'family': "Inter"}, |
|
|
paper_bgcolor="rgba(0,0,0,0)", |
|
|
plot_bgcolor="rgba(0,0,0,0)" |
|
|
) |
|
|
return fig |
|
|
|
|
|
def create_probability_chart(probabilities, categories): |
|
|
"""Create enhanced probability visualization""" |
|
|
colors = ['#ef4444', '#f59e0b', '#10b981'] |
|
|
|
|
|
fig = go.Figure(data=[ |
|
|
go.Bar( |
|
|
x=categories, |
|
|
y=probabilities, |
|
|
marker_color=colors, |
|
|
text=[f'{p:.1f}%' for p in probabilities], |
|
|
textposition='auto', |
|
|
) |
|
|
]) |
|
|
|
|
|
fig.update_layout( |
|
|
title="Risk Probability Distribution", |
|
|
xaxis_title="Risk Categories", |
|
|
yaxis_title="Probability (%)", |
|
|
font={'color': "#374151", 'family': "Inter"}, |
|
|
paper_bgcolor="rgba(0,0,0,0)", |
|
|
plot_bgcolor="rgba(0,0,0,0)", |
|
|
height=400 |
|
|
) |
|
|
|
|
|
return fig |
|
|
|
|
|
|
|
|
def main(): |
|
|
|
|
|
with st.spinner("Loading AI model..."): |
|
|
model, error = load_tetanus_model(model_path) |
|
|
|
|
|
if error: |
|
|
st.error(f"**Model Loading Error:** {error}") |
|
|
st.info("**Tip:** Please verify the model path in the sidebar configuration.") |
|
|
st.stop() |
|
|
|
|
|
|
|
|
st.info("**AI Model loaded successfully!** Ready for medical image analysis.") |
|
|
|
|
|
|
|
|
col1, col2 = st.columns([1.2, 1], gap="large") |
|
|
|
|
|
with col1: |
|
|
|
|
|
st.markdown('<div class="custom-card">', unsafe_allow_html=True) |
|
|
st.markdown('<h2 class="section-header">Upload or Capture Medical Image</h2>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
uploaded_file = st.file_uploader( |
|
|
"Upload Medical Image", |
|
|
type=['png', 'jpg', 'jpeg', 'bmp', 'tiff'], |
|
|
help="Upload a clear, high-quality image of the wound for analysis", |
|
|
label_visibility="collapsed" |
|
|
) |
|
|
|
|
|
|
|
|
camera_file = st.camera_input( |
|
|
"Capture Medical Image", |
|
|
label_visibility="collapsed" |
|
|
) |
|
|
|
|
|
|
|
|
final_file = uploaded_file if uploaded_file is not None else camera_file |
|
|
|
|
|
if final_file is not None: |
|
|
|
|
|
img = Image.open(final_file) |
|
|
st.image(img, caption="Medical Image for Analysis", use_container_width=True) |
|
|
|
|
|
|
|
|
img_array, original_size = preprocess_image(img) |
|
|
|
|
|
col_meta1, col_meta2, col_meta3 = st.columns(3) |
|
|
with col_meta1: |
|
|
st.markdown('<div class="metric-container">', unsafe_allow_html=True) |
|
|
st.metric("Dimensions", f"{original_size[0]} × {original_size[1]}") |
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
with col_meta2: |
|
|
st.markdown('<div class="metric-container">', unsafe_allow_html=True) |
|
|
st.metric("Format", img.format if hasattr(img, 'format') else 'Unknown') |
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
with col_meta3: |
|
|
st.markdown('<div class="metric-container">', unsafe_allow_html=True) |
|
|
file_size = len(final_file.getvalue()) / 1024 |
|
|
st.metric("Size", f"{file_size:.1f} KB") |
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
else: |
|
|
|
|
|
st.markdown("### Drop your medical image here or capture using the camera") |
|
|
st.markdown("Supported formats: PNG, JPG, JPEG, BMP, TIFF") |
|
|
st.markdown("Maximum file size: 10MB") |
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
with col2: |
|
|
|
|
|
st.markdown('<div class="custom-card">', unsafe_allow_html=True) |
|
|
st.markdown('<h2 class="section-header">Results</h2>', unsafe_allow_html=True) |
|
|
|
|
|
if uploaded_file is not None or camera_file is not None: |
|
|
|
|
|
file_source = uploaded_file if uploaded_file is not None else camera_file |
|
|
img = Image.open(file_source) |
|
|
img_array, _ = preprocess_image(img) |
|
|
|
|
|
|
|
|
with st.spinner("Analyzing image with AI model..."): |
|
|
predicted_label, confidence, all_probabilities, pred_error = make_prediction(model, img_array) |
|
|
|
|
|
if pred_error: |
|
|
st.error(f"❌ **Prediction Error:** {pred_error}") |
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
st.stop() |
|
|
|
|
|
|
|
|
if predicted_label == "High Risk": |
|
|
st.markdown('<div class="risk-badge-high">HIGH RISK DETECTED</div>', unsafe_allow_html=True) |
|
|
elif predicted_label == "Mid Risk": |
|
|
st.markdown('<div class="risk-badge-mid">MODERATE RISK DETECTED</div>', unsafe_allow_html=True) |
|
|
else: |
|
|
st.markdown('<div class="risk-badge-low">LOW RISK DETECTED</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
st.markdown("### Confidence Analysis") |
|
|
confidence_chart = create_confidence_chart(confidence) |
|
|
st.plotly_chart(confidence_chart, use_container_width=True) |
|
|
|
|
|
else: |
|
|
|
|
|
st.markdown(""" |
|
|
<div style="text-align: center; padding: 3rem; color: #9ca3af;"> |
|
|
<div style="font-size: 4rem; margin-bottom: 1rem;">⚕</div> |
|
|
<h3>Ready for Analysis</h3> |
|
|
<p>Upload or capture a medical image to begin AI-powered risk assessment</p> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
if (uploaded_file is not None or camera_file is not None) and 'predicted_label' in locals(): |
|
|
st.markdown('<div class="custom-card">', unsafe_allow_html=True) |
|
|
st.markdown('<h2 class="section-header">Detailed Probability Analysis</h2>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
risk_categories = ['High Risk', 'Mid Risk', 'Low Risk'] |
|
|
prob_chart = create_probability_chart(all_probabilities, risk_categories) |
|
|
st.plotly_chart(prob_chart, use_container_width=True) |
|
|
|
|
|
|
|
|
col1, col2, col3 = st.columns(3) |
|
|
categories = ['High Risk', 'Mid Risk', 'Low Risk'] |
|
|
colors = ['#ef4444', '#f59e0b', '#10b981'] |
|
|
|
|
|
for i, (col, category, color, prob) in enumerate(zip([col1, col2, col3], categories, colors, all_probabilities)): |
|
|
with col: |
|
|
st.markdown(f""" |
|
|
<div style="text-align: center; padding: 1rem; background: rgba(255,255,255,0.8); border-radius: 10px; margin: 0.5rem 0;"> |
|
|
<div style="width: 20px; height: 20px; background-color: {color}; border-radius: 50%; margin: 0 auto 0.5rem;"></div> |
|
|
<div style="font-weight: 700; font-size: 1.2rem;">{category}</div> |
|
|
<div style="font-size: 1.5rem; font-weight: 600; color: #4f46e5;">{prob:.1f}%</div> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
st.markdown('<div class="custom-card">', unsafe_allow_html=True) |
|
|
st.markdown('<h2 class="section-header">Medical Recommendations</h2>', unsafe_allow_html=True) |
|
|
|
|
|
if predicted_label == "High Risk": |
|
|
st.markdown(""" |
|
|
<div class="recommendation-box recommendation-high"> |
|
|
<h3 style="color: #dc2626; font-size: 1.5rem; margin-bottom: 1rem;">IMMEDIATE MEDICAL ATTENTION REQUIRED</h3> |
|
|
<ul style="font-size: 1.1rem; line-height: 1.8;"> |
|
|
<li style="color:black;"><strong>Seek emergency medical care immediately</strong></li> |
|
|
<li style="color:black;" >Do not delay professional treatment</li> |
|
|
<li style="color:black;">Verify tetanus vaccination status with healthcare provider</li> |
|
|
<li style="color:black;">Clean wound with sterile saline if available</li> |
|
|
<li style="color:black;">Avoid home remedies - professional care is essential</li> |
|
|
<li style="color:black;">Monitor for signs of infection or tetanus symptoms</li> |
|
|
</ul> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
elif predicted_label == "Mid Risk": |
|
|
st.markdown(""" |
|
|
<div class="recommendation-box recommendation-mid"> |
|
|
<h3 style="color: #d97706; font-size: 1.5rem; margin-bottom: 1rem;">CLINICAL EVALUATION RECOMMENDED</h3> |
|
|
<ul style="font-size: 1.1rem; line-height: 1.8;"> |
|
|
<li style="color:black;"><strong>Clean wound thoroughly with soap and water</strong></li> |
|
|
<li style="color:black;">Monitor for signs of infection (redness, swelling, warmth)</li> |
|
|
<li style="color:black;">Consult healthcare provider within 24 hours</li> |
|
|
<li style="color:black;">Update tetanus vaccination if necessary (>5 years)</li> |
|
|
<li style="color:black;">Apply clean dressing and change regularly</li> |
|
|
<li style="color:black;">Take photos to track healing progress</li> |
|
|
</ul> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
else: |
|
|
st.markdown(""" |
|
|
<div class="recommendation-box recommendation-low"> |
|
|
<h3 style="color: #059669; font-size: 1.5rem; margin-bottom: 1rem;">STANDARD WOUND CARE PROTOCOL</h3> |
|
|
<ul style="font-size: 1.1rem; line-height: 1.8; color:black;"> |
|
|
<li style="color:black;"><strong>Clean wound gently with soap and water</strong></li> |
|
|
<li style="color:black;">Apply antiseptic and clean bandage</li> |
|
|
<li style="color:black;">Monitor for changes or infection signs</li> |
|
|
<li style="color:black;">Keep wound clean and dry</li> |
|
|
<li style="color:black;">Consider tetanus booster if >5 years since last vaccination</li> |
|
|
<li style="color:black;">Follow up if wound doesn't heal properly</li> |
|
|
</ul> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
st.markdown('</div>', unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
info_col1, info_col2 = st.columns(2) |
|
|
|
|
|
with info_col1: |
|
|
st.markdown(""" |
|
|
<div class="info-box"> |
|
|
<div class="info-title">System Overview</div> |
|
|
<p><strong>AI Technology:</strong> Convolutional Neural Networks</p> |
|
|
<p><strong>Processing:</strong> Real-time image analysis</p> |
|
|
<p><strong>Classification:</strong> Three-tier risk assessment</p> |
|
|
<p><strong>Guidelines:</strong> Evidence-based medical protocols</p> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
with info_col2: |
|
|
st.markdown(""" |
|
|
<div class="info-box"> |
|
|
<div class="info-title">Technical Specs</div> |
|
|
<p><strong>Model Architecture:</strong> Deep CNN</p> |
|
|
<p><strong>Input Resolution:</strong> 224×224 pixels</p> |
|
|
<p><strong>Framework:</strong> TensorFlow/Keras</p> |
|
|
<p><strong>Inference Time:</strong> <2 seconds</p> |
|
|
</div> |
|
|
""", unsafe_allow_html=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |
|
|
|