كيف نستخدم خوارزميات رؤية الكمبيوتر: معالجة الفيديو في متصفح محمول باستخدام OpenCV.js

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

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




ما هي المهمة


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

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

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

المتطلبات


كجزء من مشروعنا ، كانت هناك المتطلبات الإضافية التالية للخوارزمية:

  • القدرة على العمل في الوقت الفعلي: يجب ألا "يتباطأ" دفق الفيديو من الكاميرا أثناء تشغيل الخوارزمية ؛
  • القدرة على العمل في مجموعة واسعة من التباين والملمس الخلفية: التباين المنخفض والتباين والخلفية المتجانسة وغير المتجانسة ؛
  • دعم مجموعة واسعة من طرازات الهواتف الذكية ، بما في ذلك نماذج الميزانية التي تم إصدارها قبل عدة سنوات.

أخيرًا ، لم يكن هناك مجموعة بيانات لتدريب خوارزميات التعلم الآلي في المشروع ، ولم تكن هناك طريقة لجمعها ووضع علامة عليها. لم يكن لدينا سوى عدد قليل من عينات الاختبار من نتائج بحث Google.

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

النهج العام وهيكل الخوارزمية


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



تين. 1. الهيكل العام للخوارزمية

يظهر الشكل العام للخوارزمية في الشكل. 1. تتم معالجة الإطارات من دفق الفيديو في دورة ، يتم تكرار مهلة بين التكرارات لتتوافق مع FPS المطلوب - توقفنا عند 30 إطارًا في الثانية. هذا يسمح لك بتجنب "التباطؤ" وتقليل الحمل على المعالج واستهلاك الطاقة للجهاز.

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

الخطوة الأولى في الكشف عن مستند هي البحث عن الوجه في الصورة. استخدام هذا الكشف عن مجريات الأمور يلغي التقاط بطاقات العمل وغيرها من الصور غير ذات الصلة. يتم إجراء البحث باستخدام معيار opencv'shash CascadeClassifier.detectMultiScale () و haccadeCade_frontalface_default المتدرب مسبقًا . الحد الأدنى والحد الأقصى لأحجام الوجوه المكتشفة محدود ، مما يسمح بتقليل التكاليف الحسابية ، ويحد أيضًا من حجم المستند في الصورة. يعتبر الوجه مكتشفًا في الصورة عندما يكون في الجانب الأيسر - أو السفلي الأيسر ، لجوازات السفر - جزءًا من المنطقة داخل الإطار المرجعي (الشكل 2). هذا مقياس إضافي لضمان المحاذاة الصحيحة للمستند في الصورة.

لا تحتوي الأمثلة في هذه المقالة على بيانات شخصية.



تين. 2. منطقة الموضع المتوقع للوجه في الصورة. يظهر إطار الدعم باللون الأحمر ، وتظهر حدود منطقة الموقع المتوقع للوجه باللون الأخضر.

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

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

يتم أيضًا تصفية مجموعة الخطوط الناتجة ، مع ترك الخطوط القريبة فقط من الإطار المرجعي. للقيام بذلك ، نقوم أولاً بترجمة معادلات خطوط الإطار إلى نقاط في نظام الإحداثيات القطبية (rho ، theta) - ستكون theta دائمًا 0 أو pi / 2 ، وستكون rho فريدة لكل خط. بعد ذلك ، نختار من الخطوط التي تم الحصول عليها من Huff فقط تحويل تلك التي تقع بالقرب من نقاط التحكم - وفقًا للمقياس الإقليدي ، مع مراعاة الفرق في حجم القيم.

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



تين. 3. ترشيح الخطوط وتحديد زوايا الوثيقة. الخطوط الخضراء - نتيجة التصفية ، النقاط الصفراء - تم الكشف عن أركان المستند.

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

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

ميزات التنفيذ


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

أثناء الترحيل ، تم اكتشاف عدد من الاختلافات في OpenCV API ، مما أدى إلى تغييرات طفيفة في التنفيذ. على سبيل المثال ، يعتبر تباين Laplacian في python ببساطة Laplacian (). Var () . باستخدام OpenCV.js ، لا توجد طريقة لاستخدام NumPy ، ولكن لم يتم توفير أي تطبيق بديل لطريقة var () . الحل: عد الدالة meanStdDev () على أنها الانحراف المعياري (القائمة 1).

private isImageBlurry(image: cv.Mat): boolean {
		const laplacian = new cv.Mat();
		cv.Laplacian(image, laplacian, cv.CV_64F);
		const s_mat = new cv.Mat();
		cv.meanStdDev(laplacian, new cv.Mat(), s_mat);
		const s = s_mat.data64F[0];
		const v = Math.pow(s, 2);
		return (v < this.laplacianVarianceThreshold);
	}

القائمة 1. تقييم التركيز على الصورة من خلال تباين Laplacian في opencv.js (TypeScript)

ميزة أخرى هي الحاجة إلى تقليل حجم المكتبة. في شكله الأصلي ، تبلغ سعة OpenCV.js 7.9 ميجا بايت. يؤدي تنزيله عبر الإنترنت إلى إبطاء تهيئة الخوارزمية. الحل لهذه المشكلة هو "تقليم" الوحدات غير المستخدمة أثناء عملية تجميع المكتبة ، والتي يمكن أن تقلل بشكل كبير من حجم ملف الإخراج: تمكنا من تحقيق حجم 1.8 ميغابايت. يمكن تكوين قائمة المكونات المضمنة في التجميع في منصات ملف التكوين / js / opencv_js.config.py (القائمة 2).

white_list = makeWhiteList([core, imgproc, objdetect, video, dnn, features2d, photo, aruco, calib3d])

القائمة 2. القائمة البيضاء الأصلية لوحدات opencv المضمنة في تجميع جافا سكريبت

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

النتائج


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




تين. 4. أمثلة على اقتصاص المستندات باستخدام خوارزمية

استنتاج


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

شكرا للانتباه! نأمل أن تجد هذه المقالة مفيدة.

All Articles