Datasets documentation

Buat dataset gambar

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Buat dataset gambar

Ada dua metode untuk membuat dan membagikan dataset gambar. Panduan ini akan menunjukkan cara Anda:

  • Buat dataset gambar dari file lokal di python dengan Dataset.push_to_hub(). Ini adalah cara mudah yang hanya membutuhkan beberapa langkah di python.

  • Buat dataset gambar dengan ImageFolder dan beberapa metadata. Ini adalah solusi tanpa kode untuk membuat dataset gambar dengan cepat yang berisi beberapa ribu gambar.

Anda dapat mengontrol akses ke dataset Anda dengan meminta pengguna untuk membagikan informasi kontak mereka terlebih dahulu. Lihat panduan Gated datasets untuk informasi lebih lanjut tentang cara mengaktifkan fitur ini di Hub.

ImageFolder

ImageFolder adalah pembangun dataset yang dirancang untuk memuat dataset gambar dengan ribuan gambar secara cepat tanpa mengharuskan Anda menulis kode apa pun.

💡 Lihat hierarki pola Split untuk mempelajari lebih lanjut tentang bagaimana ImageFolder membuat split dataset berdasarkan struktur repositori dataset Anda.

ImageFolder secara otomatis menyimpulkan label kelas dari dataset Anda berdasarkan nama direktori. Simpan dataset Anda dalam struktur direktori seperti:

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

Jika dataset mengikuti struktur ImageFolder, maka Anda dapat memuatnya langsung dengan load_dataset():

>>> from datasets import load_dataset

>>> dataset = load_dataset("path/to/folder")

Ini setara dengan meneruskan imagefolder secara manual di load_dataset() dan direktori di data_dir:

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

Anda juga dapat menggunakan imagefolder untuk memuat dataset yang melibatkan beberapa split. Untuk melakukannya, direktori dataset Anda harus memiliki struktur berikut:

folder/train/dog/golden_retriever.png
folder/train/cat/maine_coon.png
folder/test/dog/german_shepherd.png
folder/test/cat/bengal.png

Jika semua file gambar berada dalam satu direktori atau tidak berada pada level struktur direktori yang sama, kolom label tidak akan ditambahkan secara otomatis. Jika Anda membutuhkannya, tetapkan drop_labels=False secara eksplisit.

Jika ada informasi tambahan yang ingin Anda sertakan tentang dataset Anda, seperti teks caption atau bounding box, tambahkan sebagai file metadata.csv di folder Anda. Hal ini memungkinkan Anda dengan cepat membuat dataset untuk berbagai tugas computer vision seperti text captioning atau object detection. Anda juga dapat menggunakan file JSONL metadata.jsonl atau file Parquet metadata.parquet.

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

Anda juga dapat meng-zip gambar Anda, dan dalam hal ini setiap zip harus berisi gambar dan metadata

folder/train.zip
folder/test.zip
folder/validation.zip

File metadata.csv Anda harus memiliki field file_name atau *_file_name yang menghubungkan file gambar dengan metadata mereka:

file_name,additional_feature
0001.png,This is a first value of a text feature you added to your images
0002.png,This is a second value of a text feature you added to your images
0003.png,This is a third value of a text feature you added to your images

atau menggunakan metadata.jsonl:

{"file_name": "0001.png", "additional_feature": "This is a first value of a text feature you added to your images"}
{"file_name": "0002.png", "additional_feature": "This is a second value of a text feature you added to your images"}
{"file_name": "0003.png", "additional_feature": "This is a third value of a text feature you added to your images"}

Di sini, file_name harus berupa nama file gambar yang berada di samping file metadata. Secara lebih umum, ini harus berupa path relatif dari direktori yang berisi metadata ke file gambar.

Anda dapat menunjuk ke lebih dari satu gambar di setiap baris dalam dataset Anda, misalnya jika input dan output Anda sama-sama berupa gambar:

{"input_file_name": "0001.png", "output_file_name": "0001_output.png"}
{"input_file_name": "0002.png", "output_file_name": "0002_output.png"}
{"input_file_name": "0003.png", "output_file_name": "0003_output.png"}

Anda juga dapat mendefinisikan daftar gambar. Dalam hal itu, Anda perlu menamai field file_names atau *_file_names. Berikut adalah contohnya:

{"frames_file_names": ["0001_t0.png", "0001_t1.png"], label: "moving_up"}
{"frames_file_names": ["0002_t0.png", "0002_t1.png"], label: "moving_down"}
{"frames_file_names": ["0003_t0.png", "0003_t1.png"], label: "moving_right"}

Penamaan gambar

Dataset captioning gambar memiliki teks yang menggambarkan sebuah gambar. Contoh metadata.csv mungkin terlihat seperti:

file_name,text
0001.png,This is a golden retriever playing with a ball
0002.png,A german shepherd
0003.png,One chihuahua

Muat dataset dengan ImageFolder, dan kolom text untuk caption gambar akan dibuat:

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["text"]
"This is a golden retriever playing with a ball"

Deteksi objek

Dataset deteksi objek memiliki kotak pembatas dan kategori yang mengidentifikasi objek dalam sebuah gambar. Contoh metadata.jsonl mungkin terlihat seperti:

