الذكاء الاصطناعي الذي لا يطلب الخبز

مقال عن كيفية بناء الذكاء الاصطناعي لدينا خطوة بخطوة. وقت القراءة 10+ دقيقة.







مقدمة . بدء تشغيل رؤية الكمبيوتر باستخدام تطوير منخفض التكلفة كمفهوم أساسي. يتوافق الفريق تمامًا مع الروح: 3-5 طلاب من مطورين من مستويات واتجاهات مختلفة ، اعتمادًا على يوم الأسبوع والوقت من اليوم (من 0.25 إلى 1.25 معدلات). تجربتي في لعب العلامة مفيدة جدا هنا.



باختصار عن المنتج (كمبيوتر + برنامج) - نظام مراقبة فيديو ذكي متصل بشبكة محلية وينتج معالجة الفيديو بمفرده . متطلبان أساسيان: وجود واجهة مستخدم ذات حقوق مختلفة واستقلالية قصوى للخوارزميات.



من الناحية الفنية ، لم تكن هناك قيود على الأجهزة ، الشيء الرئيسي هو أنها تعمل بشكل جيد ؛ ولكن مع كانت المالية. لكل شيء عن كل شيء ~ 500 دولار. بالطبع ، المكونات الجديدة والحديثة فقط. اختيارهم ليس رائعًا ، لكن هناك!



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



انتقل تطوير الميزات من بسيطة وضرورية (العمل مع التدفقات وملفات الفيديو) إلى معقدة ، مع المراجعة الدورية. قمنا بتجميع MVP ، العديد من سباقات التحسين جعلتنا أقرب بشكل ملحوظ إلى هدفنا العزيز - لإكمال جميع النقاط الأربع في نفس الوقت ، وليس بشكل منفصل:



  1. أكثر من 16 كاميرا IP (FHD / 25 إطارًا في الثانية) تشغيل وتسجيل مباشر أو حدث أو وقت
  2. التشغيل المتوازي لجميع خوارزميات السيرة الذاتية المتاحة
  3. يستخدم المستخدم الواجهة بشكل مكثف دون تأخير - مشاهدة التدفقات
  4. حمل وحدة المعالجة المركزية أقل من 90٪ وكل شيء يعمل (!)


قليلاً عن المكدس ، وقع الاختيار على: C / C + و Python + TensorFlow و PHP و NodeJS و TypeScript و VueJS و PostgreSQL + Socket.io وأشياء صغيرة أخرى.



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



"مستخدم فريد"



مثال على الاستخدام هو جمع سجل زيارات كل زائر محدد ، ويجب أن يؤخذ الموظفون في الاعتبار بشكل منفصل ، حتى لو لم نكن نعرف أن هذا موظف (مثال - مركز تسوق).

ويبدو أن هذه المشكلة قد تم حلها أكثر من 100500 مرة وأن الهواتف وأي شيء آخر يمكنه بالفعل التعرف على الوجوه وتذكرها وإرسالها إلى مكان ما وحفظها. لكن 95٪ من الحلول مستخدمة في أنظمة التحكم الآلي ، حيث يقف المستخدم نفسه ، في محاولة للتعرف عليه ، أمام كاميرا بدقة 5 ميجابكسل على مسافة 30-50 سم لعدة ثوان ، حتى يتحقق وجهه بواحد أو عدة وجوه من قاعدة البيانات.



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



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



نهج الحل: تم تقسيم المهمة إلى مهمتين + بنية قاعدة البيانات.



ذاكرة قصيرة المدي



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

يوجد داخلها العديد من الحلول المثيرة للاهتمام في مجال المنطق والتحسين ، ولكن هذا كل شيء ؛ الآن كل شيء ...



ذاكرة طويلة المدى



خدمة منفصلة ، حيث لا تكون متطلبات الوقت الفعلي حادة ، ولكنها مهمة في بعض الحالات (على سبيل المثال ، شخص من قائمة المحظورات). بشكل عام ، حددنا أنفسنا بـ 3 ثوانٍ للمعالجة.

