Datasets documentation
Cargar datos de imagen
Cargar datos de imagen
Los conjuntos de datos de imágenes tienen columnas de tipo Image, que contienen objetos PIL.
Para trabajar con conjuntos de datos de imágenes, necesitas tener instalada la dependencia
vision. Consulta la guía de instalación 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:
>>> from datasets import load_dataset, Image
>>> dataset = load_dataset("AI-Lab-Makerere/beans", split="train")
>>> dataset[0]["image"]Í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() para aceptar una columna de rutas de archivos de imagen y decodificarla en una imagen PIL con la función Image:
>>> 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:
>>> 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.pngAlternativamente, debería tener metadatos, por ejemplo:
folder/train/metadata.csv
folder/train/0001.png
folder/train/0002.png
folder/train/0003.pngSi el conjunto de datos sigue la estructura ImageFolder, puedes cargarlo directamente con load_dataset():
>>> 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() y el directorio en data_dir:
>>> 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():
>>> 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:
>>> 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.
>>> filters = [("label", "=", 0)]
>>> dataset = load_dataset("username/dataset_name", streaming=True, filters=filters)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.
WebDataset
El formato 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:
>>> from datasets import load_dataset
>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", streaming=True)Lance
Lance es un formato de tabla de lakehouse multimodal abierto. Las tablas 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.
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.
La API de
datasetsno 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 si usas directamente el paquete de Pythonlance. Consulta la documentación en el Hub 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 utilizando decodificación multihilo:
>>> 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:
>>> dataset = dataset.decode(False)Nota: IterableDataset.decode() solo está disponible actualmente para conjuntos de datos en streaming.
Update on GitHub