لقد حان مرحلة جديدة في تطوير
خزان التوت .
في
السلسلة السابقة ، اتضح أن التجزئة الدلالي خارج المربع كان صعبًا للغاية بالنسبة لتوت العليق.
سمحت لنا العصف الذهني والتعليق بتحديد مجالات التنمية التالية:
- تدريب شبكة E-net الخاصة بك على حجم الصورة المطلوب
- نقل إطلاق الشبكة العصبية من Raspberry نفسها إلى قطعة خاصة من الأجهزة ، والتي غالبًا ما تم ذكر Intel Movidius (ويعرف أيضًا باسم Neural Compute Stick الملقب NCS).
إن إرفاق قطعة حديد جديدة بالروبوت هو الشيء الأكثر إثارة للاهتمام في الروبوتات ، لذلك تم تأجيل العمل المضني المتمثل في تدريب الشبكة العصبية حتى أوقات أفضل.
بضعة أيام - وقطعة الحديد إنتل المعجزة في يدي.
إنها كبيرة جدًا ولا يمكنك لصقها في موصل USB السفلي للتوت. نظرًا لأن منافذ USB الصحيحة كانت محجوبة بواسطة حامل ثلاثي الكاميرا ، وأن الجزء العلوي الأيسر كان يشغله وحدة GPS ، لم يكن هناك الكثير من الخيارات.
نتيجة لذلك ، تم وضع GPS على الكبل ، وتم رفضه ، وتم لف الكبل حول حامل ثلاثي الأرجل ، واستبدله NCS.
على هذا الجزء الأجهزة تم الانتهاء.

إنتل NCS
أصدرت Intel مؤخرًا الإصدار الثاني من NCS ، وكانت واجهة برمجة التطبيقات (API) غير متوافقة تمامًا مع الإصدار السابق ، والذي تسبب المستخدمون في الكثير من الألم على الإنترنت.
نتيجة لذلك ، فإن قاعدة المعرفة الكاملة حول الإصدار السابق هي في الوقت الحالي مجرد معلومات إخبارية.
تقدم النسخة الجديدة إطار عمل OpenVino ، والذي يتضمن OpenCV وأكثر من ذلك بكثير ، بما في ذلك الأدوات المختلفة للعمل مع الشبكات العصبية.
فيما يلي بعض المقالات التمهيدية حول NCS2 و OpenVino:
اتضح أن البدء في استخدام NCS كان سلسًا للغاية.
قدمت Intel في البداية الدعم لـ Raspbian ، لذلك لم تكن هناك حاجة للرقص مع الدف.
كانت الوثيقة التمهيدية واضحة جدًا أيضًا ولم يتسبب تثبيت إطار OpenVino في حدوث أي مشكلات.
لقد كان من المكافآت اللطيفة أن OpenVino يتضمن OpenCV 4.1 ، مما يوفر الوقت ، حيث اضطررت إلى إنشاء إصدارات سابقة من OpenCV على Raspberry بنفسي.
إليك ما يبدو عليه NCS2 بمفرده:

كذلك اتضح أن تكون أكثر إثارة للاهتمام.
يدعم NCS تنسيق الشبكة العصبية الخاص به فقط ، بينما توفر Intel أداة Optimizer Model كجزء من OpenVino لتحويل الرسوم البيانية لأطر العمل الأكثر شيوعًا: Tensorflow و Caffe و Torch. المزيد عن هذا سيكون المقبل.
بالإضافة إلى ذلك ، توفر Intel أيضًا
حديقة حيوانات نموذجية - مجموعة من النماذج الجاهزة للعديد من المناسبات.
من بينها نموذجان لتجزئة الطرق:
الشبكات العصبية في NCS
من أجل تشغيل شبكة عصبية على جهاز ، تحتاج إلى اتخاذ عدة خطوات.
تهيئة الجهاز
اسم MYRIAD ، فكرة المكون الإضافي والتحميل الديناميكي منه ، المسار الذي يجب تحديده في البرنامج - يمتد بوضوح من الماضي المظلم.
from openvino.inference_engine import IENetwork, IEPlugin ncs_plugin = IEPlugin(device="MYRIAD", plugin_dirs="/opt/intel/openvino/inference_engine/lib/armv7l")
تحميل نموذج
بعد ذلك ، تحتاج إلى تحميل النموذج على الجهاز.
هذه عملية صعبة. هذا النموذج الصغير الذي استخدمته للتجزئة يستغرق حوالي 15 ثانية للتحميل.
والخبر السار هو أنك تحتاج فقط إلى تنزيل النموذج مرة واحدة ويمكنك تنزيل العديد من النماذج.
model = IENetwork(model=xml_path, weights=bin_path) net = ncs_plugin.load(network=model)
تشغيل الحساب
الآن يمكن استخدام النموذج.
input_blob = next(iter(model.inputs)) out_blob = next(iter(model.outputs)) n, c, h, w = model.inputs[input_blob].shape images = np.ndarray(shape=(n, c, h, w)) images[0] = image res = net.infer(inputs={input_blob: images}) res = res[out_blob]
عملية واحدة
اتضح فجأة أنه لا يمكنك استخدام NCS من عمليتين مختلفتين في نفس الوقت.
لا يستطيع أي شخص متأخر تحميل النموذج:
E: [ncAPI] [ 684447] resetAll:348 Failed to connect to stalled device, rc: X_LINK_ERROR E: [ncAPI] [ 691700] ncDeviceOpen:672 Failed to find suitable device, rc: X_LINK_DEVICE_NOT_FOUND Traceback (most recent call last): net = ncs_plugin.load(network=model) File "ie_api.pyx", line 395, in openvino.inference_engine.ie_api.IEPlugin.load File "ie_api.pyx", line 406, in openvino.inference_engine.ie_api.IEPlugin.load RuntimeError: Can not init USB device: NC_ERROR
لم تسمح Google أو منتدى دعم Intel بفهم ما كان الأمر - إما أن يكون الجهاز حصريًا بالفعل أو لا أعرف كيف أطبخه.
تجزئة OpenVino
كما ذكرنا من قبل ، من خارج الصندوق ، يوفر OpenVino نموذج تجزئة للطرق وأمثلة.
نتائج الاختبار متناقضة إلى حد ما. يتم التعرف عليه في بعض الأحيان بشكل ملتوي ، لكن في الغالب يكون طبيعيًا.
لقد عمل Enet بشكل أفضل ، ولكن لا يزال يتعين علينا تجربة Enet تحت NCS ، لذلك دعونا نجرب ما لدينا.