عند مدخل الخدمة - http من الذاكرة قصيرة المدى مع ناقل 512 بعدًا بالداخل ؛ عند الخروج - معرف الزائر.



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

مزايا هذا الحل لا حصر لها ، ولكن ناقص واحد فقط - لا يعمل.



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



  1. كل متجه (ناقل) ينتمي إلى بعض المستخدمين ؛ كل مجموعة (لا تزيد عن M ناقلات ، خارج المربع M = 30) تنتمي إلى بعض المستخدمين. ما إذا كان المتجه a ينتمي إلى المجموعة A ليس حقيقة. تحدد المتجهات الموجودة في الكتلة تفاعل الكتلة ، وتحدد المتجهات الموجودة في المستخدم فقط تاريخ المستخدم.
  2. سيكون لكل مجموعة نقطه نقطية (في الواقع ، متجه A) ونصف قطرها الخاص (المشار إليه فيما يلي باسم النطاق) للتفاعل مع المتجهات أو المجموعات الأخرى.
  3. ستكون النقطه الوسطى والنطاق عبارة عن وظيفة كتلة ، وليست ثابتة.
  4. يتم تحديد القرب من المتجهات من خلال مربع المسافة الإقليدية (في حالات خاصة ، خلاف ذلك). على الرغم من وجود بعض الأساليب الأخرى اللائقة هنا ، فقد توقفنا للتو عند هذا الحد.


ملاحظة: منذ ذلك الحين استخدمنا نواقل طبيعية ، المسافة بينها كانت مضمونة من 0 إلى 2. بعد ذلك ، حول الخوارزمية لتطبيق المفهوم.



# 1 دائرة المشتبه بهم. Centroid كدالة تجزئة



تتم مقارنة المتجه X الذي تم الحصول عليه من الذاكرة قصيرة المدى مع النقط الوسطى العنقودية (A-vector) المتوفرة في قاعدة البيانات للقرب منها البعيدة ، حيث تم تجاهل النطاق [X ، A]> 1. إذا لم يتبق أحد ، يتم إنشاء كتلة جديدة.



بعد ذلك ، يتم البحث عن الحد الأدنى بين متجه X وجميع متجهات a المتبقية (min_range [X، a])



# 2 الخصائص الفريدة للكتلة. كيان ذاتي التنظيم



يتم حساب range_A الخاص بالمجموعة ، والذي يكون متجه الأقرب إلى متجه X. هنا نستخدم الدالة الخطية العكسية لعدد المتجهات (N) الموجودة بالفعل في هذه المجموعة (const * (1 - N / 2M)) ؛ خارج الصندوق const = 0.67).



# 3 التحقق من الصحة وسوء الفهم. إذا لم يكن هناك شخص - فمن إذن!؟



إذا كانت range_A> min_range [X ، a] ، فسيتم تمييز المتجه X على أنه ينتمي إلى المجموعة A. إذا لم يكن كذلك ، إذن ... أوه ... هذا يشبه إلى حد ما وصف النموذج الرياضي لسوء الفهم.

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



# 4 تدريب إضافي. كيف تشكل الأرقام العلامات



التجربة الذاتية هي عندما تصبح البيانات أداة. لقد عرفنا في وقت سابق ، ولكن ربما مع وجود خطأ. هل يجب أن أثق في ناقل X لاستخدامه في المباراة القادمة!؟ تدقيق! يجب أن يكون ناقل X:



  • كن قريبًا بدرجة كافية من النقطه الوسطى A (range_A> range [X ، A])
  • أن تكون مفيدة ومتنوعة ، لأننا من ناحية ، فإننا نقلل مخاطر الأخطاء ، ومن ناحية أخرى ، لا نحتاج إلى نسخ أيضًا (Config_Max [0.35]> range [X، a]> Config_Max [0.125]). وبالتالي ، تحدد التكوينات سرعة "التعلم" وصحته.


