# Xử lý dữ liệu hình ảnh

Hướng dẫn này trình bày các phương pháp cụ thể để xử lý các bộ dữ liệu ảnh. Học cách:

- Sử dụng [map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map) với bộ dữ liệu hình ảnh.
- Áp dụng các phép tăng cường dữ liệu cho một tập dữ liệu bằng [set_transform()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.set_transform).

Để tìm hiểu cách xử lý bất kỳ loại tập dữ liệu nào, hãy xem hướng dẫn quy trình chung.

## Bản đồ

Hàm [map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map) có thể áp dụng các phép biến đổi lên toàn bộ bộ dữ liệu.

Ví dụ, tạo một hàm [`Resize`](https://pytorch.org/vision/stable/generated/torchvision.transforms.Resize.html) cơ bản:

```py
>>> def transforms(examples):
...     examples["pixel_values"] = [image.convert("RGB").resize((100,100)) for image in examples["image"]]
...     return examples
```

Bây giờ hãy sử dụng hàm [map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map) để thay đổi kích thước toàn bộ tập dữ liệu, và đặt `batched=True` để tăng tốc quá trình bằng cách nhận các lô ví dụ. Biến đổi trả về `pixel_values` dưới dạng đối tượng `PIL.Image` có thể lưu vào bộ nhớ đệm:

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

Tệp cache giúp tiết kiệm thời gian vì bạn không cần thực thi cùng một phép biến đổi hai lần. Hàm [map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map) phù hợp nhất cho các thao tác chỉ chạy một lần mỗi lần huấn luyện - như thay đổi kích thước ảnh - thay vì dùng cho các thao tác được thực thi ở mỗi epoch, như tăng cường dữ liệu.

[map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map) chiếm một lượng bộ nhớ nhất định, nhưng bạn có thể giảm yêu cầu về bộ nhớ của nó bằng các tham số sau:

- [`batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.batch_size) xác định số lượng ví dụ được xử lý trong một lần gọi hàm transform.
- [`writer_batch_size`](./package_reference/main_classes#datasets.DatasetDict.map.writer_batch_size) xác định số lượng ví dụ đã được xử lý được giữ trong bộ nhớ trước khi chúng được lưu trữ.

Cả hai giá trị tham số mặc định đều là 1000, điều này có thể tốn kém nếu bạn đang lưu trữ hình ảnh. Hãy giảm các giá trị này để sử dụng ít bộ nhớ hơn khi bạn dùng [map()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.map).

## Áp dụng các phép biến đổi

🤗 Datasets áp dụng các phép tăng cường dữ liệu từ bất kỳ thư viện hoặc gói nào lên tập dữ liệu của bạn. Các phép biến đổi có thể được áp dụng trực tiếp trên các lô dữ liệu bằng [set_transform()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.set_transform), giúp tiết kiệm dung lượng ổ đĩa hơn.

> [!TIP]
> Ví dụ sau sử dụng [torchvision](https://pytorch.org/vision/stable/index.html), nhưng bạn có thể tự do sử dụng các thư viện tăng cường dữ liệu khác như [Albumentations](https://albumentations.ai/docs/), [Kornia](https://kornia.readthedocs.io/en/latest/) và [imgaug](https://imgaug.readthedocs.io/en/latest/).

Ví dụ, nếu bạn muốn thay đổi các thuộc tính màu của một hình ảnh một cách ngẫu nhiên:

```py
>>> from torchvision.transforms import Compose, ColorJitter, ToTensor

>>> jitter = Compose(
...     [
...          ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.7),
...          ToTensor(),
...     ]
... )
```

Tạo một hàm để áp dụng biến đổi `ColorJitter`:

```py
>>> def transforms(examples):
...     examples["pixel_values"] = [jitter(image.convert("RGB")) for image in examples["image"]]
...     return examples
```

Áp dụng phép biến đổi bằng hàm [set_transform()](/docs/datasets/v5.2.0/vi/package_reference/main_classes#datasets.Dataset.set_transform):

```py
>>> dataset.set_transform(transforms)
```

