# 画像データを読み込む

Imageデータセットには、PILオブジェクトを含む[Image](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Image)型の列があります。

> [!TIP]
> 画像データセットを扱うには、`vision`依存関係のインストールが必要です。インストール方法については、[インストール](./installation#vision)ガイドを参照してください。

画像データセットを読み込み、画像カラムを呼び出すと、画像はPIL Imageとしてデコードされます:

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

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

> [!WARNING]
> 行インデックスを先に使用し、次に`image`列にインデックスを指定して画像データセットにアクセスします - `dataset[0]["image"]` - 。これにより、データセット内のすべての画像オブジェクトのデコードとリサンプリングを回避できます。そうしないと、データセットが大きい場合、この処理は低速で時間がかかる可能性があります。

あらゆるタイプのデータセットを読み込む方法については、一般的な読み込みガイドを参照してください。

## ローカルファイル

画像パスからデータセットを読み込むことができます。[cast_column()](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset.cast_column)関数を使用して、画像ファイルのパスの列を受け取り、[Image](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Image)機能でPIL画像としてデコードします:
```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>]
```

画像オブジェクトのデコードを行わず、画像データセットの基底パスのみを読み込みたい場合は、[Image](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Image)機能で`decode=False`を設定します:

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

カスタムdataloaderの作成を必要としない`ImageFolder`データセットビルダーを使用して、データセットを読み込むこともできます。これにより、`ImageFolder`は、異なるビジョンタスク向けの数千枚の画像からなる画像データセットを素早く作成・読み込むのに最適です。画像データセットの構造は、次のようになる必要があります:

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

代わりにメタデータを持つべきです。例えば:

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

データセットが`ImageFolder`の構造に従っている場合、[load_dataset()](/docs/datasets/v5.2.0/ja/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")
```

ローカルデータセットの場合、これは`data_dir`にディレクトリを指定して`imagefolder`を手動で渡す[load_dataset()](/docs/datasets/v5.2.0/ja/package_reference/loading_methods#datasets.load_dataset)に相当します:

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

その後、`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}
```

メタデータファイル内の情報を無視するには、[load_dataset()](/docs/datasets/v5.2.0/ja/package_reference/loading_methods#datasets.load_dataset)で`drop_metadata=True`を設定します:

```py
>>> from datasets import load_dataset

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

メタデータファイルがない場合、`ImageFolder`はディレクトリ名からラベル名を自動的に推測します。自動生成されたラベルを削除したい場合は、`drop_labels=True`を設定してください。この場合、データセットには画像カラムのみが含まれます。

```py
>>> from datasets import load_dataset

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

最後に、`filters` 引数を使用すると、ラベルまたはメタデータに対する条件に基づいて、データセットの一部のみを読み込むことができます。メタデータが Parquet 形式である場合、この形式は高速なフィルタリングを可能にするため、特に有用です。また、デフォルトではフィルタリングの前にデータセット全体がダウンロードされるため、`streaming=True` と組み合わせてこの引数を使用することをお勧めします。

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

> [!TIP]
> 独自の`ImageFolder`データセットの作成方法については、[画像データセットの作成](./image_dataset)ガイドを参照してください。

## WebDataset

[WebDataset](https://github.com/webdataset/webdataset)形式はTARアーカイブのフォルダーに基づいており、大規模な画像データセットに適しています。そのサイズのため、WebDatasetは通常、ストリーミングモード（`streaming=True`を使用）で読み込まれます。

WebDatasetは次のように読み込むことができます。

```python
>>> from datasets import load_dataset

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

## Lance

[Lance](https://lance.org)は、オープンなマルチモーダルなレイクハウス用テーブル形式です。Lanceテーブルでは、テキストやスカラー値だけでなく、画像、音声、動画などの大きなバイナリオブジェクト（blob）も、タブラーデータと並んでネイティブに保存できます。

Lance はメタデータと画像ブロブを1つの場所にまとめて保持しつつ、画像バイトを読み込まずに、必要なメタデータ列のみを効率的にスキャンできるようにします。準備が整ったら、行の小さなサブセット（画像ブロブを含む）を取得し、ローカルファイルシステム上のファイルに直接書き出すことができます。

```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"])
```

この例では、`image`カラムにエンコードされた画像バイトが含まれているため、`.jpg`ファイルに直接書き込むことができます。

> [!NOTE] The `datasets` API doesn't currently push down operations to the Lance table, so for larger datasets it may be slow. For now, you'll get much better performance using the `lance` Python package directly. See the documentation on [the Hub](https://huggingface.co/docs/datasets-lance) for examples on usage.

## 画像のデコード

デフォルトでは、データセットを反復処理する際、画像は`PIL.Images`として逐次的にデコードされます。ただし、マルチスレッドデコードを使用することで、データセットを大幅に高速化できます。

```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 !
...     ...
```

`num_threads` を使用してマルチスレッドを有効にできます。これはリモートデータストリーミングの高速化に特に役立ちます。ただし、高速ディスク上のローカルデータの場合、`num_threads=0` よりも遅くなる可能性があります。

`PIL.Images` としてデコードされた画像に関心がない場合、代わりにパスやバイトにアクセスしたい場合は、デコードを無効化できます。

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

注: [IterableDataset.decode()](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.IterableDataset.decode) は現在、ストリーミングデータセットでのみ利用可能です。

