Datasets documentation
画像データを処理する
画像データを処理する
このガイドでは、画像データセットを処理するための具体的な方法を示します。次のことを学びます:
- 画像データセットでmap()を使用します。
- set_transform() を使用して、データセットにデータ拡張を適用します。
あらゆるタイプのデータセットを処理する方法に関するガイドについては、一般的な処理ガイドをご覧ください。
マップ
map() 関数を使用すると、データセット全体にトランスフォームを適用できます。
例えば、基本的なResize関数を作成します:
>>> def transforms(examples):
... examples["pixel_values"] = [image.convert("RGB").resize((100,100)) for image in examples["image"]]
... return examples次に、map()関数を使用してデータセット全体をリサイズし、batched=Trueを設定して、サンプルのバッチを受け入れることで処理を高速化します。この変換は、キャッシュ可能なPIL.Imageオブジェクトとしてpixel_valuesを返します:
>>> dataset = dataset.map(transforms, remove_columns=["image"], batched=True)
>>> dataset[0]
{'label': 6,
'pixel_values': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=100x100 at 0x7F058237BB10>}キャッシュファイルにより、同じ変換を2回実行する必要がなくなるため、時間を節約できます。map()関数は、トレーニングごとに1回だけ実行する操作(画像のリサイズなど)に最適であり、エポックごとに実行される操作(データ拡張など)には使用しないでください。
map()はメモリを消費しますが、以下のパラメータを使用してメモリ要件を削減できます。
batch_sizeは、transform関数の1回の呼び出しで処理されるサンプルの数を決定します。writer_batch_sizeは、メモリに保持された後に保存される処理済みサンプルの数を決定します。
両方のパラメータのデフォルト値は1000です。画像を保存している場合、コストが高くなる可能性があります。map()を使用する際は、これらの値を下げることによりメモリ使用量を削減できます。
変換を適用する
🤗 Datasets は、任意のライブラリやパッケージからのデータ拡張をデータセットに適用します。set_transform() を使用すると、データの一括(バッチ)に対してオンザフライで変換を適用でき、ディスク容量の消費を削減できます。
以下の例ではtorchvisionを使用していますが、Albumentations、Kornia、imgaugなどの他のデータ拡張ライブラリも自由に使用できます。
例えば、画像の色をランダムに変更したい場合は、次のようにします。
>>> from torchvision.transforms import Compose, ColorJitter, ToTensor
>>> jitter = Compose(
... [
... ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.7),
... ToTensor(),
... ]
... )ColorJitter 変換を適用する関数を作成します:
>>> def transforms(examples):
... examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]]
... return examplesset_transform()関数を使用して変換を適用します:
>>> dataset.set_transform(transforms)