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:

pip install -U albumentations 

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

يستخدم هذا الدليل مجموعة بيانات NYU Depth V2 التي تتألف من تسلسلات فيديو من مشاهد داخلية متنوعة، سُجّلت بواسطة كاميرات RGB وكاميرات العمق. تتكون المجموعة من مشاهد من 3 مدن وتوفر الصور مع خرائط العمق الخاصة بها كوسوم.

حمّل الجزء train من مجموعة البيانات وانظر إلى مثال:

>>> from datasets import load_dataset

>>> train_dataset = load_dataset("sayakpaul/nyu_depth_v2", split="train")
>>> index = 17
>>> example = train_dataset[index]
>>> example
{'image': <PIL.PngImagePlugin.PngImageFile image mode=RGB size=640x480>,
 'depth_map': <PIL.TiffImagePlugin.TiffImageFile image mode=F size=640x480>}

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

  • image: كائن صورة PNG من مكتبة PIL بنوع بيانات uint8.
  • depth_map: كائن صورة Tiff من مكتبة PIL بنوع بيانات float32 وهو خريطة العمق للصورة.

هنا تُستخدم خرائط العمق بصيغة TIFF لأنها تدعم مجموعة واسعة من أنواع البيانات، بما في ذلك بيانات float32. ومع ذلك، تجدر الإشارة إلى أن صيغة JPEG/PNG لا يمكنها تخزين سوى بيانات uint8 أو uint16. لذلك، إذا كانت لديك خرائط عمق محفوظة بصيغة JPEG/PNG، فاستخدم النوع Image(mode="F") لتحميلها كقناة مفردة من نوع float32 تمامًا مثل خرائط العمق العادية:

>>> from datasets import Image

>>> train_dataset = train_dataset.cast_column("depth_map", Image(mode="F"))

التالي، اطّلع على صورة باستخدام:

>>> example["image"]

قبل أن ننظر إلى خريطة العمق، نحتاج أولاً إلى تحويل نوع بياناتها إلى uint8 باستخدام .convert('RGB') لأن PIL لا يمكنه عرض صور float32. والآن، انظر إلى خريطة العمق المقابلة لها:

>>> example["depth_map"].convert("RGB")

كل شيء أسود! ستحتاج إلى إضافة بعض الألوان إلى خريطة العمق لعرضها بشكل صحيح. للقيام بذلك، يمكننا إما تطبيق الألوان تلقائيًا أثناء العرض باستخدام plt.imshow() أو إنشاء خريطة عمق ملونة باستخدام plt.cm ثم عرضها. في هذا المثال، استخدمنا الطريقة الثانية، حيث يمكننا حفظ/كتابة خريطة العمق الملونة لاحقًا. (الأداة أدناه مأخوذة من مستودع FastDepth).

>>> import numpy as np
>>> import matplotlib.pyplot as plt

>>> cmap = plt.cm.viridis

>>> def colored_depthmap(depth, d_min=None, d_max=None):
...     if d_min is None:
...         d_min = np.min(depth)
...     if d_max is None:
...         d_max = np.max(depth)
...     depth_relative = (depth - d_min) / (d_max - d_min)
...     return 255 * cmap(depth_relative)[:,:,:3]

>>> def show_depthmap(depth_map):
...    if not isinstance(depth_map, np.ndarray):
...        depth_map = np.array(depth_map)
...    if depth_map.ndim == 3:
...        depth_map = depth_map.squeeze()

...    d_min = np.min(depth_map)
...    d_max = np.max(depth_map)
...    depth_map = colored_depthmap(depth_map, d_min, d_max)

...    plt.imshow(depth_map.astype("uint8"))
...    plt.axis("off")
...    plt.show()

>>> show_depthmap(example["depth_map"])

يمكنك أيضًا عرض عدة صور مختلفة مع خرائط العمق المقابلة لها.

>>> def merge_into_row(input_image, depth_target):
...     if not isinstance(input_image, np.ndarray):
...         input_image = np.array(input_image)
...
...     d_min = np.min(depth_target)
...     d_max = np.max(depth_target)
...     depth_target_col = colored_depthmap(depth_target, d_min, d_max)
...     img_merge = np.hstack([input_image, depth_target_col])
...
...     return img_merge

>>> random_indices = np.random.choice(len(train_dataset), 9).tolist()
>>> plt.figure(figsize=(15, 6))
>>> for i, idx in enumerate(random_indices):
...     example = train_dataset[idx]
...     ax = plt.subplot(3, 3, i + 1)
...     image_viz = merge_into_row(
...         example["image"], example["depth_map"]
...     )
...     plt.imshow(image_viz.astype("uint8"))
...     plt.axis("off")

الآن طبّق بعض عمليات المعالجة باستخدام albumentations. وتشمل تحويلات المعالجة ما يلي:

  • القلب الأفقي العشوائي
  • القص العشوائي
  • السطوع والتباين العشوائيان
  • تصحيح غاما عشوائي
  • التشبع العشوائي للدرجة اللونية
>>> import albumentations as A

>>> crop_size = (448, 576)
>>> transforms = [
...     A.HorizontalFlip(p=0.5),
...     A.RandomCrop(crop_size[0], crop_size[1]),
...     A.RandomBrightnessContrast(),
...     A.RandomGamma(),
...     A.HueSaturationValue()
... ]

بالإضافة إلى ذلك، عرّف خرائط (mapping) لتعكس اسم المفتاح المستهدف بشكل أفضل.

>>> additional_targets = {"depth": "mask"}
>>> aug = A.Compose(transforms=transforms, additional_targets=additional_targets)

عند تعريف additional_targets، يمكنك تمرير خرائط العمق المستهدفة إلى معامل depth في aug بدلاً من mask. ستلاحظ هذا التغيير في دالة apply_transforms() المعرّفة أدناه.

أنشئ دالة لتطبيق التحويل على الصور وكذلك خرائط العمق الخاصة بها:

>>> def apply_transforms(examples):
...     transformed_images, transformed_maps = [], []
...     for image, depth_map in zip(examples["image"], examples["depth_map"]):
...         image, depth_map = np.array(image), np.array(depth_map)
...         transformed = aug(image=image, depth=depth_map)
...         transformed_images.append(transformed["image"])
...         transformed_maps.append(transformed["depth"])
...
...     examples["pixel_values"] = transformed_images
...     examples["labels"] = transformed_maps
...     return examples

استخدم دالة set_transform() لتطبيق التحويل على دفعات مجموعة البيانات أثناء التشغيل لتقليل مساحة القرص المستهلكة:

>>> train_dataset.set_transform(apply_transforms)

يمكنك التحقق من نجاح التحويل عن طريق الوصول إلى pixel_values وlabels لصورة مثال:

>>> example = train_dataset[index]

>>> plt.imshow(example["pixel_values"])
>>> plt.axis("off")
>>> plt.show()

Visualize the same transformation on the image’s corresponding depth map:

>>> show_depthmap(example["labels"])

يمكنك أيضًا تصور عدة عينات تدريب مع إعادة استخدام random_indices السابقة:

>>> plt.figure(figsize=(15, 6))

>>> for i, idx in enumerate(random_indices):
...     ax = plt.subplot(3, 3, i + 1)
...     example = train_dataset[idx]
...     image_viz = merge_into_row(
...         example["pixel_values"], example["labels"]
...     )
...     plt.imshow(image_viz.astype("uint8"))
...     plt.axis("off")
Update on GitHub