Image Classification
Keras
Spanish
medical
radiology
fracture-detection
tensorflow
transfer-learning
grad-cam
Eval Results (legacy)
Instructions to use stevenrq8/fracturas-modelo with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use stevenrq8/fracturas-modelo with Keras:
# Available backend options are: "jax", "torch", "tensorflow". import os os.environ["KERAS_BACKEND"] = "jax" import keras model = keras.saving.load_model("hf://stevenrq8/fracturas-modelo") - Notebooks
- Google Colab
- Kaggle
Add model card with metadata, results, and usage examples
Browse files
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).
|