"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > دليل لتجزئة الصور غير الخاضعة للرقابة باستخدام عمليات القطع الطبيعية (NCut) في بايثون

دليل لتجزئة الصور غير الخاضعة للرقابة باستخدام عمليات القطع الطبيعية (NCut) في بايثون

تم النشر بتاريخ 2024-11-08
تصفح:274

A Guide to Unsupervised Image Segmentation using Normalized Cuts (NCut) in Python

مقدمة

يلعب تجزئة الصور دورًا حيويًا في فهم البيانات المرئية وتحليلها، وتعد عمليات القطع الطبيعية (NCut) طريقة مستخدمة على نطاق واسع للتجزئة المستندة إلى الرسم البياني. في هذه المقالة، سنستكشف كيفية تطبيق NCut لتجزئة الصور غير الخاضعة للرقابة في Python باستخدام مجموعة بيانات من Microsoft Research، مع التركيز على تحسين جودة التجزئة باستخدام وحدات البكسل الفائقة.
نظرة عامة على مجموعة البيانات
يمكن تنزيل مجموعة البيانات المستخدمة لهذه المهمة من الرابط التالي: قاعدة بيانات صور فئة كائن MSRC. تحتوي مجموعة البيانات هذه على صور أصلية بالإضافة إلى تقسيمها الدلالي إلى تسع فئات كائنات (يشار إليها بملفات الصور التي تنتهي بـ "_GT"). يتم تجميع هذه الصور في مجموعات فرعية موضوعية، حيث يشير الرقم الأول في اسم الملف إلى مجموعة فرعية من الفئة. تعتبر مجموعة البيانات هذه مثالية لتجربة مهام التجزئة.

بيان المشكلة

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

تطبيق

1. تثبيت المكتبات المطلوبة
نحن نستخدم Skiimage لمعالجة الصور، وnumpy للحسابات الرقمية، وmatplotlib للتصور.

pip install numpy matplotlib
pip install scikit-image==0.24.0
**2. Load and Preprocess the Dataset**

بعد تنزيل مجموعة البيانات واستخراجها، قم بتحميل الصور وتجزئة الحقيقة الأساسية:

wget http://download.microsoft.com/download/A/1/1/A116CD80-5B79-407E-B5CE-3D5C6ED8B0D5/msrc_objcategimagedatabase_v1.zip -O msrc_objcategimagedatabase_v1.zip
unzip msrc_objcategimagedatabase_v1.zip
rm msrc_objcategimagedatabase_v1.zip

الآن نحن جاهزون لبدء البرمجة.

from skimage import io, segmentation, color, measure
from skimage import graph
import numpy as np
import matplotlib.pyplot as plt

# Load the image and its ground truth
image = io.imread('/content/MSRC_ObjCategImageDatabase_v1/1_16_s.bmp')
ground_truth = io.imread('/content/MSRC_ObjCategImageDatabase_v1/1_16_s_GT.bmp')

# show images side by side
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image)
ax[0].set_title('Image')
ax[1].imshow(ground_truth)
ax[1].set_title('Ground Truth')
plt.show()

3. إنشاء وحدات بكسل فائقة باستخدام SLIC وإنشاء رسم بياني مجاور للمنطقة

نستخدم خوارزمية SLIC لحساب وحدات البكسل الفائقة قبل تطبيق NCut. باستخدام وحدات البكسل الفائقة التي تم إنشاؤها، نقوم بإنشاء رسم بياني للمنطقة المجاورة (RAG) استنادًا إلى متوسط ​​تشابه الألوان:

from skimage.util import img_as_ubyte, img_as_float, img_as_uint, img_as_float64