{"file_name": "0001.png", "objects": {"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}}
{"file_name": "0002.png", "objects": {"bbox": [[810.0, 100.0, 57.0, 28.0]], "categories": [1]}}
{"file_name": "0003.png", "objects": {"bbox": [[160.0, 31.0, 248.0, 616.0], [741.0, 68.0, 202.0, 401.0]], "categories": [2, 2]}}

Muat dataset dengan ImageFolder, dan kolom objects akan dibuat berisi kotak pembatas dan kategorinya:

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset[0]["objects"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}

Unggah dataset ke Hub

Setelah Anda membuat dataset, Anda dapat membagikannya ke Hub dengan metode push_to_hub(). Pastikan Anda telah menginstal pustaka huggingface_hub dan telah masuk ke akun Hugging Face Anda (lihat tutorial Upload with Python untuk detail lebih lanjut).

Unggah dataset Anda dengan push_to_hub():

>>> from datasets import load_dataset

>>> dataset = load_dataset("imagefolder", data_dir="/path/to/folder", split="train")
>>> dataset.push_to_hub("stevhliu/my-image-captioning-dataset")

WebDataset

Format WebDataset didasarkan pada arsip TAR dan cocok untuk dataset gambar besar. Anda dapat mengelompokkan gambar Anda ke dalam arsip TAR (misalnya 1GB gambar per arsip TAR) dan memiliki ribuan arsip TAR:

folder/train/00000.tar
folder/train/00001.tar
folder/train/00002.tar
...

Di arsip, setiap contoh terdiri dari file-file yang berbagi prefiks yang sama:

e39871fd9fd74f55.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.jpg
f18b91585c4d3f3e.json
ede6e66b2fb59aab.jpg
ede6e66b2fb59aab.json
ed600d57fcee4f94.jpg
ed600d57fcee4f94.json
...

Anda dapat menempatkan label/keterangan/kotak batas gambar Anda menggunakan file JSON atau teks, misalnya.

Muat WebDataset Anda dan akan dibuat satu kolom per akhiran file (di sini “jpg” dan “json”):

>>> from datasets import load_dataset

>>> dataset = load_dataset("webdataset", data_dir="/path/to/folder", split="train")
>>> dataset[0]["json"]
{"bbox": [[302.0, 109.0, 73.0, 52.0]], "categories": [0]}

Anda juga dapat memiliki beberapa gambar per contoh seperti ini:

e39871fd9fd74f55.input.jpg
e39871fd9fd74f55.output.jpg
e39871fd9fd74f55.json
f18b91585c4d3f3e.input.jpg
f18b91585c4d3f3e.output.jpg
f18b91585c4d3f3e.json
...

Untuk detail lebih lanjut tentang format WebDataset dan pustaka python, silakan periksa dokumentasi WebDataset.

Lance

Lance adalah format tabel lakehouse multimodal terbuka. Tabel Lance dapat menyimpan secara native tidak hanya teks dan nilai skalar, tetapi juga objek biner besar (blobs) seperti gambar, audio, dan video berdampingan dengan data tabular Anda.

Berangkat dari file gambar di disk beserta metadata terkait (misalnya, caption dan dimensi), Anda dapat menulis dataset Lance yang mandiri ke direktori *.lance lokal. Tabel yang dihasilkan dapat menyimpan kolom metadata Anda berdampingan dengan kolom image yang berisi byte gambar yang telah dikodekan.

Sebagai contoh, Anda mungkin memulai dengan metadata seperti:

{'caption': 'Cordelia and Dudley on their wedding  day last year', 'height': 315, 'width': 233}
{'caption': 'Statistics on challenges for automation in 2021', 'height': 299, 'width': 701}

Anda dapat mendefinisikan skema pyarrow untuk metadata dan byte gambar Anda, membangun tabel, dan menuliskannya sebagai dataset Lance:

import lance
import pyarrow as pa

schema = pa.schema(
    [
        pa.field("caption", pa.utf8()),
        pa.field("height", pa.int32()),
        pa.field("width", pa.int32()),
        # ... add any additional metadata columns you want here ...
        pa.field("image", pa.binary()),
    ]
)

# Provide image files alongside metadata
rows = [
    {
        "image_path": "/path/to/images/0001.jpg",
        "caption": "Cordelia and Dudley on their wedding  day last year",
        "height": 315,
        "width": 233,
    },
    {
        "image_path": "/path/to/images/0002.jpg",
        "caption": "Statistics on challenges for automation in 2021",
        "height": 299,
        "width": 701,
    },
]

image_bytes = []
for r in rows:
    with open(r["image_path"], "rb") as f:
        image_bytes.append(f.read())

table = pa.table(
    {
        "caption": [r["caption"] for r in rows],
        "height": [r["height"] for r in rows],
        "width": [r["width"] for r in rows],
        "image": image_bytes,
    },
    schema=schema,
)

ds = lance.write_dataset(
    table,
    "./images.lance",
    schema=schema,
    mode="create",
)

Berikut adalah tampilan representatif dari tabel Lance yang menyimpan gambar (kolom image berisi byte yang telah dikodekan):

+-----------------------------------------------+--------+-------+-----+------------------------------+
| caption                                       | height | width | ... | image                        |
+-----------------------------------------------+--------+-------+-----+------------------------------+
| "Cordelia and Dudley on their wedding ..."    | 315    | 233   | ... | b"\\xff\\xd8\\xff...\\xd9"   |
| "Statistics on challenges for automation ..." | 299    | 701   | ... | b"\\xff\\xd8\\xff...\\xd9"   |
+-----------------------------------------------+--------+-------+-----+------------------------------+

Dengan pendekatan ini, Anda dapat menyimpan dataset gambar berukuran sembarang besar di Lance. Direktori images.lance/ yang dihasilkan beserta file *.lance di dalamnya dapat diunggah ke Hugging Face Hub, sama seperti contoh lain di atas. Lihat dataset lance-format/laion-1m di Hub untuk contoh dataset gambar Lance.

Untuk detail lebih lanjut tentang cara bekerja dengan dataset Lance, lihat dokumentasi Lance.

Update on GitHub