# Deteksi objek

Model deteksi objek mengidentifikasi sesuatu dalam gambar, dan dataset deteksi objek digunakan untuk aplikasi seperti pengemudian otonom dan mendeteksi bahaya alam seperti kebakaran hutan. Panduan ini akan menunjukkan cara menerapkan transformasi pada dataset deteksi objek mengikuti [tutorial](https://albumentations.ai/docs/examples/example_bboxes/) dari [Albumentations](https://albumentations.ai/docs/).

Untuk menjalankan contoh-contoh ini, pastikan Anda telah menginstal versi terbaru dari [albumentations](https://albumentations.ai/docs/) dan [cv2](https://docs.opencv.org/4.10.0/):

```bash
pip install -U albumentations opencv-python
```

Pada contoh ini, Anda akan menggunakan dataset [`cppe-5`](https://huggingface.co/datasets/rishitdagli/cppe-5) untuk mengidentifikasi alat pelindung diri (APD) medis dalam konteks pandemi COVID-19.

Muat dataset dan lihat contohnya:

```py
>>> from datasets import load_dataset

>>> ds = load_dataset("rishitdagli/cppe-5")
>>> example = ds['train'][0]
>>> example
{'height': 663,
 'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=943x663 at 0x7FC3DC756250>,
 'image_id': 15,
 'objects': {'area': [3796, 1596, 152768, 81002],
  'bbox': [[302.0, 109.0, 73.0, 52.0],
   [810.0, 100.0, 57.0, 28.0],
   [160.0, 31.0, 248.0, 616.0],
   [741.0, 68.0, 202.0, 401.0]],
  'category': [4, 4, 0, 0],
  'id': [114, 115, 116, 117]},
 'width': 943}
```

Dataset memiliki field-field berikut:

- `image`: objek PIL.Image.Image yang berisi gambar.
- `image_id`: ID gambar.
- `height`: Tinggi gambar.
- `width`: Lebar gambar.
- `objects`: Kamus yang berisi metadata kotak pembatas untuk objek dalam gambar:
  - `id`: ID anotasi.
  - `area`: Area dari kotak pembatas.
  - `bbox`: Kotak pembatas objek (dalam format [coco](https://albumentations.ai/docs/3-basic-usage/bounding-boxes-augmentations/#understanding-bounding-box-formats)).
  - `category`: Kategori objek, dengan nilai yang mungkin termasuk `Coverall (0)`, `Face_Shield (1)`, `Gloves (2)`, `Goggles (3)` dan `Mask (4)`.

Anda dapat memvisualisasikan `bboxes` pada gambar menggunakan beberapa utilitas internal torch. Untuk melakukannya, Anda perlu merujuk pada fitur [ClassLabel](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.ClassLabel) yang terkait dengan ID kategori agar dapat mencari label string:

```py
>>> import torch
>>> from torchvision.ops import box_convert
>>> from torchvision.utils import draw_bounding_boxes
>>> from torchvision.transforms.functional import pil_to_tensor, to_pil_image

>>> categories = ds['train'].features['objects'].feature['category']

>>> boxes_xywh = torch.tensor(example['objects']['bbox'])
>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy')
>>> labels = [categories.int2str(x) for x in example['objects']['category']]
>>> to_pil_image(
...     draw_bounding_boxes(
...         pil_to_tensor(example['image']),
...         boxes_xyxy,
...         colors="red",
...         labels=labels,
...     )
... )
```

    

Dengan `albumentations`, Anda dapat menerapkan transformasi yang memengaruhi gambar sekaligus memperbarui `bboxes` secara sesuai. Dalam kasus ini, gambar di-resize menjadi (480, 480), dibalik secara horizontal, dan dibuat lebih terang.

```py
>>> import albumentations
>>> import numpy as np

>>> transform = albumentations.Compose([
...     albumentations.Resize(480, 480),
...     albumentations.HorizontalFlip(p=1.0),
...     albumentations.RandomBrightnessContrast(p=1.0),
... ], bbox_params=albumentations.BboxParams(format='coco',  label_fields=['category']))

>>> image = np.array(example['image'])
>>> out = transform(
...     image=image,
...     bboxes=example['objects']['bbox'],
...     category=example['objects']['category'],
... )
```

Sekarang, saat Anda memvisualisasikan hasilnya, gambar seharusnya terbalik, tetapi `bboxes` seharusnya tetap berada di tempat yang benar.

```py
>>> image = torch.tensor(out['image']).permute(2, 0, 1)
>>> boxes_xywh = torch.stack([torch.tensor(x) for x in out['bboxes']])
>>> boxes_xyxy = box_convert(boxes_xywh, 'xywh', 'xyxy')
>>> labels = [categories.int2str(x) for x in out['category']]
>>> to_pil_image(
...     draw_bounding_boxes(
...         image,
...         boxes_xyxy,
...         colors='red',
...         labels=labels
...     )
... )
```

    

Buat fungsi untuk menerapkan transform ke batch contoh:

```py
>>> def transforms(examples):
...     images, bboxes, categories = [], [], []
...     for image, objects in zip(examples['image'], examples['objects']):
...         image = np.array(image.convert("RGB"))
...         out = transform(
...             image=image,
...             bboxes=objects['bbox'],
...             category=objects['category']
...         )
...         images.append(torch.tensor(out['image']).permute(2, 0, 1))
...         bboxes.append(torch.tensor(out['bboxes']))
...         categories.append(out['category'])
...     return {'image': images, 'bbox': bboxes, 'category': categories}
```

Gunakan fungsi [set_transform()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.Dataset.set_transform) untuk menerapkan transform secara on-the-fly yang mengonsumsi ruang disk lebih sedikit. Acakannya augmentasi data dapat mengembalikan gambar yang berbeda jika Anda mengakses contoh yang sama dua kali. Hal ini sangat berguna saat melatih model selama beberapa epoch.

```py
>>> ds['train'].set_transform(transforms)
```

Anda dapat memverifikasi bahwa transform bekerja dengan memvisualisasikan contoh ke-10:

```py
>>> example = ds['train'][10]
>>> to_pil_image(
...     draw_bounding_boxes(
...         example['image'],
...         box_convert(example['bbox'], 'xywh', 'xyxy'),
...         colors='red',
...         labels=[categories.int2str(x) for x in example['category']]
...     )
... )
```

    

> [!TIP]
> Sekarang setelah Anda tahu cara memproses dataset untuk deteksi objek, pelajari [bagaimana cara melatih model deteksi objek](https://colab.research.google.com/github/NielsRogge/Transformers-Tutorials/blob/master/YOLOS/Fine_tuning_YOLOS_for_object_detection_on_custom_dataset_(balloon).ipynb) dan menggunakannya untuk inferensi.

