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

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

هذا النظام له عيوبه - ليس حرجًا ولكنه غير مريح بشكل عام:
- المغناطيس ليس من السهل الانتقال من مكان إلى آخر.
- للنظر في مثل هذا المجلس ، سيكون عليك بالتأكيد الذهاب إلى مكتب آخر.
- ومع ذلك ، قد يحتاج شخص ما إلى العديد من الأجهزة في وقت واحد ... مما يعني أنك بحاجة إلى عدة مغناطيسات لكل موظف.
- أوه نعم ، حتى الموظفين يستقيلون في بعض الأحيان ويأتي موظفون جدد ، والتي تحتاج أيضًا إلى صنع المغناطيس.
تطبيق جوال
في شركة تعمل في أتمتة العمليات التجارية ، فإن استخدام الحل "التناظري" الموضح أعلاه ليس جيدًا للغاية. بطبيعة الحال ، قررنا أتمتة مهمة العثور على الجهاز المناسب. كانت الخطوة الأولى هي كتابة تطبيق محمول يمكنه تحديد موقعه والإبلاغ عنه في الغرف عبر نقاط وصول Wi-Fi. على طول الطريق ، من أجل الراحة ، أعطوا الجهاز القدرة على إبلاغ الخادم عن إصدار نظام التشغيل ، وإظهار خاصية مهمة مثل طاقة البطارية.
يبدو أن المشكلة قد تم حلها. أنت تنظر إلى القائمة في قاعدة البيانات حيث آخر مرة شاهد فيها الجهاز شبكة Wi-Fi ، ذهبت إلى هناك و ...
في العملية ، اتضح أنه ليس كل شيء بهذه البساطة. لقد قمنا بتثبيت التطبيق على أجهزة الاختبار وعملنا معه لعدة أشهر. اتضح أن هذا الخيار مناسب ، ولكنه ليس مثاليًا أيضًا.
يتم تفريغ الأجهزة ، وإيقاف تشغيلها فقط ، وإعادة ترتيب نقاط وصول Wi-Fi من مكان إلى آخر ، ويقول تحديد الموقع الجغرافي في حد ذاته فقط أن الجهاز في المكتب. شكرا لك كابتن!
يمكنك ، بالطبع ، محاولة تحسين النظام الحالي ، ولكن لماذا لا تعيد اختراعه بناءً على تقنيات القرن الحادي والعشرين؟ لم يقل من فعله.
كيف أردنا أن يكون
توصلنا إلى مفهوم لنظام يتعرف على الموظفين من خلال وجوههم ، ويختبر الأجهزة بعلامات خاصة ، ويطلب تأكيدًا لتغيير حالة الجهاز ، ثم نقوم بإجراء تغييرات على قاعدة البيانات عبر الإنترنت ، والتي يمكن لأي موظف مشاهدتها دون الاستيقاظ من كرسيه.
التعرف على الوجه
التعرف على الوجوه ككل حل المشكلة في 2018. لذلك ، لم نعيد ابتكار العجلة ونحاول تدريب نماذجنا الخاصة ، ولكن استفدنا من الحل الجاهز. يبدو أن وحدة
FaceRecognition هي الخيار الأكثر ملاءمة ، مثل لا يتطلب تدريبًا إضافيًا ويعمل بسرعة كبيرة حتى بدون تسريع على وحدة معالجة الرسومات.
باستخدام وظيفة
face_locations ،
تم الكشف عن الوجوه في صور الموظف ، وباستخدام
ترميزات الوجوه ، تم استخراج ملامح الوجه لموظف معين منها.
تم جمع البيانات الواردة في قاعدة البيانات. لتحديد موظف معين باستخدام وظيفة
face_distance ، تم النظر في "الاختلاف" بين ترميز الموظف المكتشف والترميزات من قاعدة البيانات.
بشكل عام ، في هذه المرحلة يمكن للمرء أن يذهب أبعد من ذلك وإنشاء مصنف ، على سبيل المثال ، بناءً على
KNN ، بحيث يكون النظام أقل حساسية لديناميكيات وجوه الموظفين. ومع ذلك ، من الناحية العملية ، يتطلب هذا وقتًا أكثر بكثير. وتبين أن المتوسط العادي لترميز وجه الشخص بين الوجه الموجود الآن في قاعدة البيانات والذي وجده النظام لتغيير حالة الجهاز كافٍ لتجنب تراكم الأخطاء في الممارسة.
كود التعرف على الوجهface_locations = face_recognition.face_locations(rgb_small_frame) face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) face_names = [] for face_encoding in face_encodings: matches = face_recognition.face_distance( known_face_encodings, face_encoding) name = "Unknown" if np.min(matches) <= 0.45: best_match_index = np.argmin(matches) name = known_face_info[str(best_match_index)]['name'] else: best_match_index = None
التعرف على الجهاز
في البداية ، نشأت الفكرة لاستخدام
رموز QR للتعرف على الجهاز ، حيث يتم إدخال معلومات عن الجهاز في نفس الوقت. ومع ذلك ، من أجل التعرف المستقر على رمز الاستجابة السريعة ، يجب أن يكون قريبًا جدًا من الكاميرا ، وهو أمر غير مريح.
ونتيجة لذلك ، نشأت فكرة استخدام علامات الواقع المعزز. إنهم يحملون معلومات أقل ، ولكن يتم التعرف عليهم بشكل أكثر استقرارًا. خلال التجارب ، تم التعرف على علامة 30 ملم من قبل الكاميرا مع انحرافات صغيرة من العمودي (3-5 درجة) على مسافة تصل إلى مترين ونصف.
يبدو هذا الخيار بالفعل أفضل بكثير. تم اختيار
ARuco من مجموعة كاملة من
علامات الواقع المعزز ، مثل جميع الأدوات اللازمة للعمل معهم موجودة في
توزيع opencv-contrib-python .
رمز التعرف على رمز ARuco self.video_capture = cv2.VideoCapture(0) ret, frame = self.video_capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) markers = cv2.aruco.detectMarkers(gray, self.dictionary)
ونتيجة لذلك ، تم تعيين مؤشر رقمي لكل جهاز ، والذي ارتبطت به علامة لهذا المؤشر.
هل هو شيء قبعة؟
يبدو أننا تعلمنا التعرف على الأجهزة والوجوه ، فقد تم إنجاز العمل. ضجة ، تصفيق! ماذا قد تكون هناك حاجة أخرى؟
في الواقع ، العمل بدأ للتو. الآن يجب جعل جميع مكونات النظام تعمل بثبات وبسرعة "في المعركة".
من الضروري تحسين تكلفة موارد الخادم في وضع الخمول ، والتفكير في حالات المستخدمين وفهم كيف يجب أن تبدو رسومية.
واجهة
ولعل أهم نقطة في تطوير مثل هذه الأنظمة هي الواجهة. قد يجادل شخص ما ، لكن المستخدم هو العنصر المركزي في هذه الحالة.
في أسرع وقت ممكن ، يمكنك تنفيذ الجزء الأمامي باستخدام
Tkinter .
بعض الملاحظات حول Tkinter تتكون الواجهة من بطاقات تحتوي على معلومات حول الجهاز والمستخدم الذي يستخدم هذا الجهاز حاليًا. يشغل كتالوج البطاقات معظم الشاشة - أداة المحاسبة الرئيسية. يوجد في الجزء العلوي عامل تصفية يمكنك من خلاله تصفية الدليل حسب النظام الأساسي أو إصدار نظام التشغيل.