compactness=30 
n_segments=100 
labels = segmentation.slic(image, compactness=compactness, n_segments=n_segments, enforce_connectivity=True)
image_with_boundaries = segmentation.mark_boundaries(image, labels, color=(0, 0, 0))
image_with_boundaries = img_as_ubyte(image_with_boundaries)
pixel_labels = color.label2rgb(labels, image_with_boundaries, kind='avg', bg_label=0
يتحكم

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

يتحكم

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

4. تطبيق عمليات القطع الطبيعية (NCut) وتصور النتيجة

# using the labels found with the superpixeled image
# compute the Region Adjacency Graph using mean colors
g = graph.rag_mean_color(image, labels, mode='similarity')

# perform Normalized Graph cut on the Region Adjacency Graph
labels2 = graph.cut_normalized(labels, g)
segmented_image = color.label2rgb(labels2, image, kind='avg')
f, axarr = plt.subplots(nrows=1, ncols=4, figsize=(25, 20))

axarr[0].imshow(image)
axarr[0].set_title("Original")

#plot boundaries
axarr[1].imshow(image_with_boundaries)
axarr[1].set_title("Superpixels Boundaries")

#plot labels
axarr[2].imshow(pixel_labels)
axarr[2].set_title('Superpixel Labels')

#compute segmentation
axarr[3].imshow(segmented_image)
axarr[3].set_title('Segmented image (normalized cut)')

5. مقاييس التقييم
التحدي الرئيسي في التجزئة غير الخاضعة للرقابة هو أن NCut لا يعرف العدد الدقيق للفئات في الصورة. قد يتجاوز عدد المقاطع التي عثر عليها NCut العدد الفعلي لمناطق الحقيقة الأرضية. ونتيجة لذلك، نحتاج إلى مقاييس قوية لتقييم جودة التجزئة.

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

مؤشر التشابه الهيكلي (SSIM) هو مقياس يستخدم لتقييم الجودة المدركة للصورة من خلال مقارنة صورتين من حيث النصوع والتباين والبنية.

لتطبيق هذه المقاييس، نحتاج إلى أن يكون للتنبؤ وصورة الحقيقة الأرضية نفس التسميات. لحساب التسميات نقوم بحساب قناع على الأرض وعلى التنبؤ نقوم بتعيين معرف لكل لون موجود في الصورة
ومع ذلك، قد يؤدي التقسيم باستخدام NCut إلى العثور على مناطق أكثر من الحقيقة الأساسية، مما يؤدي إلى تقليل الدقة.

def compute_mask(image):
  color_dict = {}

  # Get the shape of the image
  height,width,_ = image.shape

  # Create an empty array for labels
  labels = np.zeros((height,width),dtype=int)
  id=0
  # Loop over each pixel
  for i in range(height):
      for j in range(width):
          # Get the color of the pixel
          color = tuple(image[i,j])
          # Check if it is in the dictionary
          if color in color_dict:
              # Assign the label from the dictionary
              labels[i,j] = color_dict[color]
          else:
              color_dict[color]=id
              labels[i,j] = id
              id =1

  return(labels)
def show_img(prediction, groundtruth):
  f, axarr = plt.subplots(nrows=1, ncols=2, figsize=(15, 10))

  axarr[0].imshow(groundtruth)
  axarr[0].set_title("groundtruth")
  axarr[1].imshow(prediction)
  axarr[1].set_title(f"prediction")
prediction_mask = compute_mask(segmented_image)
groundtruth_mask = compute_mask(ground_truth)

#usign the original image as baseline to convert from labels to color
prediction_img = color.label2rgb(prediction_mask, image, kind='avg', bg_label=0)
groundtruth_img = color.label2rgb(groundtruth_mask, image, kind='avg', bg_label=0)

show_img(prediction_img, groundtruth_img)

الآن نقوم بحساب درجات الدقة

from sklearn.metrics import jaccard_score
from skimage.metrics import structural_similarity as ssim

ssim_score = ssim(prediction_img, groundtruth_img, channel_axis=2)
print(f"SSIM SCORE: {ssim_score}")

jac = jaccard_score(y_true=np.asarray(groundtruth_mask).flatten(),
                        y_pred=np.asarray(prediction_mask).flatten(),
                        average = None)

# compute mean IoU score across all classes
mean_iou = np.mean(jac)
print(f"Mean IoU: {mean_iou}")

خاتمة

تعد عمليات القطع الطبيعية طريقة قوية لتجزئة الصور غير الخاضعة للرقابة، ولكنها تأتي مع تحديات مثل التجزئة الزائدة وضبط المعلمات. من خلال دمج وحدات البكسل الفائقة وتقييم الأداء باستخدام المقاييس المناسبة، يمكن لـ NCut تقسيم الصور المعقدة بشكل فعال. توفر مقاييس IoU وRand Index رؤى مفيدة حول جودة التجزئة، على الرغم من أن هناك حاجة إلى مزيد من التحسين للتعامل مع السيناريوهات متعددة الفئات بفعالية.
وأخيرًا، يتوفر مثال كامل في دفتر ملاحظاتي هنا.

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/sopralapanca/a-guide-to-unsupervised-image-segmentation-using-normalized-cuts-ncut-in-python-13pk?1 إذا كان هناك أي انتهاك، من فضلك اتصل بـ [email protected]
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3