# Nesne algılama

Nesne algılama modelleri bir görüntüdeki bir şeyi belirler ve nesne algılama veri setleri, otonom sürüş ve orman yangını gibi doğal tehlikelerin tespiti gibi uygulamalarda kullanılır. Bu kılavuz, [Albumentations](https://albumentations.ai/docs/)'daki [öğretici](https://albumentations.ai/docs/examples/example_bboxes/)yi takip ederek bir nesne algılama veri setine dönüşümler nasıl uygulanacağını gösterecektir.

Bu örnekleri çalıştırmak için [albumentations](https://albumentations.ai/docs/) ve [cv2](https://docs.opencv.org/4.10.0/) kütüphanelerinin güncel sürümlerinin yüklü olduğundan emin olun:

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

Bu örnekte, COVID-19 salgını bağlamında tıbbi kişisel koruyucu ekipman (PPE) tanımlamak için [`cppe-5`](https://huggingface.co/datasets/rishitdagli/cppe-5) veri setini kullanacaksınız.

Veri setini yükleyin ve bir örneğe göz atın:

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

Veri setinin aşağıdaki alanları vardır:

- `image`: Görseli içeren PIL.Image.Image nesnesi.
- `image_id`: Görsel kimliği.
- `height`: Görselin yüksekliği.
- `width`: Görüntü genişliği.
- `objects`: Görseldeki nesnelerin sınırlayıcı kutu (bounding box) meta verilerini içeren bir sözlük:
  - `id`: Etiket kimliği.
  - `area`: Sınır kutusunun alanı.
  - `bbox`: Nesnenin sınırlayıcı kutusu ([coco](https://albumentations.ai/docs/3-basic-usage/bounding-boxes-augmentations/#understanding-bounding-box-formats) biçiminde).
  - `category`: Nesnenin kategorisi; olası değerler arasında `Coverall (0)`, `Face_Shield (1)`, `Gloves (2)`, `Goggles (3)` ve `Mask (4)` bulunur.

Görseldeki `bboxes` değerlerini bazı dahili torch yardımcı programlarını kullanarak görselleştirebilirsiniz. Bunu yapmak için, kategori kimlikleriyle ilişkili [ClassLabel](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.ClassLabel) özelliğine başvurmanız gerekir; böylece metin etiketlerini sorgulayabilirsiniz:

```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,
...     )
... )
```

    

`albumentations` ile görüntüye etki edecek dönüşümleri uygulayabilir ve `bboxes` değerlerini buna göre güncelleyebilirsiniz. Bu durumda görüntü (480, 480) boyutuna yeniden ölçeklenir, yatay olarak aynalanır ve aydınlatılır.

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

Şimdi sonucu görselleştirdiğinizde, görüntü ters çevrilmiş olmalı, ancak `bboxes` hâlâ doğru konumlarda olmalıdır.

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

    

Bir örnek grubuna dönüştürmeyi uygulamak için bir fonksiyon oluşturun:

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

Dönüşümü anlık olarak uygulamak ve daha az disk alanı tüketmek için [set_transform()](/docs/datasets/v5.2.0/tr/package_reference/main_classes#datasets.Dataset.set_transform) işlevini kullanın. Veri artırma rastgeleliği, aynı örneğe iki kez eriştiğinizde farklı bir görüntü döndürebilir. Bu, bir modeli birkaç epoch boyunca eğittiğinizde özellikle faydalıdır.

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

Dönüşümün çalıştığını 10. örneği görselleştirerek doğrulayabilirsiniz:

```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]
> Bir nesne algılama veri setini nasıl işleyeceğinizi öğrendiğinize göre, şimdi [bir nesne algılama modelini nasıl eğiteceğinizi](https://colab.research.google.com/github/NielsRogge/Transformers-Tutorials/blob/master/YOLOS/Fine_tuning_YOLOS_for_object_detection_on_custom_dataset_(balloon).ipynb) ve çıkarım için nasıl kullanacağınızı öğrenin.

