التعرف على الصور لحظيا
أدمغتنا تجعل من الرؤية مهمة سهلة. لا يتطلب الأمر أي جهد من البشر للتعرف على قطة وكلب أو حتى وجه إنسان. ولكن في الواقع هذه مشكلة بالنسبة لجهاز كمبيوتر. في السنوات القليلة الماضية، توصلت Deep Neural Networks (الشبكات العصبية العميقة) إلى نتائج مذهلة حول مشاكل التعرف على الأنماط، أحد المكونات الأساسية هو Convolutional Neural Networks (الشبكات العصبية التحويلية).
تدريب شبكة عصبية عميقة قادرة على تصنيف عدد كبير من الانماط المختلفة لمدة يومين كاملين غير عملي تمامًا، لذلك استخدمنا الإصدار v3 المدرب مسبقًا:
تدرب Inception-v3 عن طريق تطبيق ImageNet لتحدي التعٌرف البصري باستخدام البيانات من عام 2012. هذه مهمة اساسية في مجال computer vision (رؤية الكمبيوتر)، حيث تحاول النماذج تصنيف صور بأكملها إلى 1000 فئة مختلفة، مثل “الحمار الوحشي” و “سفينة الفضاء” و ” غسالة أطباق”. لم تكن جميعها أشياء شائعة تجدها في البيئة الحقيقية، وعادة ما يتم إعادة تدريب الطبقات الأخيرة، حيث ان الطبقات الأولى تحصل على ميزات شائعة جدًا مثل الحواف والخطوط فقط.
ماذا تحتاج؟
ملحوظة: إذا كان لديك GPU يتمتع ب CUDA Compute Capability 3.0 أو أعلى، فجرّب Tensorflow مع دعم GPU، أسرع بكثير، لكنك ستحتاج إلى تثبيت مجموعة أدوات CuDNN وCUDA. إذا لم يكن كذلك، اذهب إلى tensorflow بدون دعم GPU، بالتأكيد أسهل في التثبيت.
النموذج
في كل مرة نواجه فيها نظامًا معقدًا، يجب علينا تقسيمه إلى نماذج فرعية أبسط. فمثلاً:
- استيراد الصورة من كاميرا الويب
- تصنيف الصور
- تحويل النص الى الكلام
سنقوم ببرمجة واختبار كل مكون من المكونات بشكل منفصل.
استيراد الصورة من كاميرا الويب
سوف نستخدم Opencv ببساطة:
نحتاج فقط لاستدعاء ()cv2.VideoCapture
، وقراءة الإطارات الواردة. ()read
في السطر 6 هي عملية اعتراضية، لذا يتم إيقاف عمل النواه الرئيسية للبرنامج تمامًا حتى تتم قراءة الإطار من الكاميرا بالكامل.
هذه مشكلة، لأنه لا بد أن يستجيب نظامنا في الحظياً. يمكن أن نحسن FPS (عدد الإطارات في الثانية) كحل لهذه المشكلة ببساطة عن طريق إنشاء نواه جديدة لا تفعل شيئًا سوى سحب الإطارات جديدة من الكاميرا بينما تعالج النواه الرئيسية الإطارات الحالية:
نعرّف وظيفة constructor (المُنشئ) من فئة VideoStream في السطر الرابع، وبتمرير المتغير scr لهذه الوظيفة “وذلك شيء اختياري”. إذا كان src عبارة عن عدد صحيح، فيفترض أن تكون كاميرا الويب / كاميرا USB تعمل جيداً على نظامك. للوصول إلى أحدث إطار تم التقاطه من الكاميرا، سنستخدم وظيفة ()read
في السطور 19-21. وذلك يؤدي الى تحسن كبير في لأداء.
تصنيف الصور
بالنسبة لهذا الجزء، سنستعمل بعض ادوات Tensorflow التوضيحية لتصنيف الصور.
أولاً، يتعين علينا تنزيل النموذج الخاص بنا وإنشاء فئة NodeLookup للحصول في النهاية على كلمات مفهومة لوصف الصور.
كما ذكرت أعلاه، ما بين السطور 1-53 نقوم بأنشاء فئة NodeLookup، التي ستقوم بمعالجة التسميات وتعطي كلمات مفهومة لوصف الصور لكل نتيجة في تصنيف. تقوم الدالة ()create_graph
بتحميل الرسم البياني الخاص بtensorflow الذي سنستخدمه من الذاكرة.
وتقوم الدالة ()maybe_download_and_extract
بالتحقق مما إذا كان النموذج موجودًا في النظام الخاص بك ام لا.
عنوان URL للنموذج هو:
http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
والمتغير “model_dir” هو المكان الذي تريد حفظ النموذج فيه (مثل ‘/tmp/imagenet’).
تحويل النص الى كلام
في البداية، فكرنا في بناء النموذج، باستخدام شبكة عصبية مثل WaveNet. ستدرك أن هذا غير ممكن لكمبيوتر مكتبي التطبيق والاستجابة الفورية. لذلك باستخدام تطبيقات Google TTS (تحويل النص إلى كلام) Gtts، وحفظ كل نتيجة منه في جدول البحث، حتى نتمكن من الحصول على أداء أفضل واستجابة لحظية. ولإنتاج الملف الصوتي، استخدمنا pygame.
وضع كل شيء معا
في السطرين 2 و3 هي مجرد استدعاء للوظائف التي اعددناها في السابق.
من السطر 6 إلى 14، نقوم بتعريف بعض المتغيرات، كالنتيجة واللون والخط للنص على الشاشة. السطر 17 يبدأ باستيراد الإطارات من الكاميرا.
في السطر 20، يبدا Tensorflow بالعمل ثم يتم تحميل النموذج.
نقوم بحساب عدد الإطارات فقط للحصول على قيمة FPS (ليس لاننا نقوم بمعالجة الصورة عند تجميع 5 إطارات).
في السطر 45، قمنا بتعيين الحد الأدنى للنجاح 50٪، وقمنا بتغيير بعض الاسماء (مثل iPhone لأجهزة iPad، نوع من الغش، أعرف ذلك).
من السطر 60 إلى 71 يتم استخدام وحدة تحويل النص إلى الكلام. نحفظ الناتج كملف صوتي fist-word-of-category.mp3. إذا كانت موجودة في المجلد، فسنقوم بتشغيلها فقط. إذا لم يكن، فسنستخدم Google API للحصول عليه وحفظه.
ثم نعرض بعض المعلومات في الشاشة مثل الناتج النهائي وFPS. إذا قمت بالضغط على “q”، فسيتم إغلاق كل شيء ويوقف البرنامج.
النتائج
النتائج مذهلة. على GPU GeForce 960M من Nvidia مع GB12 من ذاكرة الوصول العشوائي حصلنا على 16 إطارًا في الثانية وتصنيفات شديدة الدقة.
يجدر بك أيضا سماع الملف الصوتي.
يمكنك تحميل النسخة النهائية من الكود هنا.