|
import streamlit as st |
|
from transformers import pipeline |
|
import torch |
|
from PIL import Image, ImageDraw |
|
import io |
|
|
|
st.set_page_config(page_title="Détection de Fractures Osseuses", layout="wide") |
|
|
|
@st.cache_resource |
|
def load_model(): |
|
return pipeline("object-detection", model="D3STRON/bone-fracture-detr") |
|
|
|
def draw_boxes(image, predictions): |
|
draw = ImageDraw.Draw(image) |
|
for pred in predictions: |
|
box = pred['box'] |
|
label = f"{pred['label']} ({pred['score']:.2%})" |
|
|
|
|
|
draw.rectangle( |
|
[(box['xmin'], box['ymin']), (box['xmax'], box['ymax'])], |
|
outline="red", |
|
width=3 |
|
) |
|
|
|
|
|
text_bbox = draw.textbbox((box['xmin'], box['ymin']), label) |
|
draw.rectangle(text_bbox, fill="red") |
|
|
|
|
|
draw.text( |
|
(box['xmin'], box['ymin']), |
|
label, |
|
fill="white" |
|
) |
|
return image |
|
|
|
def main(): |
|
st.title("🦴 Détecteur de Fractures Osseuses") |
|
st.write("Téléchargez une radiographie pour détecter les fractures osseuses.") |
|
|
|
pipe = load_model() |
|
|
|
uploaded_file = st.file_uploader( |
|
"Choisissez une image de radiographie", |
|
type=['png', 'jpg', 'jpeg'] |
|
) |
|
|
|
conf_threshold = st.slider( |
|
"Seuil de confiance", |
|
min_value=0.0, |
|
max_value=1.0, |
|
value=0.5, |
|
step=0.05 |
|
) |
|
|
|
if uploaded_file: |
|
col1, col2 = st.columns(2) |
|
|
|
|
|
image = Image.open(uploaded_file) |
|
col1.header("Image originale") |
|
col1.image(image) |
|
|
|
|
|
with st.spinner("Analyse en cours..."): |
|
predictions = pipe(image) |
|
|
|
|
|
filtered_preds = [ |
|
pred for pred in predictions |
|
if pred['score'] >= conf_threshold |
|
] |
|
|
|
|
|
result_image = image.copy() |
|
result_image = draw_boxes(result_image, filtered_preds) |
|
|
|
|
|
col2.header("Résultats de la détection") |
|
col2.image(result_image) |
|
|
|
|
|
if filtered_preds: |
|
st.subheader("Détails des détections") |
|
for pred in filtered_preds: |
|
st.write( |
|
f"• Type: {pred['label']} - " |
|
f"Confiance: {pred['score']:.2%}" |
|
) |
|
else: |
|
st.warning( |
|
"Aucune fracture détectée avec le seuil de confiance actuel. " |
|
"Essayez de baisser le seuil pour plus de résultats." |
|
) |
|
|
|
if __name__ == "__main__": |
|
main() |