Datasets documentation
التجزئة الدلالية
التجزئة الدلالية
تُستخدم مجموعات بيانات التقسيم الدلالي لتدريب نموذج على تصنيف كل بكسل في صورة. هناك مجموعة واسعة من التطبيقات التي تتيحها هذه المجموعات، مثل إزالة الخلفية من الصور، أو تنسيق الصور، أو فهم المشاهد للقيادة الذاتية. سيوضح لك هذا الدليل كيفية تطبيق التحويلات على مجموعة بيانات تقسيم الصور.
قبل أن تبدأ، تأكد من تثبيت أحدث إصدارات من albumentations وcv2:
pip install -U albumentations opencv-python
Albumentations هي مكتبة بلغة بايثون لتنفيذ زيادة البيانات لرؤية الحاسوب. تدعم مهام رؤية الحاسوب المختلفة مثل تصنيف الصور، وكشف الأجسام، والتجزئة، وتقدير النقاط الرئيسية.
يستخدم هذا الدليل مجموعة بيانات Scene Parsing لتجزئة الصورة وتحليلها إلى مناطق مختلفة مرتبطة بفئات دلالية، مثل السماء والطريق والشخص والسرير.
حمّل الجزء train من مجموعة البيانات وانظر إلى مثال:
>>> from datasets import load_dataset
>>> dataset = load_dataset("scene_parse_150", split="train")
>>> index = 10
>>> dataset[index]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=683x512 at 0x7FB37B0EC810>,
'annotation': <PIL.PngImagePlugin.PngImageFile image mode=L size=683x512 at 0x7FB37B0EC9D0>,
'scene_category': 927}تحتوي مجموعة البيانات على ثلاثة حقول:
image: كائن صورة من مكتبة PIL.annotation: قناع تقسيم الصورة.scene_category: التسمية أو فئة المشهد للصورة (مثل “مطبخ” أو “مكتب”).
التالي، اطّلع على صورة باستخدام:
>>> dataset[index]["image"]
وبالمثل، يمكنك الاطلاع على قناع التقطيع المقابل:
>>> dataset[index]["annotation"]
يمكننا أيضًا إضافة لوحة ألوان على قناع التقسيم وتراكبه فوق الصورة الأصلية لتصور مجموعة البيانات:
بعد تحديد لوحة الألوان، يجب أن تكون مستعدًا لتصور بعض التراكبات.
>>> import matplotlib.pyplot as plt
>>> def visualize_seg_mask(image: np.ndarray, mask: np.ndarray):
... color_seg = np.zeros((mask.shape[0], mask.shape[1], 3), dtype=np.uint8)
... palette = np.array(create_ade20k_label_colormap())
... for label, color in enumerate(palette):
... color_seg[mask == label, :] = color
... color_seg = color_seg[..., ::-1] # convert to BGR
... img = np.array(image) * 0.5 + color_seg * 0.5 # plot the image with the segmentation map
... img = img.astype(np.uint8)
... plt.figure(figsize=(15, 10))
... plt.imshow(img)
... plt.axis("off")
... plt.show()
>>> visualize_seg_mask(
... np.array(dataset[index]["image"]),
... np.array(dataset[index]["annotation"])
... )
الآن طبّق بعض عمليات المعالجة باستخدام albumentations. ستقوم أولاً بتغيير حجم الصورة وضبط سطوعها.
>>> import albumentations
>>> transform = albumentations.Compose(
... [
... albumentations.Resize(256, 256),
... albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3, p=0.5),
... ]
... )أنشئ دالةً لتطبيق التحويل على الصور:
>>> def transforms(examples):
... transformed_images, transformed_masks = [], []
...
... for image, seg_mask in zip(examples["image"], examples["annotation"]):
... image, seg_mask = np.array(image), np.array(seg_mask)
... transformed = transform(image=image, mask=seg_mask)
... transformed_images.append(transformed["image"])
... transformed_masks.append(transformed["mask"])
...
... examples["pixel_values"] = transformed_images
... examples["label"] = transformed_masks
... return examplesاستخدم دالة set_transform() لتطبيق التحويل على دفعات مجموعة البيانات أثناء التشغيل لتقليل مساحة القرص المستهلكة:
>>> dataset.set_transform(transforms)يمكنك التحقق من نجاح التحويل عن طريق الوصول إلى pixel_values وlabel في مثال:
>>> image = np.array(dataset[index]["pixel_values"])
>>> mask = np.array(dataset[index]["label"])
>>> visualize_seg_mask(image, mask)
في هذا الدليل، استخدمتَ albumentations لزيادة حجم مجموعة البيانات. كما يمكن استخدام torchvision لتطبيق بعض التحويلات المشابهة.
>>> from torchvision.transforms import Resize, ColorJitter, Compose
>>> transformation_chain = Compose([
... Resize((256, 256)),
... ColorJitter(brightness=0.25, contrast=0.25, saturation=0.25, hue=0.1)
... ])
>>> resize = Resize((256, 256))
>>> def train_transforms(example_batch):
... example_batch["pixel_values"] = [transformation_chain(x) for x in example_batch["image"]]
... example_batch["label"] = [resize(x) for x in example_batch["annotation"]]
... return example_batch
>>> dataset.set_transform(train_transforms)
>>> image = np.array(dataset[index]["pixel_values"])
>>> mask = np.array(dataset[index]["label"])
>>> visualize_seg_mask(image, mask)
Update on GitHubالآن بعد أن أصبحت تعرف كيفية معالجة مجموعة بيانات للتجزئة الدلالية، تعلّم كيفية تدريب نموذج للتجزئة الدلالية واستخدامه للاستدلال.