فيما يلي المكونات الرئيسية للواجهة:
- الجهاز
يتم عرض بطاقات الجهاز على الشاشة مع إصدار نظام التشغيل واسم ومعرف الجهاز ، بالإضافة إلى المستخدم الذي تم تسجيل هذا الجهاز عليه حاليًا. - التثبيت الضوئي
على اليمين توجد وحدة التحكم ، حيث يتم عرض الصورة من كاميرا الويب ، بالإضافة إلى أزرار تسجيل وتحرير المعلومات الشخصية.
نعرض الصورة لإعطاء ملاحظات المستخدم - أنت بالتأكيد تضغط على الشاشة مع تسمية الجهاز. - اختيار إصدار نظام التشغيل
قمنا بعمل قائمة باختيار إصدار نظام التشغيل الذي يهمك ، لأنه غالبًا لإجراء الاختبار ، لا تحتاج إلى جهاز معين ، ولكن إلى إصدار معين من Android أو iOS. يتم إجراء فلتر الإصدار أفقيًا لتوفير المساحة ولجعل قائمة الإصدارات يمكن الوصول إليها دون التمرير ، على شاشة واحدة.
التحسين
لا يستغرق تمرير أي مكون من مكونات النظام الكثير من الوقت. ومع ذلك ، إذا بدأت التعرف على العلامات والوجوه في نفس الوقت ، فإن محاولة التعرف على كل 30 إطارًا في الثانية التي توفرها الكاميرا ستؤدي إلى استنفاد كامل لموارد الكمبيوتر بدون GPU.
من الواضح أن 99٪ من الوقت الذي سيقوم فيه النظام بهذا العمل خامل.
لتجنب ذلك ، تم اتخاذ قرارات التحسين التالية:
- يتم تغذية كل إطار ثامن فقط في المعالجة.
كود if self.lastseen + self.rec_threshold > time.time() or self.frame_number != 8: ret, frame = self.video_capture.read() self.frame_number += 1 if self.frame_number > 8: self.frame_number = 8 return frame, None, None, None
يرتفع تأخير استجابة النظام إلى حوالي 8/30 ثانية ، في حين أن وقت رد الفعل البشري هو ثانية واحدة تقريبًا. وبناءً على ذلك ، لن يكون هذا التأخير ملحوظًا للمستخدم. وقمنا بالفعل بخفض الحمل على النظام ثماني مرات. - أولاً ، يتم البحث عن علامة الجهاز في الإطار ، وعندما يتم اكتشافها فقط ، يتم بدء التعرف على الوجه. نظرًا لأن البحث عن المحددات في الإطار أقل تكلفة بحوالي 300 مرة من البحث عن الوجوه ، فقد قررنا أنه في وضع الاستعداد ، سوف نتحقق فقط من وجود علامة.
- لتقليل "المكابح" عند البحث عن وجوه في حالة عدم وجود وجوه في الصورة ، تم تعطيل معلمة number_of_time_to_upsample في وظيفة face_locations.
face_locations = face_recognition.face_locations (rgb_small_frame، number_of_times_to_upsample = 0)
ونتيجة لذلك ، فإن وقت معالجة الإطار الذي لا توجد به وجوه يساوي وقت معالجة الإطار حيث يمكن اكتشاف الوجوه بسهولة.
ما هي النتيجة؟
في الوقت الحالي ، تم نشر النظام بنجاح على MacMini أواخر عام 2009 ، والذي أصبح متاحًا ، على نواتين Core 2 Duo. كجزء من الاختبار ، عملت بنجاح كبير حتى على مركز افتراضي واحد مع 1024 ميغابايت من ذاكرة الوصول العشوائي و 4 غيغابايت من ذاكرة القراءة فقط في حاوية Docker. قام MacMini بتوصيل شاشة تعمل باللمس لجعل الشكل أضيق الحدود.
الآن حتى هؤلاء المستخدمين الذين لم يستخدموا اللوحة القديمة بحماس وابتسامة في تسجيل الأجهزة على أنفسهم ، وكانت هناك حالات أقل بكثير من عمليات البحث الفاشلة!
ما هي الخطوة التالية؟
هناك بلا شك العديد من النقاط في النظام الحالي والتي يمكننا تحسينها ونود تحسينها:
- تأكد من عدم ظهور عناصر تحكم نظام التشغيل عند ظهور مربعات الحوار (الآن هذه علبة رسائل من حزمة Tkinter).
- حسابات منفصلة وطلبات الخادم في سلاسل رسائل مختلفة مع معالجة الواجهة (الآن يتم تنفيذها في سلسلة المحادثات الرئيسية ، mainloop Tkinter ، والتي تجمد الواجهة عند إرسال الطلبات إلى قاعدة البيانات عبر الإنترنت).
- اجلب الواجهة إلى نفس التصميم مع موارد الشركة الأخرى.
- إنشاء واجهة ويب كاملة لعرض البيانات عن بعد.
- استخدم التعرف الصوتي لتأكيد / إلغاء الإجراءات وملء الحقول النصية.
- تنفيذ تسجيل عدة أجهزة في وقت واحد.
PS وهذه هي الطريقة التي يعمل بها.تسجيل الفيديو في إصدار بيتا من واجهة المستخدم الرسومية