7.6. تشريح predict

Model.predict(inputs, *, callback=None) هو المكان الذي يؤدي فيه كائن النموذج المحمّل عمله فعليًا. بين دخول المدخلات وخروج النتيجة، تعمل ثلاث مراحل بالتتابع: المعالجة المسبقة، وإرسال المحرك، والمعالجة اللاحقة. اثنتان من الثلاث تأخذان معاملات يتحكم بها البرنامج النصي مباشرةً؛ أما المحرك في الوسط فتقرره الكاميرا.

A horizontal flow of five connected boxes from left to right. The leftmost is "Image input"; an arrow leads to "Pre-process" subtitled "Normalization"; an arrow leads to "Engine" subtitled "TFLM / STAI"; an arrow leads to "Post-process" subtitled "postprocess="; and a final arrow leads to "Result". The three middle stages carry a tag underneath -- "user-controllable" beneath Pre-process, "automatic" beneath Engine, and "user-controllable" beneath Post-process.

المراحل الثلاث لـ predict(). المعالجة المسبقة والمعالجة اللاحقة تأخذان معاملات يتحكم بها البرنامج النصي؛ أما المحرك في الوسط فتثبّته الكاميرا.

7.6.1. المعالجة المسبقة

تحوّل مرحلة المعالجة المسبقة كل مُدخل إلى الموتر الكثيف الذي تتوقعه الشبكة. أكثر المدخلات شيوعًا هو image.Image، المُلتقَط بصيغة RGB565. تقصّ المرحلة الصورة وتعيد تحجيمها إلى input_shape الخاص بالشبكة، وتحوّلها من RGB565 إلى صيغة القنوات التي دُرّبت عليها الشبكة (RGB888 لمعظم شبكات الرؤية)، وتطبّق معامل القياس والإزاحة لكل قناة، و-- عندما تتوقع الشبكة إدخالًا صحيحًا -- تُكمّمها إلى input_dtype الخاص بالنموذج في المرور نفسه. أما الشبكات المُدرَّبة على إدخال عشري فتتخطى خطوة التكميم وتتلقى نتيجة القياس والإزاحة مباشرةً.

تقرأ ml.preprocessing.Normalization الافتراضية نوع بيانات إدخال النموذج وتُشغّل التحويل الصحيح تلقائيًا. أما Normalization المضبوطة يدويًا فتتجاوز قيم القياس والمتوسط والانحراف المعياري للنماذج المُدرَّبة على إحصاءات قنوات مخصصة (المتوسطات والانحرافات المعيارية المشتقة من ImageNet حالة شائعة). أما الكائن القابل للاستدعاء البسيط فيتجاوز المرحلة بالكامل -- وهو مفيد عندما لا يكون الإدخال صورةً على الإطلاق أو عندما يكون التطبيق قد أنتج الموتر الكثيف بنفسه.

7.6.2. إرسال المحرك

تُشغّل مرحلة المحرك الشبكة. والمحرك الذي تُرسل إليه تثبّته الكاميرا: تُشغّل H7 وRT1062 محرك TFLM (مفسّر TensorFlow Lite for Microcontrollers، الذي يُرسل أنوية CMSIS-NN المحسّنة لمعمارية ARM حيثما وُجدت)؛ وتُشغّل AE3 مفسّر TFLM نفسه مع آلية الرجوع إلى Cortex-M55 ووحدة Ethos-U NPU التي تعالج أي مُعامِل (operator) وسمه مُترجِم Vela غير المتصل للمُسرّع؛ وتُشغّل N6 محرك STAI، وهو زمن تشغيل ST لوحدة NPU المبنية خصيصًا لـ N6.

لا يختار البرنامج النصي المحرك. فالمحرك الذي يُشحن مع الكاميرا يُشغّل كل نموذج تُحمّله الكاميرا.

7.6.3. المعالجة اللاحقة

تحوّل مرحلة المعالجة اللاحقة موترات الإخراج الخام للشبكة إلى نتيجة قابلة للاستخدام. السلوك الافتراضي هو إلغاء تكميم كل موتر إخراج إلى الفاصلة العائمة (أو تمريره دون تغيير للشبكات ذات المخرجات العشرية) وإعادتها كقائمة من كائنات ndarray. تُسجّل معظم التطبيقات معالِجًا لاحقًا -- كائنًا قابلًا للاستدعاء يعرف تخطيط إخراج الشبكة -- لفك ترميز الموترات إلى صيغة النتيجة التي يعمل عليها التطبيق: قائمة مربعات إحاطة، أو قائمة نقاط مفتاحية، أو قائمة أصناف.

يتحكم البرنامج النصي بهذه المرحلة بطريقتين. تُسجّل الكلمة المفتاحية postprocess= على المُنشئ معالِجًا لاحقًا يعمل في كل استدعاء. أما الكلمة المفتاحية callback= على predict() فتتجاوز المعالِج اللاحق المُسجَّل لاستدعاء واحد فقط -- وهو مفيد للتبديل بين عدة فاكّات ترميز دون إعادة تحميل النموذج. وكلا الشكلين يتلقى (model, inputs, outputs) ويُعيد أيًا كان ما يتوقعه التطبيق.

7.6.4. ما الذي يتحكم به البرنامج النصي

المعالجة المسبقة والمعالجة اللاحقة هما مقبضا البرنامج النصي. يتعامل المعالِج المسبق الافتراضي مع معظم نماذج الرؤية؛ ويُنتقى المعالِج اللاحق المناسب لعائلة شبكة معينة من الفهرس الموجود ضمن ml.postprocessing. أما المحرك في الوسط فيقرره البناء ويعمل بالطريقة نفسها بصرف النظر عما يطلبه البرنامج النصي.