# Uso de mlx-image en Hugging Face

[`mlx-image`](https://github.com/riccardomusmeci/mlx-image) es una biblioteca de modelos de imagen desarrollada por [Riccardo Musmeci](https://github.com/riccardomusmeci) y construida sobre Apple [MLX](https://github.com/ml-explore/mlx). Intenta replicar la gran [timm](https://github.com/huggingface/pytorch-image-models), pero para modelos de MLX.

## Explorando mlx-image en el Hub

Puedes encontrar modelos de `mlx-image` filtrando por el nombre de la biblioteca `mlx-image`, como en [esta consulta](https://huggingface.co/models?library=mlx-image&sort=trending). También existe una comunidad abierta de [mlx-vision](https://huggingface.co/mlx-vision) para colaboradores que convierten y publican pesos en formato MLX.

## Instalación

```bash
pip install mlx-image
```

## Modelos

Los pesos del modelo están disponibles en la comunidad [`mlx-vision`](https://huggingface.co/mlx-vision) de Hugging Face.

Para cargar un modelo con pesos preentrenados:
```python
from mlxim.model import create_model

# loading weights from HuggingFace (https://huggingface.co/mlx-vision/resnet18-mlxim)
model = create_model("resnet18") # pretrained weights loaded from HF

# loading weights from local file
model = create_model("resnet18", weights="path/to/resnet18/model.safetensors")
```

Para listar todos los modelos disponibles:

```python
from mlxim.model import list_models
list_models()
```

## Resultados de ImageNet-1K

Vaya a [results-imagenet-1k.csv](https://github.com/riccardomusmeci/mlx-image/blob/main/results/results-imagenet-1k.csv) para consultar cada modelo convertido a `mlx-image` y su rendimiento en ImageNet-1K con diferentes configuraciones.

> El rendimiento de **TL;DR** es comparable al de los modelos originales de las implementaciones de PyTorch.

## Similitud con PyTorch y otras herramientas familiares

`mlx-image` intenta ser lo más parecido posible a PyTorch:
- `DataLoader` -> puede definir su propia `collate_fn` y también usar `num_workers` para acelerar la carga de datos
- `Dataset` -> `mlx-image` ya admite `LabelFolderDataset` (el clásico `ImageFolder` de PyTorch) y `FolderDataset` (una carpeta genérica con imágenes)

- `ModelCheckpoint` -> mantiene un registro del mejor modelo y lo guarda en el disco (similar a PyTorchLightning). También sugiere el detenerse temprano

## Entrenamiento

El entrenamiento es similar al de PyTorch. A continuación, se muestra un ejemplo de cómo entrenar un modelo:

```python
import mlx.nn as nn
import mlx.optimizers as optim
from mlxim.model import create_model
from mlxim.data import LabelFolderDataset, DataLoader

train_dataset = LabelFolderDataset(
    root_dir="path/to/train",
    class_map={0: "class_0", 1: "class_1", 2: ["class_2", "class_3"]}
)
train_loader = DataLoader(
    dataset=train_dataset,
    batch_size=32,
    shuffle=True,
    num_workers=4
)
model = create_model("resnet18") # pretrained weights loaded from HF
optimizer = optim.Adam(learning_rate=1e-3)

def train_step(model, inputs, targets):
    logits = model(inputs)
    loss = mx.mean(nn.losses.cross_entropy(logits, target))
    return loss

model.train()
for epoch in range(10):
    for batch in train_loader:
        x, target = batch
        train_step_fn = nn.value_and_grad(model, train_step)
        loss, grads = train_step_fn(x, target)
        optimizer.update(model, grads)
        mx.eval(model.state, optimizer.state)
```

## Recursos adicionales

* [repositorio mlx-image](https://github.com/riccardomusmeci/mlx-image)
* [comunidad de mlx-vision](https://huggingface.co/mlx-vision)

## Contacto

Si tienes alguna pregunta, por favor envía un correo electrónico a `riccardomusmeci92@gmail.com`.