ومن المثير للاهتمام ، لمعرفة المزيد عن النموذج من OpenVino وإعادة تدريبه ، فإنه ليس بهذه البساطة.
يهتم المستخدمون ، لكن الشخص من Intel قال بصرامة أن كود وبيانات النموذج مغلقة ، ويمكن لأولئك الذين يرغبون في أخذ
شبكة عصبية مماثلة على PyTorch ، تدريبها وتحويلها واستخدامها.
ميزة السرعة كبيرة جدا:
إذا استغرق تجزئة Enet 6 ثوانٍ ، فقد استغرق هذا الطراز 0.8 ثانية لمعالجة صورة واحدة (بينما استغرق 14 ثانية لتحميل النموذج على الجهاز ، ولكن هذا تم في نفس الوقت).
تصنيف الاتجاهات
لاتخاذ قرارات بشأن اتجاه الحركة ، يستخدم الخزان شبكة عصبية بسيطة ، كما هو موضح في
المقال المقابل .
يتم تدريب الشبكة العصبية على Keras وتعمل على Raspberry من خلال Tensorflow ، التي تحتوي على محول مدمج لهذا التنسيق.
النموذج بسيط للغاية وحتى على Raspberry يعرض نتائج مقبولة للسرعة.
(0.35 ثانية لكل صورة).
ومع ذلك ، بوجود غدة Intel ، يمكنك توقع تحقيق نتائج أفضل.
من بين التنسيقات التي يقبلها Optimizer من Intel للتحويل ، يوجد Tensorflow ، ولكن لا يوجد Keras.
إن تحويل Keras إلى TF أمر شائع إلى حد ما ، فهناك مواد كافية حول هذا الموضوع ، وقد استرشدت
بهذا المقال .
لدى المؤلف نفسه
مقالة أكثر شمولاً ، فقط حول موضوع كيفية تشغيل نموذج Keras على OpenVino.
يمكنك أيضًا استخدام
التوجيه من Intel .
بشكل عام ، جمعت المصادر ، حصلت على برنامج نصي لتحويل نموذج Keras إلى TF:
import tensorflow as tf from tensorflow.python.framework.graph_util import convert_variables_to_constants from keras import backend as K from keras.models import load_model from keras.models import model_from_json def load_keras_model(json_file, model_file): jf = open(json_file, 'r') loaded_model_json = jf.read() jf.close() loaded_model = model_from_json(loaded_model_json) loaded_model.load_weights(model_file) return loaded_model def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()]
الكود نفسه يقع
على جيثب .
يتم تقطير نموذج TF الناتج في تنسيق OpenVino:
python mo_tf.py --input_model "model/ktf_model.pb" --log_level=DEBUG -b1 --data_type FP16
أظهرت الاختبارات أن تصنيف الصورة يستغرق 0.007 ثانية.
هذه النتيجة مرضية جدا.
جميع النماذج المدربة (Keras، TF، OpenVino) يتم تحميلها أيضًا
على github .
التعرف على الأشياء
مهمة التجزئة ليست المهمة الوحيدة التي يجب على الروبوت حلها في حياته الصعبة.
في البداية ، كان هناك كاشف للقطط ، نما لاحقًا ليصبح كاشفًا عالميًا يعتمد على MobileSSD و OpenCV-DNN.
الآن حان الوقت لتشغيل نفس المهمة على NCS.
في
model_zoo من Intel ،
تكفي أجهزة الكشف عن خصوصية أضيق تستند إلى MobileSSD ، ولكن لا يوجد تناظرية دقيقة.
ومع ذلك ، يتم سرد هذه الشبكة على أنها متوافقة في
قائمة نماذج TF المدعومة .
ومن المثير للاهتمام ، في وقت كتابة هذا التقرير ، أن إصدار MobileSSD 2018_01_28 موضح هنا.
ومع ذلك ، يرفض OpenCV قراءة هذا النموذج:
cv2.error: OpenCV(4.1.0-openvino) /home/jenkins/workspace/OpenCV/OpenVINO/build/opencv/modules/dnn/src/tensorflow/tf_importer.cpp:530: error: (-2:Unspecified error) Const input blob for weights not found in function 'getConstBlob'
(ولكن اكتشفنا أنهم يستخدمون جنكينز).
في نفس الوقت ، التحويل إلى OpenVino ناجح.
إذا حاولنا تحويل إصدار Mobile SSD المتوافق مع OpenCV-DNN (11_06_2017) ، فسنحصل على هذا:
[E0919 main.py:317] Unexpected exception happened during extracting attributes for node FeatureExtractor/MobilenetV1/Conv2d_13_pointwise_1_Conv2d_2_1x1_256/Relu6. Original exception message: operands could not be broadcast together with remapped shapes [original->remapped]: (0,) and requested shape (1,0,10,256)
شيء من هذا القبيل ، من الناحية الفنية OpenVino و OpenCV-DNN في نفس الحزمة ، لكنها غير متوافقة مع إصدارات الشبكات العصبية المستخدمة.
وهذا هو ، إذا كنت ترغب في استخدام كلا النهجين في وقت واحد ، تحتاج إلى سحب نسختين من MobileSSD.
من حيث السرعة ، فإن المقارنة هي بالتأكيد لصالح NCS: 0.1 ثانية مقابل 1.7.
من حيث الجودة ... (على الرغم من أن هذه ليست مسألة NCS ، ولكن لتطور SSD المحمول).

