كيفية إنشاء تجزئة الصور باستخدام SVM: دليل خطوة بخطوة
نشرت: 2024-12-05يعد تجزئة الصورة مهمة أساسية في رؤية الكمبيوتر، حيث يتم تقسيم الصورة إلى مناطق أو أجزاء تشترك في سمات مشتركة مثل اللون أو الملمس أو الكثافة. تعتبر عملية التجزئة هذه مفيدة في مجالات مختلفة، بما في ذلك التصوير الطبي، واكتشاف الأجسام، وتحليل صور الأقمار الصناعية. إحدى الأدوات القوية لتجزئة الصور هي آلة دعم المتجهات (SVM). في هذا الدليل التفصيلي، سنرشدك إلى كيفية إنشاء نموذج تجزئة الصورة باستخدام SVM.
ما هي آلة ناقل الدعم (SVM)؟
أجهزة المتجهات الداعمة (SVM) هي خوارزميات تعلم آلي خاضعة للإشراف تُستخدم بشكل شائع لمهام التصنيف والانحدار. في تجزئة الصورة، يمكن لـ SVM تصنيف كل بكسل من الصورة إلى فئات مختلفة (على سبيل المثال، المقدمة أو الخلفية أو كائنات مختلفة) بناءً على ميزات البكسل مثل اللون أو الكثافة أو الملمس.
يعمل SVM من خلال إيجاد مستوى فائق مثالي يعمل على زيادة الهامش بين الفئات المختلفة. في حالة تجزئة الصورة، يكون الهدف هو تصنيف كل بكسل في الصورة إلى إحدى الفئات المحددة مسبقًا باستخدام مصنف SVM مُدرب.
الخطوة 1: استيراد المكتبات المطلوبة
أولاً، لنقم بإعداد البيئة واستيراد المكتبات الضرورية. سنستخدم لغة Python مع المكتبات الشائعة مثل OpenCV وScikit-learn وNumPy.
import cv2 import numpy as np from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, accuracy_score
الخطوة 2: تحميل الصورة
الخطوة الأولى في عملية التجزئة هي تحميل الصورة التي تريد تقسيمها. يمكنك استخدام OpenCV لتحميل الصورة وتحويلها إلى التنسيق المناسب للتجزئة.
# Load the image image = cv2.imread('your_image.jpg') # Convert to grayscale for simplicity (you can also work with color channels if needed) gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
المعالجة المسبقة (اختياري)
في بعض الحالات، يكون من المفيد تطبيق بعض تقنيات المعالجة المسبقة لتحسين الصورة قبل التجزئة. تتضمن خطوات المعالجة المسبقة الشائعة التجانس وتقليل الضوضاء ومعادلة الرسم البياني.
# Optional: Apply GaussianBlur to reduce noise blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
الخطوة 3: استخراج الميزة
في تجزئة الصور المستندة إلى SVM، تتمثل المهمة التالية في استخراج الميزات ذات الصلة من الصورة التي يمكن استخدامها لتصنيف كل بكسل. تتضمن الميزات الشائعة كثافة البكسل والملمس والرسوم البيانية الملونة. للتبسيط، سنبدأ بكثافة البكسل كميزة.
# Flatten the image to create a feature vector for each pixel features = gray_image.flatten() # Using grayscale intensity as a feature
بالنسبة للصور الملونة، قد ترغب في استخدام الرسوم البيانية الملونة (قيم RGB أو HSV)، أو المزيد من الميزات المتقدمة مثل الأنماط الثنائية المحلية (LBP) للنسيج.
الخطوة 4: تحديد التسميات
للتعلم الخاضع للإشراف، نحتاج إلى بيانات مصنفة. عادةً، في تجزئة الصورة، يتضمن ذلك تسمية كل بكسل في الصورة. يمكنك تسمية مجموعة فرعية من الصورة يدويًا أو استخدام الحقيقة الأساسية الموجودة (إذا كانت متوفرة). يمكن أن تكون التسميات ثنائية (المقدمة مقابل الخلفية) أو متعددة الفئات (كائنات متعددة).
للتبسيط، لنفترض أننا قمنا بتسمية البكسلات يدويًا:
# Manually define labels (0 for background, 1 for object) labels = np.array([0, 1, 1, 0, 1, 0]) # Example, label values for each pixel
إذا كانت لديك علامات الحقيقة الأرضية على شكل صورة، فيمكنك استخدامها مباشرة.
الخطوة 5: تدريب مصنف SVM
بمجرد حصولك على الميزات والتسميات، فإن الخطوة التالية هي تقسيم البيانات إلى مجموعات تدريب واختبار وتدريب مصنف SVM.
# Split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # Initialize the SVM classifier (using a linear kernel as an example) svm_classifier = svm.SVC(kernel='linear') # Train the SVM model svm_classifier.fit(X_train.reshape(-1, 1), y_train)
الخطوة 6: تقييم النموذج
بعد تدريب النموذج، من المهم تقييم أدائه باستخدام مجموعة الاختبار. سيساعدك هذا على تقييم قدرة المصنف على تقسيم الصورة بشكل صحيح.
# Predict using the test set y_pred = svm_classifier.predict(X_test.reshape(-1, 1)) # Evaluate the classifier performance print(classification_report(y_test, y_pred)) print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
الخطوة 7: تطبيق نموذج SVM المُدرب للتجزئة
بمجرد تدريب مصنف SVM وتقييمه، يمكننا استخدامه للتنبؤ بالتسميات لكل بكسل في الصورة الأصلية وإنشاء الصورة المجزأة.
# Predict labels for the entire image segmented_image = svm_classifier.predict(features.reshape(-1, 1)) # Reshape the result back to the original image shape segmented_image = segmented_image.reshape(gray_image.shape) # Display the segmented image cv2.imshow('Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()
ستعرض الصورة المقسمة مناطق مختلفة من الصورة بناءً على تصنيف SVM. يمكنك تصور نتيجة التقسيم، حيث يتم تمثيل كل فئة عادةً بلون أو تسمية فريدة.
الخطوة 8: المعالجة اللاحقة (اختياري)
في بعض الحالات، يمكن أن تساعد تقنيات ما بعد المعالجة مثل العمليات المورفولوجية (مثل التآكل والتمدد) في تنظيف المناطق المجزأة وإزالة القطع الأثرية الصغيرة.
# Apply morphological operations to improve segmentation (optional) kernel = np.ones((5, 5), np.uint8) segmented_image = cv2.dilate(segmented_image, kernel, iterations=1) segmented_image = cv2.erode(segmented_image, kernel, iterations=1) # Display final segmented image cv2.imshow('Final Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()
خاتمة
يوفر استخدام SVM لتجزئة الصور طريقة فعالة لتصنيف وحدات بكسل الصورة إلى فئات مختلفة. باتباع هذه الخطوات - بدءًا من تحميل الصورة وحتى تطبيق نموذج SVM المُدرب للتجزئة - يمكنك تقسيم الصور بناءً على ميزات البكسل. بينما يستخدم هذا الدليل ميزات كثافة التدرج الرمادي الأساسية، يمكنك تحسين الأداء من خلال دمج ميزات أكثر تعقيدًا مثل الرسوم البيانية الملونة أو الملمس أو الأساليب المستندة إلى التعلم العميق لاستخراج الميزات.
تتميز طريقة SVM لتجزئة الصور بأنها متعددة الاستخدامات ويمكن تطبيقها على مجموعة متنوعة من حالات الاستخدام، بما في ذلك التصوير الطبي والقيادة الذاتية وتحليل صور الأقمار الصناعية، مما يوفر نتائج تجزئة دقيقة وفعالة.