stevenrq8 commited on
Commit
2a7f893
·
verified ·
1 Parent(s): cbcc62b

Add model card with metadata, results, and usage examples

Browse files
Files changed (1) hide show
  1. README.md +147 -0
README.md ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ language:
4
+ - es
5
+ base_model:
6
+ - google/mobilenet_v2_1.0_224
7
+ pipeline_tag: image-classification
8
+ tags:
9
+ - medical
10
+ - radiology
11
+ - fracture-detection
12
+ - keras
13
+ - tensorflow
14
+ - transfer-learning
15
+ - grad-cam
16
+ datasets:
17
+ - bmadushanirodrigo/bone-fracture-multi-region-x-ray-data
18
+ metrics:
19
+ - accuracy
20
+ - f1
21
+ - auc
22
+ model-index:
23
+ - name: best_mobilenet
24
+ results:
25
+ - task:
26
+ type: image-classification
27
+ name: Bone Fracture Detection
28
+ dataset:
29
+ name: Bone Fracture Multi-Region X-ray Data (deduplicated)
30
+ type: bmadushanirodrigo/bone-fracture-multi-region-x-ray-data
31
+ split: test
32
+ metrics:
33
+ - type: accuracy
34
+ value: 0.815
35
+ - type: recall
36
+ value: 0.953
37
+ name: Recall (fractura, umbral 0.310)
38
+ - type: f1
39
+ value: 0.782
40
+ - type: auc
41
+ value: 0.910
42
+ ---
43
+
44
+ # 🦴 Detección de fracturas óseas — MobileNetV2
45
+
46
+ Modelo de clasificación binaria (fractura / normal) sobre radiografías óseas.
47
+ Desarrollado como proyecto final de **Aprendizaje Computacional** (Ingeniería de
48
+ Sistemas, Universidad de Córdoba).
49
+
50
+ Arquitectura: **MobileNetV2** con *transfer learning* desde ImageNet + cabeza de
51
+ clasificación personalizada. Umbral de decisión ajustado a **0.310** para
52
+ priorizar la sensibilidad clínica (recall ≥ 0.95).
53
+
54
+ > ⚠️ **Demostración académica.** No es un dispositivo médico ni está validado
55
+ > clínicamente. No debe usarse para decisiones clínicas reales.
56
+
57
+ ## Demo interactiva
58
+
59
+ Prueba el modelo en el Space de Hugging Face:
60
+ 👉 [stevenrq8/fracturas-rayos-x](https://huggingface.co/spaces/stevenrq8/fracturas-rayos-x)
61
+
62
+ ## Uso
63
+
64
+ ```python
65
+ from huggingface_hub import hf_hub_download
66
+ from tensorflow import keras
67
+ import numpy as np
68
+ from PIL import Image
69
+
70
+ model = keras.models.load_model(
71
+ hf_hub_download("stevenrq8/fracturas-modelo", "best_mobilenet.keras")
72
+ )
73
+
74
+ UMBRAL = 0.310
75
+ IMG_SIZE = (224, 224)
76
+
77
+ img = Image.open("radiografia.jpg").convert("RGB").resize(IMG_SIZE)
78
+ arr = np.asarray(img, dtype="float32")[None, ...]
79
+ p = float(model.predict(arr).ravel()[0])
80
+ etiqueta = "FRACTURA" if p >= UMBRAL else "NORMAL"
81
+ print(f"{etiqueta} — P(fractura) = {p:.1%}")
82
+ ```
83
+
84
+ ## Datos de entrenamiento
85
+
86
+ Dataset base: *Bone Fracture Multi-Region X-ray Data*
87
+ (Kaggle, `bmadushanirodrigo`, licencia ODC-By v1.0).
88
+
89
+ El split oficial tenía 63 % de duplicados y 873 grupos con fuga entre
90
+ train/val/test. Se deduplicó y re-dividió antes del entrenamiento:
91
+
92
+ | Split | Normal | Fractura | Total |
93
+ |-------|-------:|---------:|------:|
94
+ | Train | 1 611 | 1 127 | 2 738 |
95
+ | Val | 343 | 244 | 587 |
96
+ | Test | 328 | 235 | 563 |
97
+
98
+ Desbalance leve (59 % normal / 41 % fractura) corregido con `class_weight`.
99
+
100
+ ## Resultados (test set, umbral 0.310)
101
+
102
+ | Métrica | Valor |
103
+ |---------|------:|
104
+ | Accuracy | 0.815 |
105
+ | Recall (fractura) | **0.953** |
106
+ | Especificidad | 0.649 |
107
+ | Precision | 0.661 |
108
+ | F1 | 0.781 |
109
+ | AUC-ROC | **0.910** |
110
+ | Tiempo inferencia (CPU) | 0.070 s |
111
+ | Tamaño del modelo | 9.3 MB |
112
+
113
+ ### Comparativa de modelos (umbral 0.5)
114
+
115
+ | Modelo | Accuracy | Recall | AUC | Tamaño |
116
+ |--------|:--------:|:------:|:---:|-------:|
117
+ | CNN desde cero | 0.673 | 0.243 | 0.820 | 1.2 MB |
118
+ | **MobileNetV2** ✅ | **0.815** | **0.796** | 0.910 | 9.3 MB |
119
+ | EfficientNetB0 | 0.798 | 0.681 | **0.919** | 43.4 MB |
120
+
121
+ Se eligió MobileNetV2 por su mejor equilibrio entre recall, AUC y tamaño
122
+ (viable en hardware CPU gratuito).
123
+
124
+ ## Entrenamiento
125
+
126
+ - Framework: TensorFlow / Keras
127
+ - Hardware: Google Colab (GPU T4)
128
+ - Épocas: EarlyStopping (paciencia 5) + ReduceLROnPlateau
129
+ - Regularización: Dropout 0.3, data augmentation, class_weight
130
+ - Fine-tuning: descongelación de las últimas capas de MobileNetV2
131
+
132
+ ## Limitaciones
133
+
134
+ - Dataset pequeño (3 888 imágenes únicas) — sobreajuste moderado (train AUC ~0.96 vs val ~0.84)
135
+ - Mezcla de regiones anatómicas sin etiqueta explícita (muñeca, hombro, rodilla…)
136
+ - Sin validación clínica por radiólogos
137
+ - Una sola vista por caso, sin datos demográficos del paciente
138
+
139
+ ## Archivos
140
+
141
+ | Archivo | Descripción |
142
+ |---------|-------------|
143
+ | `best_mobilenet.keras` | Modelo final elegido para despliegue |
144
+
145
+ ## Licencia
146
+
147
+ MIT — ver [LICENSE](https://github.com/stevenrq8/fracturas-rayos-x/blob/main/LICENSE).