Datasets documentation
Nesne algılama
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'daki öğreticiyi 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 ve cv2 kütüphanelerinin güncel sürümlerinin yüklü olduğundan emin olun:
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 veri setini kullanacaksınız.
Veri setini yükleyin ve bir örneğe göz atın:
>>> 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 biçiminde).category: Nesnenin kategorisi; olası değerler arasındaCoverall (0),Face_Shield (1),Gloves (2),Goggles (3)veMask (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 özelliğine başvurmanız gerekir; böylece metin etiketlerini sorgulayabilirsiniz:
>>> 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.
>>> 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.
>>> 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:
>>> 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() 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.
>>> ds['train'].set_transform(transforms)Dönüşümün çalıştığını 10. örneği görselleştirerek doğrulayabilirsiniz:
>>> 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']]
... )
... )
Update on GitHubBir 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 ve çıkarım için nasıl kullanacağınızı öğrenin.