رؤية الكمبيوتر تحمي الخصوصية





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



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







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



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







لقد قررنا البرنامج ، نحتاج إلى جهاز آخر - كاميرا ويب. كيف تقوم بإعداد التعرف على الوجوه الآن؟ أولاً ، تحتاج إلى اكتشاف الوجه في الإطار. إحدى طرق الكشف عن الوجوه هي طريقة Viola-Jones ، والتي تم وصفها بالفعل في عام 2001. نظرًا لأننا مهتمون أكثر بالممارسة ، فلن ندخل في التفاصيل النظرية ، سنذكر فقط أن الطريقة تعتمد على مبادئ أساسية مثل تحويل الصورة إلى تمثيل متكامل ، وطريقة نافذة المسح ، واستخدام ميزات Haar. يمكنك قراءة وصف الطريقة والاطلاع على معلومات حول تثبيت OpenCV على الموقع الرسمي . يوجد أدناه رمز Python الذي سيسمح لنا باكتشاف الوجوه من دفق فيديو كاميرا الويب:



import cv2 as cv
import numpy as np

face_cascade = 'haarcascade_frontalface_default.xml'
cam = 1

classifier = cv.CascadeClassifier(face_cascade)

video_stream = cv.VideoCapture(cam)
while True:
    retval, frame = video_stream.read()
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    found_faces = classifier.detectMultiScale(gray_frame, 1.2, 5, minSize=(197, 197))

    for x, y, w, h in found_faces:
        cv.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

    cv.namedWindow('Stream', cv.WINDOW_NORMAL)
    cv.imshow('Stream', frame)

    k = cv.waitKey(30) & 0xFF
    if k == 27:
        break

video_stream.release()
cv.destroyAllWindows()


في الكود أعلاه ، نقوم أولاً باستيراد الوحدتين المطلوبتين للعمل: cv2 (رؤية الكمبيوتر) و numpy (العمل مع المصفوفات). في متغير face_cascade ، احفظ المسار إلى ملف xml باستخدام شلالات Haar. يمكن العثور على هذا الملف ، مثل الملفات الأخرى ، على سبيل المثال لاكتشاف العين على صفحة جيثب.



في الكاميرا المتغيرة نكتب رقم كاميرا الويب ، إذا تم توصيل العديد منها ، يكون رقم الكاميرا الوحيدة المتصلة افتراضيًا هو 0. بعد ذلك ، يتم إنشاء كائن مصنف باستخدام طريقة CascadeClassifier والاتصال بالكاميرا هو cv.VideoCapture (cam). ثم ، في حلقة ، نقرأ الصور إطارًا بإطار في متغير الإطار باستخدام طريقة read (). يقوم المصنف بمعالجة الصورة بتدرج الرمادي ، لذلك ، باستخدام طريقة cvtColor ، نقوم بتحويل الصورة إلى الشكل المطلوب. تقوم طريقة DiscoverMultiScale بإرجاع قائمة بمعلمات جميع الوجوه المكتشفة ، وهو مستطيل - إحداثيات الرأس (س ، ص) وعرض المستطيل وارتفاعه (عرض ، ارتفاع). الأسطر التالية اختيارية لكي يعمل البرنامج ، ولكنها مفيدة في التصحيح - تضيف طريقة المستطيل إطارًا إلى الإطار المصدر في مكان الوجه المكتشف ، ويعرض imshow نافذة بها دفق فيديو.



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



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







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







سنستخدم هذه الطريقة بالذات ، ولكن عليك أولاً القيام بخطوة أخرى مهمة - إنشاء قاعدة مع الوجوه. بشكل عام ، يبدو هيكل القاعدة كما يلي:



--Storage\\
	--Person_1\\
		--img_1.jpg
		--img_2.jpg
		--img_n.jpg
	--Person_m\\
                --img_1.jpg
		--img_2.jpg
		--img_n.jpg


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



storage = 'storage'
images = []
labels = []
names = {}
id = 0

for subdir in os.scandir(storage):
    names[id] = subdir.name
    subdir_path = os.path.join(storage, subdir.name)

    for file in os.scandir(subdir_path):
        if file.name.split('.')[-1].lower() not in ['png', 'bmp', 'jpeg', 'gif']:
            continue
        file_path = os.path.join(subdir_path, file.name)
        image = cv.imread(file_path, 0)
        label = id
        images.append(image)
        labels.append(label)
    id += 1


