English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

شرح تفصيلي للفكرة والمثال لـ KNN في كشف الوجه باستخدام OpenCV

عن OpenCV

OpenCV هي مكتبة تصوير الحاسوب المفتوحة المصدر من Intel (النسخة الحاسوبية). يتكون من مجموعة من وظائف C وعدد قليل من كلاسات C++، ويحقق العديد من الخوارزميات العامة في مجال معالجة الصور وتصوير الحاسوب.

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

طريقة 包装 Python لـ opencv 

تم كتابة OpenCV بلغة C/C++، إذا أردنا استخدامها في لغة أخرى، يمكننا 包装 ملفات المكتبات الديناميكية لها، لحسن الحظ، هناك العديد من هذه الطرقات في Python، وتم استخدام Cvtypes في هذا المقال.

في الواقع، هناك العديد من المكتبات في Python تأتي من الطرف الثالث، مثل PIL (Python Image Library) وهي مكتبة معالجة الصور مكتوبة بلغة C، تم 包装ها في Python، هذه الطرقات يمكن أن تسمح لك باستخدام هذه API كما لو كنت تستخدم الدوال المدمجة في Python.

مبدأ تحديد الوجه

تحديد الوجه ينتمي إلى جزء من اكتشاف الهدف (object detection) ويتضمن جانبين رئيسيين

1. أولاً، قم بتقدير احتمالات الهدف الذي سيتم التحقق منه، لمعرفة بعض خصائص الهدف المراد التحقق منه، وإنشاء نموذج اكتشاف الهدف.
2. استخدم النموذج الحاصل لتماثل الصورة المدخلة، إذا تم العثور على التطابق، يتم إخراج منطقة التطابق، وإلا لا يتم إجراء أي شيء. 

علم الرؤية الحاسوبية

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

كيف يمكن الوصول إلى استنتاج "هذا وجه بشري" من هذه الأرقام، هو أمر معقد نسبيًا. العالم الفيزيائي ملون، عادة ما تكون الصور الملونة في الحاسوب مكونة من مجموعة من قنوات الألوان المتراكمة، مثل صورة RGB، تحتوي على قناة أحمر (Red)، وقناة أخضر (Green) وقناة أزرق (Blue)، هذه القنوات الثلاث هي صورة رمادية، مثل نقطة تمثلها 8 bits، فإن قناة واحدة يمكنها تمثيل 2^8=256 درجة رمادية. وعندما يتم دمج هذه القنوات الثلاث يمكن تمثيل 3*8=24 bits من الألوان، وهي ما نسميه الألوان الحقيقية 24 بت.

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

جدول التسلسل لميزات Haar

يستخدم OpenCV جدول التسلسل لميزات Haar في الكشف عن الأجسام، ويشمل هذا الجدول محللين من نوع boost. أولاً، يتم تدريب المحلل باستخدام ميزات Haar للعينات، للحصول على محلل تسلسلي من نوع boost. يشمل أسلوب التدريب جانبين:

1. أمثلة إيجابية، وهي عينات الأهداف المراد فحصها
2. أمثلة عكسية، أي صور عشوائية أخرى

أولاً، يتم تحويل هذه الصور إلى حجم متساوٍ، ويُسمى هذا العمل بالتسوية، ثم يتم إجراء الإحصاء. بمجرد إكمال إنشاء المحلل، يمكن استخدامه للكشف عن منطقة الاهتمام في الصورة المدخلة، عادة ما تكون الصورة المدخلة أكبر من العينة، لذا يجب تحريك نافذة البحث، للاستفادة من الكشف عن أهداف مختلفة في الحجم، يمكن للمحلل تغيير حجمه بناءً على النسبة، مما يتطلب تفحص الصورة المدخلة عدة مرات.

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

المحلل الأساسي يستخدم ميزات Haar كمدخل، و0/1 كخروج، 0 تعني عدم التطابق، و1 تعني التطابق.

ميزات Haar

 

 ميزات الحدود، وتشمل أربعة أنواع
 ميزات خطية، وتشمل ثماني أنواع
 المركز يدور حول الميزات، ويشمل نوعين

عند تفحص الصور المراد فحصها، على سبيل المثال، باستخدام ميزات الحدود (a)، كما ذكر سابقًا، الصورة في الحاسوب هي مصفوفة من الأرقام، حيث يحدد البرنامج أولاً قيمة الرمادي لكل نافذة، ثم يحدد قيمة الرمادي الأسود في نطاق الشكل المربع، ثم يحدد قيمة (x-2y)، ويقارن هذا الرقم بقيمة x، إذا كانت هذه النسبة في نطاق معين، فإن ذلك يعني أن منطقة الفحص الحالية للصورة المراد فحصها تتوافق مع ميزات الحدود (a)، ثم يستمر في الفحص.