تصنيف الصورة
الخزان قادر على تصنيف الصور من خلال Tensorflow ، وذلك باستخدام Inception on Imagenet.
اعتدت Inception 2015-12-05 ، عندما كان آخر واحد.
اتضح أنني كنت متأخراً عن الحياة ، لأن الرجال من Google لا يأكلون خبزهم وقد قاموا بالفعل بإنتاج 4 إصدارات!
لكن اللاعبين من إنتل ليسوا وراءهم وجميع الإصدارات 4 كانت مدعومة في OpenVino.
هنا
مقال يصف إصدارات مختلفة من التأسيس.
لكننا لن تافه ، نحن نزّل على الفور آخر ، رابع.
نقوم بتصنيف الصورة مع القط والكمبيوتر المحمول على الطاولة.
نتذكر نتائج الإصدار الحالي:
- كمبيوتر محمول ، كمبيوتر محمول 62 ٪
- دفتر ، كمبيوتر محمول 11 ٪
- 13 ثانية
- اين القطة
نقرأ الآن
الإرشادات الخاصة بتحويل Inception إلى OpenVino.
تم التحويل بنجاح ، نبدأ المصنف على NCS:
- كمبيوتر محمول ، كمبيوتر محمول 85 ٪
- دفتر ، كمبيوتر محمول 8 ٪
- 0.2 ثانية
- لا يوجد قط مرة أخرى
استنتاج
وبالتالي ، تم إعادة إنتاج جميع السيناريوهات التي تتطلب Tensorflow باستخدام NCS ، وهذا يعني أنه يمكنك إلغاء الاشتراك في استخدام Tensorflow.
ومع ذلك ، فإن هذا الإطار ثقيل بالنسبة لتوت العليق.
إن السرعة التي يهضم بها الجهاز العصبي المركزي الشبكة العصبية تسمح لها بتوسيع آفاقها.
هناك مهام يقوم بها الروبوت بالفعل ، على سبيل المثال ، التجزئة والتصنيف الدلالي ، ولكن هناك مهام أخرى مثل تجزئة الكائنات أو نقل الفيديو مع الكائنات المكتشفة في الوقت الفعلي. (الذي لم يكن من الممكن التفكير فيه على توت العليق العاري).
مشاكل المعالجة المتعددة مربكة إلى حد ما ، ولكن حتى إذا لم يمكن حلها ، فهناك دائمًا خيار في شكل التفاف NCS كخدمة منفصلة.
مراجع