المحتويات
المقدمة
ما هو أوّل شيء تفعلُه عندما تُحاول عبور الطريق؟ عادةً تنظُر إلى اليسار واليمين لتتأكّد من عدم وجود مركبات في الشّارع لتتّخِذ قرارك وتستمر في السّير. دماغُنا قادر على تحليل أيّ نوع من الأجسام القادمة نَحونا (سيّارة ، حافِلة، شخص) في غضون أجزاء من الثّانية، فهل يُمكن للآلات أن تَفعل ذلك أيضاً؟
كانت الإجابة سابقاً ” لا “.. ولكن مع التقدم في الرؤية الحاسوبية تغيّرت اللعبة!
الآن نحنُ قادرون على بناء نماذِج رؤية حاسوبيّة تُمكِّننا من اكتشاف الأشياء وتحديد شكلها والتنبُّؤ بالاتّجاه الذي ستذهب إليه.
تُستخدم تقنيّات الرؤية الحاسوبيّة في العديد من تطبيقات حياتِنا اليوميّة، من كاميرات المراقبة (Security Cameras)، بصمة الوجه في الهاتف (Face ID)، التصوير الطُّبّي (Medical Imaging)، والسيّارات ذاتيّة القيادة (Self Driving Cars)، وغيرها.
من أشهر تقنيّات الرؤية الحاسوبيّة:
- تصنيف الصور (Image Classification)
- الكشف عن الكائن (Object Detection)
- تتبُّع الكائن (Object Tracking)
- تجزئة الصور (Image Segmentation)
سوف نتحدث اليوم عن تجزئة الصور.
تجزئة الصورة (Image Segmentation)
تُعتبر مُشكلة التجزئة الفعّالة في الصور الثابتة ذات أهميّة كبيرة في تحرير الصور وفصل الكائنات عنها، حيث يتم تقطيع الصورة الرقميّة إلى أجزاء من الصور ذات الحجم الأصغر، المُترابطة والمُتجانسة فيما بينها وفقاً لمعيار محدّد كاللون مثلاً.
بعد تجزئة الكائن، يكون الكمبيوتر قادرًا على معرفة عدد الكائنات الموجودة في الصورة كما يُمكنه معرفة إذا كان الكائن ينتمي إلى مقدّمة الصورة أو إلى خلفيّتها.
تَعتمِد أدوات تجزئة الصور الكلاسيكية عادةً على معلومات اللون في الصورة (مثل أداة العصا السحريّة Magic Wand في برنامج الفوتوشوب Photoshop والتي تقوم بتحديد الكائنات اعتمادًا على الفروق اللّونيّة)، أو على معلومات الحافة (مثل أداة المقص الذكي Intelligent Scissors في برنامج جيمب Gimp والتي تساعد في تحديد الحواف على محيط الكائن).
لماذا نحتاج إلى تجزئة الصورة؟
لطالما كان السرطان مرضًا مميتًا حتى في عصر التقدُّم التكنولوجي اليوم، كما قد يودي بحياة الكثير إذا لم نتعرف عليه في مرحلة مبكِّرة، وبتحديد شكل الخلايا السرطانيّة يُمكننا تقييم درجة وشدِّة السرطان. هنا لن يكون اكتشاف الكائن مفيد جدًا، حيث سنقوم بإنشاء مربع إحاطة للكائن فقط وذلك لن يساعد في تحديد شكل الخلايا السرطانية.
عملية تجزئة الكائن سوف تساعد بشكل كبير، حيث ستعطي معلومات تفصيليّة عن الحواف وبالتّالي سوف نحصل على نتائج أكثر دِقّة ووضوح.
هُناك العديد من التطبيقات التي نحتاج فيها إلى تجزئة الصور، كأنظمة التحكُّم في حركة المرور، السيّارات ذاتيّة القيادة، تحديد موقع الأشياء في صور الأقمار الصناعيّة وغيرها.
المبدأ العام لعمل خوارزمية استخراج وتجزئة المقدّمة GrabCut
تتألف الصورة بشكل عام من مجموعة من البِكسلات المُختلفة، وكما تعلم إنه ليس من الجيِّد معالجة الصورة بأكملها بنفس الوقت، حيث ستكون هناك مناطق في الصورة لا تحتوي على أي معلومات مفيدة وبالتالي سيؤدي ذلك إلى استهلاك زمن ومعالجة أكثر.
من خلال عمليّة التجزئة يُمكننا الاستفادة من الأجزاء المُهمِّة في الصورة وإهمال الأجزاء غير المُهمِّة، وبالتَّالي تمنحُنا هذه التِّقنيّة فهمًا أكثر دِقَّة. سوف نستخدِم خوارزميّة غرابكت لتجزئة الصورة إلى مقدِّمة (تحتوي على الكائن) وخلفيّة.
غرابكت GrabCut هي طريقة لِتجزئة الصور، تَعتمد على خوارزمية قطع الرَّسم البيانِيّ Graph Cut، بدءًا من مستطيل يُحدّده المُستخدم حول الكائن المُراد تقسيمُه. تقوم الخوارزميّة بتقدير التّوزيع اللوني للكائِن الهدف والخلفيّة وذلك للمساعدة في عملية التجزئة.
مبدأ عمل الخوارزميّة
نبدأ برسم مستطيل على الصورة بحيث يتضمن هذا المستطيل (الكائن) المراد فصله عن الخلفية، مثل شخص أو كرة أو زهرة، بعد ذلك يتم تحديد المنطقة الواقعة خارج المستطيل كخلفية تلقائيًا.
تُحدّد المنطقة الموجودة في المستطيل كنموذج لتوزيع الألوان باستخدام نموذج خليط غاوسي (Gaussian Mixture Model)، حيث سيتُم إعطاء كُل بِكسل عُنوان خاص لمعرفة فيما إذا كان ينتمي للمقدمِّة أم للخلفيّة.
لتبسيط الأمر.. عليك أن تعلم أنّ كُل البِكسلات في الصورة مُتَّصلة ببعضها البعض من خلال التدرُّج اللَّوني، وبالتّالي فإنّ هذا النموذج سوف يشجِّع البِكسلات المُتجاورة (ذات التوزيع اللَّوني المُتشابِه) في الحُصول على نفس العنوان بالضَّبط كما تُلاحظ في الشكل (1).
تضع خوارزمية غرابكت GrabCut عنوانين، عنوان للخلفيّة والآخر للمقدِّمة، ثمّ تُربط جميع وحدات البِكسل (بناءً على تشابه توزُّع الألوان) بالعنوان المناسب لها. سيتطلّب الوصول إلى هذه النقطة قدرًا هائلاً من البحث في الخوارزمية ولكنّك سوف تحصل على صورة مُجزّأة في النهاية.
شرح خوارزمية GrabCut
استُخدِمت خوارزميّة غرابكت GrabCut في عمليّات تجزئة المقدِّمة في الكثير من التطبيقات، وقد أعطت نتائج عالية الجودة مقارنةً مع طرق التجزئة التّقليديّة السّابقة.
تتم تهيئة خوارزميّة غرابكت GrabCut باستخدام إحدى الطّريقتين:
- تهيئة صورة الدخل input image مع bounding box مربَّع مُحيط يُحدِّد موقع الكائن في الصورة.
- تهيئة صورة الدخل input image مع القِناع المُقترح mask approximations (قناع يُشبه التجزئة).
يتم تنفيذ الخطوات التالية بشكل متكرر:
- تقدير توزيع الألوان للمقدمّة والخلفيّة وذلك عبر نموذج خليط غاوسي (GMM).
- إنشاء حقل ماركوف العشوائي Markov random field لعنونة البكسل (مقدّمة/خلفيّة).
- تطبيق تحسين قطع الرَّسم Graph cut optimization للوصول إلى التجزئة النهائيّة المطلوبة.
لحُسن الحظ، يوجد في المكتبة المفتوحة للرُّؤية الحاسوبيَّة أوبن سيفي OpenCV تطبيق سهل لخوارزميّة غرابكت GrabCut عبر استخدام تابع جاهز، وبمجرد أن تعرف بارامترات هذا التابع وكيفيّة تعديلِها ستكون قادر على تطبيق الخوارزميّة بسهولة.
التابع cv2.grabCut:
للحصول على فهم كامل للتنفيذ، سوف نوضِّح بارامترات هذا التابع:
(mask, bgModel, fgModel) = cv2.grabCut(image, mask, rect, bgModel,
fgModel, iterCount = 50,
mode=cv2.GC_INIT_WITH_RECT)
img: | صورة الدخل، التي تَفترِض الخوارزمية أنّها صورة ( 8 بِت ، 3 قنوات ) أي صورة ملونة RGB. |
mask: | قناع الدخل / الخرج. يُفترض أن يكون هذا القناع صورة أحاديّة القناة بنوع بيانات (عدد صحيح 8 بِت بدون إشارة). تتم تهيئة هذا القناع تلقائيًا في حال استُخدمت تهيئة المُربَّع المُحيط (cv2.GC_INIT_WITH_RECT)؛ خلاف ذلك يفترض GrabCut أنك أنت من تقوم بإجراء تهيئة القناع وعندها استخدم (cv2.GC_INIT_WITH_MASK). |
rect: | أبعاد المُربَّع المُحيط الذي يحتوي على الكائن الذي نريد فصله. |
bgModel: | مصفوفة مؤقّتة تُستخدم داخليًا عند نمذجة الخلفيّة. |
fgModel: | مصفوفة مؤقّتة تُستخدم داخليًا عند نمذجة المقدِّمة. |
iterCount: | عدد مرات تكرار الخوارزميّة. كلما زاد عدد التكرارات، كلما طالت مُدة تشغيلها، لكن من الناحية المثاليّة، ستكون النتائج أفضل. |
Mode: | إمّا cv2.GC_INIT_WITH_RECT عند استخدام طريقة المُربَّع المُحيط أو cv2.GC_INIT_WITH_MASK عند استخدام قناع التهيئة. |
يُعيد تطبيق غرابكت GrabCut عبر أوبن سيفي OpenCV ثلاث قيم:
Mask: | قناع الخرج الناتج بعد تطبيق الخوارزمية. |
bgModel: | المصفوفة المؤقّتة المُستخدمة في نمذجة الخلفيّة (يمكنك تجاهل هذه القيمة). |
fgModel: | المصفوفة المؤقّتة المُستخدمة في نمذجة المقدِّمة (يمكنك تجاهل هذه القيمة). |
.الآن بعد أن أصبح لدينا فهم للتابع cv2.grabCut دعونا ننتقل إلى تطبيق الخوارزمية على مثال عملي. يمكنكم الاطلاع على كامل الشيفرة البرمجية الموجودة على موقع جيت هب.
تطبيق عملي 1 (طريقة تنفيذ GrabCut مع المربع المحيط)
- أولاً نقوم بتهيئة الصورة المراد تجزئتها.
- نقوم بتحديد إحداثيّات المُربَّع المُحيط بالكائن المراد تقسيمه يدويًا باستخدام برنامج فوتوشوب (يُمكننا تطبيق أحد طرق كاشف الكائن الأوتوماتيكي automated object detector).
ملاحظة: يُمكن إنشاء المُربَّع المُحيط بواسطة إحدى الطُّرق التالية:
- افحص الصورة يدويًا وقم بتحديد إحداثيات المُربَّع المُحيط.
- طبِّق سلسلة هار كاسكيد Haar cascade
- استخدم آلة المُتَّجه الداعم الخطيّة Linear SVM + مخطّط/هستوغرام التدرّج الموجّه HOG لاكتشاف الكائن.
- استخدم تقنيات الكشف عن الكائنات القائمة على التعلُّم العميق مثل شبكة الطَّيّ العُصبونيّة المناطِقيَّة الأسرع Faster R-CNN وكاشف الخَطوة الواحدة SSDs و يُولو YOLO وما إلى ذلك.
- لتطبيق الخوارزمية نفتح ملف جديد، ونسميه grabcut_bbox:
import numpy as np
import time
import cv2
import os
from google.colab import files
from matplotlib import pyplot as plt
-
- تحميل الصورة من جهازك.
uploaded = files.upload()
-
- قراءة الصورة باستخدام المكتبة المفتوحة للرُّؤية الحاسُوبيّة أوبن سيفي OpenCV.
image = cv2.imread('img.jpg')
-
- تهيئة صورة فارغة لـ قناع بحجم مماثل لصورة الدخل، حيث سيتم ملؤه بنتائج خوارزمية غرابكت GrabCut في النهاية.
mask = np.zeros(image.shape[:2], dtype="uint8")
-
- تحديد إحداثيات المُربَّع المُحيط بالكائن في الصورة (img.jpg) يدويًا. استخدمنا برنامج تحرير الصور فوتوشوب لتحديد إحداثيات المربع المحيط ودوّناها.
يُمكنك استخدام أحد البرامج المجانيّة مثل جيمب وغيره، كما يُمكنك اختيار كاشف كائن جاهز لتطبيق ذلك.
- تحديد إحداثيات المُربَّع المُحيط بالكائن في الصورة (img.jpg) يدويًا. استخدمنا برنامج تحرير الصور فوتوشوب لتحديد إحداثيات المربع المحيط ودوّناها.
rect = (80, 88, 200, 365)
-
- تهيئة مصفوفتين فارغتين لاستخدامهما داخليًا عند عزل المقدِّمة عن الخلفيّة (fgModel و bgModel) باستخدام مكتبة بايثون العدديَّة NumPy.
fgModel = np.zeros((1, 65), dtype="float")
bgModel = np.zeros((1, 65), dtype="float")
-
- تم تطبيق خوارزمية غرابكات GrabCut بعد تهيئة وتمرير جميع بارامترات الدخل اللازمة.
(mask, bgModel, fgModel) = cv2.grabCut(image, mask, rect, bgModel,
fgModel, iterCount = 50,
mode=cv2.GC_INIT_WITH_RECT)
-
- تقوم غرابكات GrabCut في النهاية بإرجاع القناع المطلوب بالإضافة إلى المصفوفتين المؤقّتتين (يمكننا تجاهُلهما).
- ينتج عن تطبيق الخوارزمية قيم خاصّة بالقناع وهي (القيم المُحدّدة/القيم المُحتملة) للخلفيّة وللمقدّمة في الصورة.
values = (
("Definite Background", cv2.GC_BGD),
("Probable Background", cv2.GC_PR_BGD),
("Definite Foreground", cv2.GC_FGD),
("Probable Foreground", cv2.GC_PR_FGD),
)
-
-
ترتبط هذه القيم بـ :
- الخلفية المُحدّدة Definite background: برمجيًا cv2.GC_BGD
- الخلفية المُحتملة Probable background : برمجيًا cv2.GC_PR_BGD
- المقدمة المُحدّدة Definite foreground : برمجيًا cv2.GC_FGD
- المقدمة المُحتملة Probable foreground : برمجيًا cv2.GC_PR_FGD
-
-
- نستخدم الحلقة:
– لإنشاء أقنعة اعتمادًا على القيم الحاليّة
– لعرض هذه القيم (المُحدّدة/المُحتملة) حتى يتم الضغط على أي مفتاح.
- نستخدم الحلقة:
for (name, value) in values:
print("[INFO] showing mask for '{}'".format(name))
valueMask = (mask == value).astype("uint8") * 255
plt.imshow(valueMask)
plt.show()
-
- ننتقل إلى إنشاء قناع الخرج، وذلك من خلال البحث عن جميع بكسلات (الخلفيّة/ الخلفيّة المُحتملة) وإسناد القيمة (0) لها، ثمَّ إسناد القيمة (1) لجميع البكسلات المتبقِّية.
outputMask = np.where((mask == cv2.GC_BGD) | (mask == cv2.GC_PR_BGD),
0, 1)
-
- نطبِّق على قناع الخرج عمليّة تحويل من المجال [0-1] إلى [0-255].
outputMask = (outputMask * 255).astype("uint8")
-
- نقوم بعد ذلك بإنشاء صورة الخرج الخاصة بنا (مع إخفاء الخلفية) عن طريق تطبيق عملية bitwise_and وتمرير صورة الدخل مع قناع الخرج لها.
output = cv2.bitwise_and(image, image, mask=outputMask)
وبذلك نكون قد حصلنا على الكائن المراد فصله عن الخلفية بنجاح.
-
- توضيح: عملية الجداء المنطقيّ على مستوى البِت bitwise_and مفيدة جداً عند التعامل مع الصور، حيث يُمكن استخراج أي جزء من الصورة بفعاليّة، وذلك عبر تمرير صورة الدخل الأولى وصورة الدخل الثانية ثم تمرير القناع.
- توضيح: عملية الجداء المنطقيّ على مستوى البِت bitwise_and مفيدة جداً عند التعامل مع الصور، حيث يُمكن استخراج أي جزء من الصورة بفعاليّة، وذلك عبر تمرير صورة الدخل الأولى وصورة الدخل الثانية ثم تمرير القناع.
-
- مثال: إذا كان لدينا صورة (1) تحتوي على مربعين، وصورة (2) تحتوي على دائرة. فإن ناتج Bitwise_and هو الصورة (3) كما في الشكل التالي:
-
- عرض النتائج النهائية:
المتغيّر الدّلالة image الصورة الأصلية (صورة الدخل) outputMask قناع الخرج (الناتج عن تطبيق GrabCut). output صورة الخرج (تحتوي على الكائن بعد فصله عن الخلفية).
- عرض النتائج النهائية:
plt.imshow(image)
plt.show()
plt.imshow(outputMask)
plt.show()
plt.imshow(output)
plt.show()
خُلاصة:
- تم تحضير المُدخلات اللازمة لخوارزميّة GrabCut بما في ذلك صورة الدخل وإحداثيات المُربَّع المُحيط بالكائن ومصفوفات fgModel و bgModel الصفريّة. تذكّر أنّه تم تحديد إحداثيات rect يدويًا.
- تم تنفيذ الخوارزمية.
- تم إنشاء أقنعة المقدِّمة والخلفيّة (المُحدّدة / المُحتملة).
- تم إنشاء قناع الخرج، وصورة الخرج بعد الفصل.
تطبيق عملي 2 (طريقة تنفيذ GrabCut مع قناع مُقترح)
- نستطيع تجزئة الكائن في الصورة باستخدام قناع مُهيّأ مسبقاً لتحسين عملية الفصل. حيث يمكنك إنشاء هذا القناع mask من خلال إحدى الطرق:
- يدويًا باستخدام أحد برامج تحرير الصور مثل فوتوشوب و جيمب وما إلى ذلك.
- تطبيق عمليات معالجة الصور الأساسيّة مثل العتبة thresholding، واكتشاف الحواف edge detection ، وتصفية الحدود contour filtering،.
- استخدام شبكات التجزئة القائمة على التعلُّم العميق deep learning-based segmentation networks (مثلاً شبكة الطَّيّ العصبونيّة المناطقيِّة ذات القِناع Mask R-CNN).
دعونا نرى كيف تعمل خوارزمية غرابكات GrabCut بطريقة تهيئة القناع.
- أولاً نقوم بتهيئة الصورة المُراد تجزئتها.
- ثم نقوم بتهيئة القناع المُقترح باستخدام إحدى الطُّرق السَّابقة.
- نفتح ملف جديد، نسميه grabcut_mask ونبدأ:
import numpy as np
import time
import cv2
import os
from google.colab import files
from matplotlib import pyplot as plt
-
- تحميل الصورة المراد تجزئتها من جهازك، وتخزينها في المتحول image.
uploaded = files.upload()
image = cv2.imread("img.jpg")
-
- تحميل صورة القناع من جهازك (والذي قُمنا بإنشائه يدوياً) باستخدام برنامج تحرير الصور فوتوشوب ثم تخزينه في المتحول mask.
uploaded = files.upload()
mask = cv2.imread("img_mask.jpg", cv2.IMREAD_GRAYSCALE)
-
- تطبيق عمليّة bitwise_and بين صورة الدخل وصورة القناع المُقترح وتخزين نتيجة التجزئة في المتغيِّر roughoutput.
roughOutput = cv2.bitwise_and(image, image, mask=mask)
-
- إظهار ناتج تطبيق الصورة على القناع المقترح.
plt.imshow(numpy.real(roughOutput))
plt.show()
-
- الآن سنقوم بتعيين قيم المقدِّمة والخلفيّة (المُحدَّدة / المُحتملة) في مصفوفة القناع:
يتم تعيين جميع بكسلات القناع الأكبر من الصفر على أنها مقدِّمة مُحتملة، كما يتم تعيين البكسلات المتبقِّية على أنها خلفيّة مُحدَّدة.
- الآن سنقوم بتعيين قيم المقدِّمة والخلفيّة (المُحدَّدة / المُحتملة) في مصفوفة القناع:
mask[mask > 0] = cv2.GC_PR_FGD
mask[mask == 0] = cv2.GC_BGD
-
- تهيئة مصفوفتين فارغتين لاستخدامهما داخليًا عند فصل المقدِّمة عن الخلفيّة (fgModel و bgModel) باستخدام مكتبة بايثون العدديَّة NumPy.
fgModel = np.zeros((1, 65), dtype="float")
bgModel = np.zeros((1, 65), dtype="float")
-
- نقوم بتطبيق خوارزمية غرابكت GrabCut على الصورة باستخدام قناع التجزئة المُقترح.
لاحظ أنه تم تهيئة المُعامل الثالث rect وهو مُربَّع الإحاطة (الذي يحتوي على الكائن الذي نريد فصله) بالقيمة None والتي تعني لا شيء، وذلك لأننا لن نستخدم طريقة المربع المحيط. لاحظ أيضًا أنه تم ضبط مُعامل النمط Mode على cv2.GC_INIT_WITH_MASK
- نقوم بتطبيق خوارزمية غرابكت GrabCut على الصورة باستخدام قناع التجزئة المُقترح.
(mask, bgModel, fgModel) = cv2.grabCut(image, mask, None, bgModel,
fgModel, iterCount=50, mode=cv2.GC_INIT_WITH_MASK)
-
- ينتج عن تطبيق الخوارزمية قيم خاصة بـ القناع وهي (القيم المُحدّدة/القيم المُحتملة) للخلفيّة والمقدِّمة في الصورة.
values = (
("Definite Background", cv2.GC_BGD),
("Probable Background", cv2.GC_PR_BGD),
("Definite Foreground", cv2.GC_FGD),
("Probable Foreground", cv2.GC_PR_FGD),
)
-
- ترتبط هذه القيم بـ :
- الخلفية المُحدّدة Definite background: برمجيًا cv2.GC_BGD
- الخلفية المُحتملة Probable background : برمجيًا cv2.GC_PR_BGD
- المقدمة المُحدّدة Definite foreground : برمجيًا cv2.GC_FGD
- المقدمة المُحتملة Probable foreground : برمجيًا cv2.GC_PR_FGD
- ترتبط هذه القيم بـ :
-
- نستخدم الحلقة:
– لإنشاء أقنعة اعتمادًا على القيم الحالية
– لعرض هذه القيم (المُحدّدة /المُحتملة) حتى يتم الضغط على أي مفتاح.
- نستخدم الحلقة:
for (name, value) in values:
print("[INFO] showing mask for '{}'".format(name))
valueMask = (mask == value).astype("uint8") * 255
plt.imshow(valueMask)
plt.show()
-
- لاحظ في الشكل السابق كيف أن قناع التجزئة ليس “نظيفًا” تمامًا، يُمكننا بسهولة رؤية الخلفية الخضراء تتسرّب إلى قناعنا، بالرغم من ذلك تم تنظيف التجزئة وفصل النبات في النهاية بشكل صحيح.
- ننتقل إلى إنشاء قناع الخرج، وذلك من خلال البحث عن جميع بكسلات (الخلفية/ الخلفية المُحتملة) وإسناد القيمة (0) لها، وإسناد القيمة (1) لجميع البكسلات المتبقِّية.
outputMask = np.where((mask == cv2.GC_BGD) | (mask == cv2.GC_PR_BGD),
0, 1)
-
- نطبِّق على قناع الخرج عملية تحويل من المجال [0-1] إلى [0-255].
outputMask = (outputMask * 255).astype("uint8")
-
- نقوم بعد ذلك بإنشاء صورة الخرج الخاصة بنا (مع إخفاء الخلفية) عن طريق تطبيق عملية bitwise_and وتمرير قناع الخرج لها. وبذلك نكون قد حصلنا على الكائن المراد فصله عن الخلفية بنجاح.
output = cv2.bitwise_and(image, image, mask=outputMask)
-
- نقوم بعرض النتائج النهائية:
المتغيّر الدّلالة image الصورة الأصلية (صورة الدخل) outputMask قناع الخرج (الناتج عن تطبيق GrabCut). output صورة الخرج (تحتوي على الكائن بعد فصله عن الخلفيّة).
- نقوم بعرض النتائج النهائية:
الخاتمة
تُعتبر خوارزمية غرابكت GrabCut من الخوارزميّات الهامّة في عمليات تجزئة الصور ولكنّها ليست مثاليّة، خصوصاً بعد ظهور شبكات التجزئة القائمة على التعلُّم العميق deep learning والتي لها القُدرة على إنشاء أقنعة تلقائيّة تُساعد في عملية التقطيع. هل يعني ذلك أن جرابكت GrabCut ليست مفيدة بعد تقدُّم التعلُّم العميق؟
قبل استخدام التعلُّم العميق وشبكات التجزئة الدلالية مثل شبَكة الطَّيّ العصبونِيّة المناطِقيَّة ذات القِناع Mask R-CNN و شبكة يُو-نِت U-Net وغيرها، كانت غرابكت GrabCut هي الطريقة المُستخدمة لتجزئة وفصل مقدِّمة الصورة بدقَّة عن الخلفيّة. ولكن في الواقع على الرُّغم من أن شبكة الطَّيّ العُصبونيّة المناطقيَّة الأسرع Faster R-CNN وشبكة يُو-نِت U-Net هما طريقتان قويتان للغاية، إلا أنّه يُمكن أن ينتج عنهُما أقنعة فوضويّة بعضَ الشَّيء، وبالتالي يُمكننا استخدام غرابكت GrabCut لتحسين وتنظيف هذه الأقنعة، سوف نتحدّث عن ذلك في مقالنا القادم.
في هذا المقال تعرّفنا على خوارزمية تجزئة الكائنات غرابكت GrabCut والتي هي واحدة من أهم الخوارزميّات المُستخدمة في مجال الرُّؤية الحاسوبيِّة، تحدَثنا عن آليّة عملِها و استعرضنا أهم معاملاتها و تعرّفنا على الطريقتين المُستخدمتين فيها.
تعليق واحد
مشكورة على جهدك الجميل ..
لكن مثلا لدي صورة طبية بالاشعة السينية X-ray من النوع Gray_Scale
و أريد تحديد القفص الصدري الذي بداخله الرئتين و أعتبره مع الرئتين بداخله هو المقدمة و باقي الصورة هي الخلفية
اولا:
مثل هذه الأمور الطبية الهدف منها هو تحسين العمل الطبي و تسريعه بوجود التطبيق في المشفى دون وجود المهندس المنشئ له..لذلك عملية رسم المستطيل يدويا و استخدام الفوتوشوب و ما إلى ذلك غير نافع و هي نقطة ضعف في محاولة المعالجة المبدأية للصور الطبية لعزل الرئتين قبل الدخول إلى موضوع الشبكة العصبونية
ثانيا:
معظم التطبيقات البرمجية الطبية تقوم على معالجة مجلد صور بأكمله ..مثلا ابعاد صور الرئتين للطفل تختلف عن ابعاد صور الرئتين للشخص البالغ لذلك لايمكنني تثبيت حجم المستطيل المذكور في الخوارزمية المشروحة آنفا و تطبيقه ع مجلد يحوي مئات او الاف الصور
تقبلي مروري …
أتمنى لو كان بإمكانك التواصل معي عبر الانترنت
لتقترحي علي بعض الامور فيما يخص طرحي
“طبعا دون التطرق للتدريب بالشبكة العصبونية…الخ فهذه الامور سوف تأتي لاحقا ..انا الان اتكلم عن معالجة مبدأية و عزل جسم من صورة و ليس اكتشاف مرض”