EfficientNetV2-M Two-Stage — Estimador de Grasa Corporal
Descripción del modelo
Modelo basado en EfficientNetV2-M (pretrained en ImageNet) entrenado mediante un proceso de fine-tuning en dos etapas para estimar el porcentaje de grasa corporal total (WBFP) a partir de una fotografía frontal del torso.
Metodología
- Conjunto de test reservado: 20% de
MasterMIARFID/peoplebf_dexa(semilla 42), 23 muestras - Etapa 1: Optuna (25 trials, 10-Fold CV) sobre
MasterMIARFID/silver_label_male_torso_dataset→ entrenamiento con todo el dataset - Etapa 2: Optuna (25 trials, 10-Fold CV) sobre train DEXA (91 muestras) partiendo del modelo Etapa 1 → entrenamiento con todo train DEXA
Resultados en Test (23 muestras)
| Etapa | SEE | MAE | Pearson |
|---|---|---|---|
| Etapa 1 (solo auto-etiquetado) | 6.808 | 5.167 | 0.629 |
| Etapa 2 (+ fine-tuning DEXA) | 3.850 | 2.983 | 0.872 |
Mejores hiperparámetros (Optuna)
Etapa 1 (auto-etiquetado)
| Parámetro | Valor |
|---|---|
| Learning Rate | 0.000206 |
| Weight Decay | 0.009216 |
| Dropout | 0.197 |
Etapa 2 (DEXA fine-tuning)
| Parámetro | Valor |
|---|---|
| Learning Rate | 0.000105 |
| Weight Decay | 0.000018 |
| Dropout | 0.418 |
Cómo cargar y usar el modelo
import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as T
from PIL import Image
def create_efficientnet_regressor(dropout=0.418):
model = models.efficientnet_v2_m(weights=None)
in_features = model.classifier[1].in_features
model.classifier = nn.Sequential(
nn.Dropout(p=dropout),
nn.Linear(in_features, 256),
nn.ReLU(),
nn.Dropout(p=dropout / 2),
nn.Linear(256, 1)
)
return model
transform = T.Compose([
T.Resize((224, 224)),
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
model = create_efficientnet_regressor()
model.load_state_dict(torch.load('efficientnet_twostage_bodyfat_regressor.pth', weights_only=True))
model.eval()
img = Image.open('foto_torso_frente.jpg').convert('RGB')
x = transform(img).unsqueeze(0)
with torch.no_grad():
wbfp = model(x).item()
print(f'WBFP estimado: {wbfp:.2f} %')
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support