هنا أيضًا ، كل شيء بسيط جدًا. يخزن متغير التخزين المسار إلى المجلد الذي يحتوي على المجلدات التي تحتوي على صور لوجوه الأفراد ، ثم قائمة بالصور ، وقائمة للتسميات وقاموس بالأسماء. كيف يعمل: تتم إضافة جميع الصور من مجلد شخص معين إلى قائمة الصور ، على سبيل المثال ، هناك 15 صورة. إذا كان هذا هو المجلد الأول من التخزين ، فستكون التسمية مساوية لـ 0 ، وبالتالي ، يتم إضافة 0 حتى 15 مرة إلى قائمة التصنيفات ، في نفس الوقت في قاموس الأسماء ، يتم إنشاء سجل يكون فيه المفتاح هو التسمية ، والقيمة هي اسم الشخص (اسم المجلد الذي يحتوي على صور شخص معين). وهكذا بالنسبة للتخزين بأكمله. في الكود أعلاه ، انتبه إلى السطر الذي يحتوي على طريقة imread - هنا تتم قراءة الصورة وتمثيلها كمصفوفة لسطوع البكسل ، ويتم كتابتها إلى متغير الصورة.



الآن الجزء الممتع هو تدريب الخوارزمية:



recognizer = cv.face.LBPHFaceRecognizer_create(1, 8, 8, 8, 130) 
recognizer.train(images, np.array(labels))


في السطر الأول من التعليمات البرمجية ، نقوم بتهيئة الخوارزمية باستخدام طريقة LBPHFaceRecognizer_create. هل تتذكر أيضًا وصف خوارزمية LBPH؟ تحتوي معلمات الوظيفة المذكورة فقط على ما تحدثنا عنه: نصف القطر على طول الحدود التي سيتم أخذ وحدات البكسل حولها المطلوبة ، وعدد وحدات البكسل من "الدائرة" المكونة من نصف القطر ، وعدد المقاطع أفقيًا ورأسيًا والعتبة التي تؤثر على قرار التعرف الأشخاص ، أي كلما كانت المتطلبات أكثر صرامة ، انخفض الحد الأدنى. بعد ذلك ، نسمي طريقة القطار للتدريب ، وتمرير قوائم الصور والملصقات كوسيطات. الآن قامت الخوارزمية بحفظ الوجوه من قاعدة البيانات وستكون قادرة على التعرف عليها. الأمر صغير ، ويبقى إضافة بضعة أسطر إلى الجزء الأول من الكود في الحلقة (بالنسبة إلى x ، y ، w ، h في found_faces): بعد اكتشاف الوجه ، نحتاج إلى التعرف عليه ، وإذا لم يتم التعرف على الوجه ،أو يتم التعرف على شخص آخر ، ثم قفل جهاز الكمبيوتر على الفور!



roi = gray_frame[y:y+h, x:x+w]
name, dist = recognizer.predict(roi)
cv.putText(frame, '%s - %.0f' % (names[name], dist), (x, y), cv.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0), 3)
if names[name] != "Ivan Petrov":
    ctypes.windll.user32.LockWorkStation()


في السطر الأول ، roi (من منطقة الاهتمام) هو متغير نكتب فيه جزءًا من الصورة يحتوي على الوجه المكتشف. في السطر التالي ، يحدث التعرف على الوجوه مباشرة عند استدعاء طريقة التنبؤ. تقوم هذه الطريقة بإرجاع تسمية مطابقة للوجه الذي تم التعرف عليه وقيمة تميز درجة التناقض بين الوجه المكتشف والوجه الذي تم التعرف عليه (كلما كان أصغر ، زادت درجة الثقة في التعرف على الوجه الصحيح). بعد ذلك ، مرة أخرى لأغراض التصحيح ، أضف نصًا إلى الإطار باسم الشخص الذي تم التعرف عليه باستخدام طريقة putText. وأخيرًا ، نتحقق من أبسط الشروط: إذا تم التعرف على شخص غير مالك للكمبيوتر الشخصي (هذا هو المكان الذي كانت هناك حاجة إلى قاموس به أسماء) ، فقم بإغلاق الكمبيوتر. السطر ctypes.windll.user32.LockWorkStation () مسؤول عن الحظر ، كما ترى. والعمل على انجاحهسوف تحتاج إلى استيراد وحدة ctypes إلى جانب cv2 و numpy.



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



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



في الندوة عبر الويب 09/03/2020 10-00 بتوقيت موسكو ، سيقدم المتحدثون طريقة عملية لتدريب شبكة عصبية للكشف عن الكائنات ، مع الاستشهاد بكود المصدر والإشارة إلى التقنيات المستخدمة ، وكذلك الإجابة على أسئلتك. يمكنك التسجيل على الرابط: newtechaudit.ru/vebinar-computer-vision






All Articles