استيفاءً لهذه الشروط ، يتم تضمين المتجه X في المجموعة A (قبل ذلك كان ينتمي ببساطة إلى المستخدم). إذا كان هناك المزيد من النواقل في الكتلة ، فإننا نزيل أكثر النواقل المركزية (min_range [A ، a]) - فهي تقدم أقل تنوع وهي مجرد وظيفة للآخرين ؛ علاوة على ذلك ، تشارك النقطه الوسطى بالفعل في المطابقة.



# 5 اعمل على الخلل. نحول العيوب إلى مزايا



في كل خيار صعب ، اتخذنا خطوة نحو الخطأ "الهدف المفقود" - أنشأنا مجموعة ومستخدمًا جديدين. حان الوقت لإعادة زيارتها ... كل شيء. بعد رقم 4 لدينا مجموعة معدلة أ. بعد ذلك ، نعيد حساب النقطه الوسطى (A-vector) ونبحث عن الحد الأدنى للمسافة لجميع النقط الوسطى المتاحة في فضاء 512 بعدًا. في هذه الحالة ، تعتبر المسافة أكثر صعوبة ، لكن هذا ليس مهمًا جدًا الآن. عندما تكون المسافة الدنيا [أ ، ب] أقل من قيمة معينة (خارج النطاق المربع = 0.25) ، فإننا نجمع مجموعتين ، ونحسب النقطه الوسطى الجديدة ونتخلص من المتجهات الأقل "المفيدة" إذا كان هناك الكثير منها.

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



# 6 ميزات اندماجية. عندما تفكر السيارة ...!؟



يجدر تحديد مصطلح جديد هنا في هذه المقالة. المتجه الوهمي هو ناقل تم الحصول عليه ليس نتيجة نشاط ذاكرة قصير المدى ، ولكن كنتيجة لدالة على N متجه للعنقود (a1 ، a2 ، a3 ، a4 ...). بالطبع ، يتم تخزين المتجهات التي تم الحصول عليها بهذه الطريقة وحسابها بشكل منفصل ولا تمثل أي قيمة حتى يتم تحديدها ، كنتيجة للمطابقة ، على أنها الأقرب منها (انظر # 3). الفائدة الرئيسية للناقلات الوهمية هي تسريع التعلم المبكر للعنقود .



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



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



دور مستخدم النظام بسيط - تحتاج إلى التحقق بشكل دوري من بريدك أو واجهة النظام لتقارير النشاط الجديد.



نتيجة



قيمة القرب للتعرف على الذاكرة طويلة المدى هي ~ 0.12-0.25 لمجموعة مدربة بشكل معتدل (تحتوي على 6-15 متجه أ). علاوة على ذلك ، يتباطأ التعلم بسبب زيادة احتمالية "النسخ المتجهة" ، ولكن على المدى الطويل ، يميل القرب إلى قيم ~ 0.04-0.12 ، عندما تحتوي المجموعة بالفعل على 20+ متجه. لاحظ أنه داخل الذاكرة قصيرة المدى ، من إطار إلى إطار ، نفس المعلمة لها قيمة ~ 0.5-1.2 ، والتي تبدو شيئًا مثل: "الشخص يشبه نفسه بنظارة منذ عامين أكثر من 100 مللي ثانية." يتم فتح هذه الفرص من خلال استخدام التجميع في الذاكرة طويلة المدى .



لغز



نتج عن أحد الاختبارات ملاحظة مثيرة للاهتمام.



الشروط الأولية:



  • يتم نشر نظام مراقبة بالفيديو متطابق تمامًا مع إعدادات متطابقة تمامًا على جهازي كمبيوتر متطابقين تمامًا. إنها متصلة بكاميرا IP واحدة ، وتقع بشكل صحيح ، وفقًا لـ TOR.


فعل:



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


نتيجة:



  • عدد المستخدمين والمجموعات والمتجهات التي تم إنشاؤها هو نفسه ، لكن النقط الوسطى مختلفة ، ليس بشكل كبير - ولكنها مختلفة. السؤال هو لماذا؟ من يعلم - اكتب في التعليقات أو هنا )


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



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




آمل حقًا أن تكون هذه المقالة مفيدة لأي شخص في مشروعه.



All Articles