بناء نظام التعرف على الوجه على أساس Golang و OpenCV


OpenCV هي مكتبة مصممة لمشاريع رؤية الكمبيوتر. هي بالفعل حوالي 20 سنة. لقد استخدمتها في الكلية وما زلت أستخدمها في مشاريعي في C ++ و Python ، لأنها تحظى بدعم جيد لهذه اللغات.

ولكن عندما بدأت في التعلم واستخدام Go ، تساءلت عما إذا كان يمكن استخدام OpenCV للعمل مع هذه اللغة. في ذلك الوقت ، كانت هناك بالفعل أمثلة ودروس تعليمية حول التكامل ، لكن بدا لي أنها معقدة للغاية. بعد ذلك بقليل ، صادفت ملفًا تم إنشاؤه بواسطة فريق The Hybrid Group. في هذه المقالة ، سأريك كيف تبدأ بـ GoCV من خلال تطوير نظام التعرف على الوجوه البسيط مع Haar Cascades.

توصي Skillbox بما يلي: The Python Developer من البداية إلى نقطة الصفر .

نذكرك: لجميع قراء "Habr" - خصم بقيمة 10،000 روبل عند التسجيل في أي دورة تدريبية في Skillbox باستخدام الرمز الترويجي "Habr".

ما هو المطلوب:
  • الذهاب.
  • OpenCV (روابط التثبيت أدناه) ؛
  • شبكة أو كاميرا الفيديو التقليدية.

تركيب


مثال 1


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

تحتاج أولاً إلى استيراد المكتبات التي تحتاجها للعمل.

استيراد (
"دخول"
"Gocv.io/x/gocv"
)

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

webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf(“error opening web cam: %v”, err) } defer webcam.Close() 

أنت الآن بحاجة إلى إنشاء مصفوفة n- الأبعاد. سيتم تخزين الصور المقروءة من الكاميرا.

 img := gocv.NewMat() defer img.Close() 

لعرض دفق الفيديو ، تحتاج إلى إنشاء نافذة - يمكن القيام بذلك باستخدام وظيفة NewWindow.

 window := gocv.NewWindow(“webcamwindow”) defer window.Close() 

الآن دعنا ننتقل إلى الجزء الأكثر إثارة للاهتمام.

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

 for { if ok := webcam.Read(&img); !ok || img.Empty( { log.Println(“Unable to read from the webcam”) continue } . . . } 

تحتاج الآن إلى عرض الإطار في النافذة التي تم إنشاؤها. توقف مؤقتًا للانتقال إلى الإطار التالي - 50 مللي ثانية.

window.IMShow (img)
window.WaitKey (50)

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



 package main import ( "log" "gocv.io/x/gocv" ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf("error opening device: %v", err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow("webcamwindow") defer window.Close() for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println("Unable to read from the webcam") continue } window.IMShow(img) window.WaitKey(50) } } 

مثال 2


في هذا المثال ، دعنا نستخدم المثال السابق وننشئ نظام التعرف على الوجوه استنادًا إلى Haar Cascades (Haar cascades).

تتالي Haar هي مصنفات متتالية يتم تدريبها بناءً على تقنية Haar wavelet. يقومون بتحليل وحدات البكسل في الصورة لاكتشاف علامات معينة. لمعرفة المزيد حول Haar Cascades ، اتبع الروابط أدناه.

إطار الكشف عن كائن فيولا جونز
المصنفات المتتالية
ميزة تشبه هار

يمكنك تنزيل الشلالات المدربة بالفعل من هنا . في المثال الحالي ، سيتم استخدام الشلالات لتحديد وجه شخص ما في وجهه.

من أجل القيام بذلك ، تحتاج إلى إنشاء مصنف وتزويده بملف مدرب بالفعل (يتم إعطاء الرابط أعلاه). لقد قمت بالفعل بتحميل ملف pencv_haarcascade_frontalface_default.xml إلى الدليل الذي يوجد به برنامجنا.

 harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade) defer classifier.Close() 

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

 for _, r := range rects { fmt.Println(“detected”, r) gocv.Rectangle(&img, r, color, 2) } 





 package main import ( "fmt" "image/color" "log" "gocv.io/x/gocv" ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf("error opening web cam: %v", err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow("webcamwindow") defer window.Close() harrcascade := "opencv_haarcascade_frontalface_default.xml" classifier := gocv.NewCascadeClassifier() classifier.Load(harrcascade) defer classifier.Close() color := color.RGBA{0, 255, 0, 0} for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println("Unable to read from the device") continue } rects := classifier.DetectMultiScale(img) for _, r := range rects { fmt.Println("detected", r) gocv.Rectangle(&img, r, color, 3) } window.IMShow(img) window.WaitKey(50) } } 

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

إذا كنت مهتمًا ، فراجع خادم الويب gRPC الذي كتبته في Python و OpenCV. تدفقات البيانات في وقت الكشف عن الوجه. هذا هو الأساس لإنشاء عملاء مختلفين بلغات البرمجة المختلفة. سيكونون قادرين على الاتصال بالخادم وقراءة البيانات منه.

شكرا لقراءة المقال!

توصي Skillbox بما يلي:

Source: https://habr.com/ru/post/ar462159/


All Articles