# 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()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.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.

> [!TIP]
> Anda dapat mengontrol akses ke dataset Anda dengan meminta pengguna untuk membagikan informasi kontak mereka terlebih dahulu. Lihat panduan [Gated datasets](https://huggingface.co/docs/hub/datasets-gated) 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.

> [!TIP]
> 💡 Lihat [hierarki pola Split](repository_structure#split-pattern-hierarchy) 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()](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.load_dataset):

```py
>>> from datasets import load_dataset

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

Ini setara dengan meneruskan `imagefolder` secara manual di [load_dataset()](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.load_dataset) dan direktori di `data_dir`:

```py
>>> 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
```

> [!WARNING]
> 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:

```csv
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`:

```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:

```jsonl
{"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:

```jsonl
{"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:

```csv
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:

```py
>>> 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:

```jsonl
{"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:

```py
>>> 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()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.DatasetDict.push_to_hub). Pastikan Anda telah menginstal pustaka [huggingface_hub](https://huggingface.co/docs/huggingface_hub/index) dan telah masuk ke akun Hugging Face Anda (lihat [tutorial Upload with Python](upload_dataset#upload-with-python) untuk detail lebih lanjut).

Unggah dataset Anda dengan [push_to_hub()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.DatasetDict.push_to_hub):

```py
>>> 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](https://github.com/webdataset/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 itu akan membuat satu kolom per akhiran file (di sini "jpg" dan "json"):

```python
>>> 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](https://webdataset.github.io/webdataset).

## Lance

[Lance](https://lance.org) 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 lokal `*.lance`. 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:

```text
{'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:

```python
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):

```text
+-----------------------------------------------+--------+-------+-----+------------------------------+
| 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` dapat diunggah ke Hugging Face Hub, sama seperti contoh lain di atas. Lihat dataset `lance-format/laion-1m` [di Hub](https://huggingface.co/datasets/lance-format/laion-1m) untuk contoh dataset gambar Lance.

Untuk detail lebih lanjut tentang cara bekerja dengan dataset Lance, lihat [dokumentasi Lance](https://lance.org).

