File size: 2,285 Bytes
a326b94
f0f1078
7b58439
0000f4a
 
 
f0f1078
0000f4a
005d8cf
 
f0f1078
b5fbdeb
 
 
d7739b8
b5fbdeb
0000f4a
f0f1078
0000f4a
d7739b8
 
 
b5fbdeb
 
 
 
0000f4a
 
 
d7739b8
f0f1078
 
 
 
0000f4a
b5fbdeb
0000f4a
b5fbdeb
f0f1078
 
 
 
 
 
 
d7739b8
f5a9b22
 
 
 
 
d7739b8
f0f1078
b5fbdeb
d7739b8
b5fbdeb
f5a9b22
d7739b8
f0f1078
f5a9b22
 
b5fbdeb
 
f0f1078
d7739b8
005d8cf
0000f4a
f0f1078
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import streamlit as st
from transformers import pipeline
from PIL import Image
import numpy as np
import cv2

st.set_page_config(page_title="Détection de fractures osseuses")
st.title("Détection de fractures osseuses par rayons X")

@st.cache_resource
def load_model():
    return pipeline(
        "object-detection",
        model="anirban22/detr-resnet-50-med_fracture",
        threshold=0.1
    )

model = load_model()

def enhance_image(img):
    img_array = np.array(img)
    gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY)
    clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
    enhanced = clahe.apply(gray)
    return cv2.cvtColor(enhanced, cv2.COLOR_GRAY2RGB)

uploaded_file = st.file_uploader("Téléchargez une image radiographique", type=["jpg", "jpeg", "png"])

if uploaded_file:
    image = Image.open(uploaded_file).convert('RGB')
    if image.size[0] > 800:
        ratio = 800.0 / image.size[0]
        size = (800, int(image.size[1] * ratio))
        image = image.resize(size, Image.Resampling.LANCZOS)
    
    enhanced_image = enhance_image(image)
    
    predictions = model(enhanced_image)
    
    col1, col2 = st.columns(2)
    
    with col1:
        st.image(image, caption="Image originale", use_container_width=True)
    
    with col2:
        output_img = np.array(image).copy()
        for pred in predictions:
            box = pred['box']
            score = pred['score']
            
            x1, y1, x2, y2 = [int(i) for i in [box['xmin'], box['ymin'], box['xmax'], box['ymax']]]
            cv2.rectangle(output_img, (x1, y1), (x2, y2), (255, 0, 0), 3)
            
            text = f"Fracture: {score:.2f}"
            cv2.putText(output_img, text, (x1, y1-10), 
                       cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
        
        st.image(output_img, caption="Détection des fractures", use_container_width=True)
    
    st.subheader("Résultats")
    if predictions:
        for idx, pred in enumerate(predictions, 1):
            st.warning(f"⚠️ Fracture {idx} détectée (Confiance: {pred['score']*100:.1f}%)")
    else:
        st.warning("⚠️ Aucune fracture n'a été détectée avec certitude")
        
else:
    st.info("Veuillez télécharger une image radiographique pour l'analyse.")