Datasets documentation

Deteksi objek

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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 dari Albumentations.

Untuk menjalankan contoh-contoh ini, pastikan Anda telah menginstal versi terbaru dari albumentations dan cv2:

pip install -U albumentations opencv-python

Pada contoh ini, Anda akan menggunakan dataset cppe-5 untuk mengidentifikasi alat pelindung diri (APD) medis dalam konteks pandemi COVID-19.

Muat dataset dan lihat contohnya:

>>> 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 (bounding box) untuk objek-objek dalam gambar:
    • id: ID anotasi.
    • area: Area dari kotak pembatas.
    • bbox: Kotak pembatas objek (dalam format coco).
    • 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 yang terkait dengan ID kategori agar dapat mencari label string:

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

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

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

>>> 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() 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.

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

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

>>> 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']]
...     )
... )

Sekarang setelah Anda tahu cara memproses dataset untuk deteksi objek, pelajari bagaimana cara melatih model deteksi objek dan menggunakannya untuk inferensi.

Update on GitHub