يلعب تجزئة الصور دورًا حيويًا في فهم البيانات المرئية وتحليلها، وتعد عمليات القطع الطبيعية (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 رؤى مفيدة حول جودة التجزئة، على الرغم من أن هناك حاجة إلى مزيد من التحسين للتعامل مع السيناريوهات متعددة الفئات بفعالية.
وأخيرًا، يتوفر مثال كامل في دفتر ملاحظاتي هنا.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3