وصف هذه الخوارزمية مفصل للغاية ولا يدخل في نطاق هذا المقال، ولكن يمكنك العثور على معلومات إضافية في المصادر المذكورة.

التحقق من الأهداف غير الثابتة في الحجم

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

الخطوة الأولى:معالجة الصور

بعد الحصول على إطاره (صورة) من الكاميرا، يجب علينا أولاً القيام ببعض معالجة الصور:
1. تحويل الصورة من نموذج RGB إلى صورة فاصلة
2. إجراء عملية تحقيق توزيع الترددات لصورة الفاصلة

هذه الخطوات بسيطة جدًا في OpenCV:

image_size = cv.cvGetSize(image)# الحصول على حجم الصورة الأصلية 
grayscale = cv.cvCreateImage(image_size, 8, 1)# إنشاء صورة فاصلة فارغة 
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)# تحويل 
storage = cv.cvCreateMemStorage(0)# إنشاء منطقة تخزين جديدة للإستخدام اللاحق 
cv.cvClearMemStorage(storage) 
cv.cvEqualizeHist(grayscale, grayscale)# تحقيق توزيع الترددات لصورة灰اء 

الخطوة الثانية:التحقق من الأهداف وتعليمها

في OpenCV، نموذج التحقق من الوجه تم إنشاؤه كملف XML يحتوي على نتائج التدريب لمحسنات harr المذكورة أعلاه، يمكننا تجاوز عملية إنشاء جدول التدرج الخاص بنا عن طريق تحميل هذا الملف. مع جدول التدرج، يكفي أن نرسل الصورة التي نريد التحقق منها وجدول التدرج إلى خوارزمية التحقق من OpenCV للحصول على مجموعة من الوجوه المكتشفة.

# detect objects 
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', 
      cv.cvSize(1,1)) 
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,) 
    cv.CV_HAAR_DO_CANNY_PRUNING, 
    cv.cvSize(50, 50))# إعداد أقل حجم لوجه 50*50 بكسل 
if faces: 
 print 'face detected here', cv.cvGetSize(grayscale) 
 for i in faces: 
 cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)), 
   cv.cvPoint(int(i.x + i.width), int(i.y + i.height)), 
   cv.CV_RGB(0, 255, 0), 1, 8, 0)# رسم دائرة زرقاء 

الخطوة الثالثة:رسم نافذة الفيديو باستخدام highgui

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE) 
highgui.cvMoveWindow ('camera', 50, 50) 
highgui.cvShowImage('camera', detimg) 

يمكننا رؤية أن واجهة برمجة التطبيقات OpenCV واضحة للغاية، باستخدام الطبقة البرمجية بلغة Python، يمكن أن تكون الكود صغيرًا جدًا. حسنًا، يمكننا الآن رؤية نتائج تشغيل البرنامج: 

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

ميزات OpenCV الأخرى

الحدودية اللابلاسية

def laplaceTransform(image): 
 laplace = None 
 colorlaplace = None 
 planes = [None, None, None] 
 image_size = cv.cvGetSize(image) 
 if not laplace: 
 for i in range(len(planes)): 
  planes[i] = cv.cvCreateImage(image_size, 8, 1) 
 laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1) 
 colorlaplace = cv.cvCreateImage(image_size, 8, 3) 
 cv.cvSplit(image, planes[0], planes[1], planes[2], None) 
 for plane in planes: 
 cv.cvLaplace(plane, laplace, 3) 
 cv.cvConvertScaleAbs(laplace, plane, 1, 0) 
 cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace) 
 colorlaplace.origin = image.origin 
 return colorlaplace 

صورة النموذج:

يأتي CVtypes مع مثال على هيكل استحواذ على مساحة الألوان للصور:

الكلمة الأخيرة

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

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا تعليمات النطق.

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع صاحب الحقوق بالملكية، ويتم جمع المحتوى من قبل المستخدمين على الإنترنت الذين يقدمون مساهماتهم بشكل تلقائي، ويشير هذا الموقع إلى أنه لا يمتلك حقوق الملكية، ويجب أن لا يتم تعديل المحتوى بشكل إنساني، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ والتقليد، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) لإبلاغنا، وقدم الدليل على ذلك، وسيتم حذف المحتوى المزعوم الذي يشتبه في انتهاك حقوق النسخ والتقليد على الفور.

الذوق الخاص بك