Datasets documentation

كشف الكائنات

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

كشف الكائنات

تحدد نماذج اكتشاف الأشياء شيئًا ما في صورة، وتُستخدم مجموعات بيانات اكتشاف الأشياء لتطبيقات مثل القيادة الذاتية وكشف المخاطر الطبيعية مثل حرائق الغابات. سيُظهر لك هذا الدليل كيفية تطبيق التحويلات على مجموعة بيانات اكتشاف الأشياء بعد اتباع الدليل التعليمي من Albumentations.

لتشغيل هذه الأمثلة، تأكد من تثبيت أحدث إصدارات من albumentations وcv2:

pip install -U albumentations opencv-python

في هذا المثال، ستستخدم مجموعة البيانات cppe-5 لتحديد معدات الوقاية الشخصية الطبية (PPE) في سياق جائحة كوفيد-19.

حمّل مجموعة البيانات واطّلع على مثال:

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

تحتوي مجموعة البيانات على الحقول التالية:

  • image: كائن من نوع PIL.Image.Image يحتوي على الصورة.
  • image_id: معرّف الصورة.
  • height: ارتفاع الصورة.
  • width: عرض الصورة.
  • objects: قاموس يحتوي على بيانات وصفية لصفوف الإحداثيات المحيطة بالأشياء في الصورة:
    • id: معرّف التعليق.
    • area: مساحة صندوق الحدود.
    • bbox: صندوق الحدود الخاص بالكائن (بصيغة coco).
    • category: فئة الكائن، مع قيم محتملة تشمل Coverall (0)، Face_Shield (1)، Gloves (2)، Goggles (3) وMask (4).

يمكنك تصور bboxes على الصورة باستخدام بعض أدوات torch الداخلية. للقيام بذلك، ستحتاج إلى الإشارة إلى ميزة ClassLabel المرتبطة بمعرّفات الفئات حتى تتمكن من البحث عن التسميات النصية:

>>> 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، يمكنك تطبيق تحويلات تؤثر على الصورة مع تحديث bboxes وفقاً لذلك. في هذه الحالة، يتم تغيير حجم الصورة إلى (480, 480)، وقلبها أفقياً، وإبرازها.

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

الآن عند عرض النتيجة، يجب أن تكون الصورة مقلوبة، لكن bboxes يجب أن تبقى في أماكنها الصحيحة.

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

أنشئ دالةً لتطبيق التحويل على دفعة من الأمثلة:

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

استخدم دالة set_transform() لتطبيق التحويل بشكل فوري، مما يستهلك مساحة أقراص أقل. قد يؤدي عشوائية زيادة البيانات إلى إرجاع صورة مختلفة إذا قمت بالوصول إلى نفس المثال مرتين. وهو مفيد بشكل خاص عند تدريب نموذج لعدة فترات.

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

يمكنك التحقق من عمل التحويل عن طريق تصور المثال العاشر:

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