# Cargar datos de imagen

Los conjuntos de datos de imágenes tienen columnas de tipo [Image](/docs/datasets/v5.2.0/es/package_reference/main_classes#datasets.Image), que contienen objetos PIL.

> [!TIP]
> Para trabajar con conjuntos de datos de imágenes, necesitas tener instalada la dependencia `vision`. Consulta la guía de [instalación](./installation#vision) para aprender a instalarla.

Cuando cargas un conjunto de datos de imágenes y llamas a la columna de imágenes, las imágenes se decodifican como imágenes PIL:

```py
>>> from datasets import load_dataset, Image

>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
>>> dataset[0]["image"]
```

> [!WARNING]
> Índice en un conjunto de datos de imágenes usando primero el índice de fila y luego la columna `image` - `dataset[0]["image"]` - para evitar decodificar y re-muestrear todos los objetos de imagen del conjunto de datos. De lo contrario, este puede ser un proceso lento y que consume mucho tiempo si se tiene un conjunto de datos grande.

Para una guía sobre cómo cargar cualquier tipo de conjunto de datos, consulte la guía general de carga.

## Archivos locales

Puede cargar un conjunto de datos desde la ruta de la imagen. Use la función [cast_column()](/docs/datasets/v5.2.0/es/package_reference/main_classes#datasets.Dataset.cast_column) para aceptar una columna de rutas de archivos de imagen y decodificarla en una imagen PIL con la función [Image](/docs/datasets/v5.2.0/es/package_reference/main_classes#datasets.Image):
```py
>>> from datasets import Dataset, Image

>>> dataset = Dataset.from_dict({"image": ["path/to/image_1", "path/to/image_2", ..., "path/to/image_n"]}).cast_column("image", Image())
>>> dataset[0]["image"]
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>]
```

Si solo desea cargar la ruta subyacente del conjunto de datos de imágenes sin decodificar el objeto de imagen, establezca `decode=False` en la característica [Image](/docs/datasets/v5.2.0/es/package_reference/main_classes#datasets.Image):

```py
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train").cast_column("image", Image(decode=False))
>>> dataset[0]["image"]
{'bytes': None,
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/b0a21163f78769a2cf11f58dfc767fb458fc7cea5c05dccc0144a2c0f0bc1292/train/bean_rust/bean_rust_train.29.jpg'}
```

## ImageFolder

También puede cargar un conjunto de datos con el creador de conjuntos de datos `ImageFolder`, que no requiere escribir un dataloader personalizado. Esto hace que `ImageFolder` sea ideal para crear y cargar rápidamente conjuntos de datos de imágenes con varios miles de imágenes para diferentes tareas de visión. La estructura de su conjunto de datos de imágenes debe ser así:

```
folder/train/dog/golden_retriever.png
folder/train/dog/german_shepherd.png
folder/train/dog/chihuahua.png

folder/train/cat/maine_coon.png
folder/train/cat/bengal.png
folder/train/cat/birman.png
```

Alternativamente, debería tener metadatos, por ejemplo:

```
folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.png
```

Si el conjunto de datos sigue la estructura `ImageFolder`, puedes cargarlo directamente con [load_dataset()](/docs/datasets/v5.2.0/es/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_name")
>>> # OR locally:
>>> dataset = load_dataset("/path/to/folder")
```

Para conjuntos de datos locales, esto es equivalente a pasar `imagefolder` manualmente en [load_dataset()](/docs/datasets/v5.2.0/es/package_reference/loading_methods#datasets.load_dataset) y el directorio en `data_dir`:

```py
>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder")
```

Luego puedes acceder a los videos como objetos `PIL.Image`:

```
>>> dataset["train"][0]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E6D7160>, "label": 0}

>>> dataset["train"][-1]
{"image": <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=1200x215 at 0x15E8DAD30>, "label": 1}
```

Para ignorar la información en el archivo de metadatos, establezca `drop_metadata=True` en [load_dataset()](/docs/datasets/v5.2.0/es/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_with_metadata", drop_metadata=True)
```

Si no tiene un archivo de metadatos, `ImageFolder` infiere automáticamente el nombre de la etiqueta a partir del nombre del directorio. Si desea eliminar las etiquetas creadas automáticamente, establezca `drop_labels=True`. En este caso, su conjunto de datos solo contendrá una columna de imagen:

```py
>>> from datasets import load_dataset

>>> dataset = load_dataset("username/dataset_without_metadata", drop_labels=True)
```

Por último, el argumento `filters` permite cargar solo un subconjunto del conjunto de datos, basado en una condición sobre la etiqueta o los metadatos. Esto es especialmente útil si los metadatos están en formato Parquet, ya que este formato permite un filtrado rápido. También se recomienda usar este argumento con `streaming=True`, porque por defecto el conjunto de datos se descarga por completo antes de aplicar el filtrado.

```python
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)
```

> [!TIP]
> Para obtener más información sobre cómo crear tu propio conjunto de datos `ImageFolder`, consulta la guía [Crear un conjunto de datos de imágenes](./image_dataset).

## WebDataset

El formato [WebDataset](https://github.com/webdataset/webdataset) se basa en una carpeta de archivos TAR y es adecuado para grandes conjuntos de datos de imágenes. Debido a su tamaño, los WebDatasets generalmente se cargan en modo de transmisión (usando `streaming=True`).

Puedes cargar un WebDataset de esta manera:

```python
>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)
```

## Lance

[Lance](https://lance.org) es un formato de tabla de lakehouse multimodal abierto. Las tablas de Lance pueden almacenar de forma nativa no solo texto y valores escalares, sino también objetos binarios grandes (blobs) como imágenes, audio y video junto a sus datos tabulares.

Lance mantiene tus metadatos y los blobs de imágenes juntos en un solo lugar, al tiempo que te permite escanear de manera eficiente solo las columnas de metadatos que te interesan, sin cargar los bytes de las imágenes. Cuando estés listo, puedes obtener un subconjunto pequeño de filas (incluyendo los blobs de imágenes) y escribirlos directamente en archivos de tu sistema de archivos local.

```python
from datasets import load_dataset

# Return as a Hugging Face dataset
ds = load_dataset(
    "lance-format/laion-1m",
    split="train",
    streaming=True
)

dir_name = "laion_samples"
Path(dir_name).mkdir(exist_ok=True)

for idx, row in enumerate(ds.take(3)):
    with open(f"{dir_name}/{idx}.jpg", "wb") as f:
        f.write(row["image"])
```

En este ejemplo, la columna `image` contiene los bytes de la imagen codificados, por lo que puedes escribirlos directamente en archivos `.jpg`.

> [!NOTE] La API de `datasets` no realiza actualmente la propagación de operaciones a la tabla Lance, por lo que puede ser lenta para conjuntos de datos más grandes. Por ahora, obtendrás un rendimiento mucho mejor usando directamente el paquete de Python `lance`. Consulta la documentación en [el Hub](https://huggingface.co/docs/datasets-lance) para ver ejemplos de uso.

## Decodificación de imágenes

Por defecto, las imágenes se decodifican de forma secuencial como `PIL.Images` al iterar sobre un conjunto de datos. Sin embargo, es posible acelerar significativamente el conjunto de datos mediante la decodificación multihilo:

```python
>>> import os
>>> num_threads = num_threads = min(32, (os.cpu_count() or 1) + 4)
>>> dataset = dataset.decode(num_threads=num_threads)
>>> for example in dataset:  # up to 20 times faster !
...     ...
```

Puede habilitar el multihilo usando `num_threads`. Esto es especialmente útil para acelerar el streaming de datos remotos. Sin embargo, puede ser más lento que `num_threads=0` para datos locales en discos rápidos.

Si no le interesan las imágenes decodificadas como `PIL.Images` y prefiere acceder a la ruta/bytes en su lugar, puede deshabilitar la decodificación:

```python
>>> dataset = dataset.decode(False)
```

Nota: [IterableDataset.decode()](/docs/datasets/v5.2.0/es/package_reference/main_classes#datasets.IterableDataset.decode) solo está disponible actualmente para conjuntos de datos en streaming.

