![]() | ![]() | ![]() | ![]() |
في هذه المفكرة colab، سوف تتعلم كيفية استخدام صانع TensorFlow لايت نموذج مكتبة لتدريب نموذج الكشف عن وجوه مخصصة قادرة على اكتشاف السلطات داخل الصور على جهاز محمول.
الاستخدامات مكتبة نموذج صانع نقل التعلم إلى تبسيط عملية تدريب نموذج TensorFlow لايت باستخدام مجموعة بيانات مخصصة. تؤدي إعادة تدريب نموذج TensorFlow Lite باستخدام مجموعة البيانات المخصصة الخاصة بك إلى تقليل كمية بيانات التدريب المطلوبة وتقليل وقت التدريب.
عليك استخدام متاحة للجمهور السلطة مجموعة البيانات التي تم إنشاؤها من الصور المفتوحة الإدراجات V4 .
تحتوي كل صورة في مجموعة البيانات على كائنات مسماة بأحد الفئات التالية:
- خبز جيدة
- جبنه
- سلطة
- مأكولات بحرية
- طماطم
تحتوي مجموعة البيانات على المربعات المحيطة التي تحدد مكان كل كائن ، مع تسمية الكائن.
إليك مثال على صورة من مجموعة البيانات:
المتطلبات الأساسية
قم بتثبيت الحزم المطلوبة
تبدأ من خلال تثبيت الحزم المطلوبة، بما في ذلك حزمة صانع نموذج من الريبو جيثب ومكتبة pycocotools ستستخدمها للتقييم.
pip install -q --use-deprecated=legacy-resolver tflite-model-maker
pip install -q pycocotools
استيراد الحزم المطلوبة.
import numpy as np
import os
from tflite_model_maker.config import QuantizationConfig
from tflite_model_maker.config import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import object_detector
import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')
from absl import logging
logging.set_verbosity(logging.ERROR)
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pkg_resources/__init__.py:119: PkgResourcesDeprecationWarning: 0.18ubuntu0.18.04.1 is an invalid version and will not be supported in a future release PkgResourcesDeprecationWarning, /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/numba/core/errors.py:154: UserWarning: Insufficiently recent colorama version found. Numba requires colorama >= 0.3.9 warnings.warn(msg)
جهز مجموعة البيانات
هنا عليك استخدام نفس بيانات باسم AutoML التشغيل السريع .
على السلطات بيانات متاح في: gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv
.
يحتوي على 175 صورة للتدريب و 25 صورة للتحقق و 25 صورة للاختبار. مجموعة البيانات لديها خمسة فصول: Salad
، Seafood
، Tomato
، Baked goods
، Cheese
.
يتم توفير مجموعة البيانات بتنسيق CSV:
TRAINING,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Salad,0.0,0.0954,,,0.977,0.957,,
VALIDATION,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Seafood,0.0154,0.1538,,,1.0,0.802,,
TEST,gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg,Tomato,0.0,0.655,,,0.231,0.839,,
- يتوافق كل صف مع كائن مترجم داخل صورة أكبر ، مع تحديد كل كائن على وجه التحديد على أنه بيانات اختبار أو تدريب أو التحقق من الصحة. ستتعرف على المزيد حول ما يعنيه ذلك في مرحلة لاحقة في دفتر الملاحظات هذا.
- ثلاثة خطوط تدرج هنا تشير إلى ثلاثة أشياء مميزة تقع داخل نفس الصورة متوفرة في
gs://cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg
. - كل صف له تسمية مختلفة:
Salad
،Seafood
،Tomato
، الخ - يتم تحديد المربعات المحيطة لكل صورة باستخدام الرؤوس العلوية اليسرى والسفلية اليمنى.
هنا تصور لهذه الخطوط الثلاثة:
إذا كنت ترغب في معرفة المزيد حول كيفية تحضير CSV الخاصة بك متطلبات الحد الأدنى لإنشاء مجموعة بيانات صالحة ملف و، راجع إعداد بيانات التدريب الخاص بك الدليل لمزيد من التفاصيل.
إذا كنت جديدا على جوجل الغيمة، قد نتساءل ما gs://
وسائل URL. هم عناوين URL للملفات المخزنة على جوجل سحابة التخزين (GCS). إذا قمت بإجراء الملفات على GCS الجمهور أو مصادقة العميل الخاص بك ، ويمكن صنع نموذج قراءة تلك الملفات على غرار الملفات المحلية.
ومع ذلك ، لا تحتاج إلى الاحتفاظ بصورك على Google Cloud لاستخدام Model Maker. يمكنك استخدام مسار محلي في ملف CSV وسيعمل Model Maker.
بداية سريعة
هناك ست خطوات لتدريب نموذج اكتشاف الكائن:
الخطوة 1. اختر بنية نموذجية لاكتشاف الكائن.
يستخدم هذا البرنامج التعليمي نموذج EfficientDet-Lite0. EfficientDet لايت [0-4] أسرة مكونة من نماذج الكشف عن وجوه المحمول / صديقة للتقنيات عمليات المستمدة من EfficientDet الهندسة المعمارية.
فيما يلي أداء كل طراز من نماذج EfficientDet-Lite مقارنة ببعضها البعض.
العمارة النموذجية | الحجم (ميغا بايت) * | الكمون (مللي ثانية) ** | متوسط الدقة *** |
---|---|---|---|
EfficientDet-Lite0 | 4.4 | 37 | 25.69٪ |
برنامج EfficientDet-Lite1 | 5.8 | 49 | 30.55٪ |
برنامج EfficientDet-Lite2 | 7.2 | 69 | 33.97٪ |
برنامج EfficientDet-Lite3 | 11.4 | 116 | 37.70٪ |
برنامج EfficientDet-Lite4 | 19.9 | 260 | 41.96٪ |
* حجم عدد صحيح من النماذج الكمية.
** تم قياس وقت الاستجابة على هاتف Pixel 4 باستخدام 4 خيوط على وحدة المعالجة المركزية.
*** متوسط الدقة هو الخريطة (متوسط الدقة) في مجموعة بيانات التحقق من صحة COCO 2017.
spec = model_spec.get('efficientdet_lite0')
الخطوة 2. قم بتحميل مجموعة البيانات.
سيأخذ Model Maker بيانات الإدخال بتنسيق CSV. استخدام object_detector.DataLoader.from_csv
طريقة لتحميل مجموعة البيانات وتقسيمها إلى التدريب، والتحقق من صحة واختبار الصور.
- صور التدريب: تستخدم هذه الصور لتدريب نموذج الكشف عن الأشياء للتعرف على مكونات السلطة.
- صور التحقق من الصحة: هذه هي الصور التي لم يرها النموذج أثناء عملية التدريب. عليك استخدامها لتحديد متى يجب التوقف عن التدريب، لتجنب overfitting .
- صور الاختبار: تستخدم هذه الصور لتقييم أداء النموذج النهائي.
يمكنك تحميل ملف CSV مباشرة من Google Cloud Storage ، لكنك لست بحاجة إلى الاحتفاظ بصورك على Google Cloud لاستخدام Model Maker. يمكنك تحديد ملف CSV محلي على جهاز الكمبيوتر الخاص بك ، وسيعمل Model Maker بشكل جيد.
train_data, validation_data, test_data = object_detector.DataLoader.from_csv('gs://cloud-ml-data/img/openimage/csv/salads_ml_use.csv')
الخطوة الثالثة. تدريب نموذج TensorFlow باستخدام بيانات التدريب.
- وEfficientDet-Lite0 الاستخدامات نموذج
epochs = 50
افتراضيا، مما يعني أنه سوف تذهب من خلال مجموعة البيانات التدريب 50 مرة. يمكنك إلقاء نظرة على دقة التحقق من الصحة أثناء التدريب والتوقف مبكرًا لتجنب فرط التجهيز. - مجموعة
batch_size = 8
هنا لذلك سوف نرى ان الامر يستغرق 21 خطوات للذهاب من خلال الصور 175 في مجموعة البيانات التدريب. - مجموعة
train_whole_model=True
لصقل نموذج كامل بدلا من مجرد تدريب طبقة رأس لتحسين دقة. المفاضلة هي أن تدريب النموذج قد يستغرق وقتًا أطول.
model = object_detector.create(train_data, model_spec=spec, batch_size=8, train_whole_model=True, validation_data=validation_data)
Epoch 1/50 21/21 [==============================] - 48s 455ms/step - det_loss: 1.7625 - cls_loss: 1.1351 - box_loss: 0.0125 - reg_l2_loss: 0.0635 - loss: 1.8260 - learning_rate: 0.0090 - gradient_norm: 0.7406 - val_det_loss: 1.6586 - val_cls_loss: 1.1076 - val_box_loss: 0.0110 - val_reg_l2_loss: 0.0635 - val_loss: 1.7221 Epoch 2/50 21/21 [==============================] - 9s 452ms/step - det_loss: 1.6224 - cls_loss: 1.0936 - box_loss: 0.0106 - reg_l2_loss: 0.0635 - loss: 1.6860 - learning_rate: 0.0100 - gradient_norm: 0.8392 - val_det_loss: 1.5282 - val_cls_loss: 1.0231 - val_box_loss: 0.0101 - val_reg_l2_loss: 0.0635 - val_loss: 1.5917 Epoch 3/50 21/21 [==============================] - 11s 566ms/step - det_loss: 1.4834 - cls_loss: 1.0031 - box_loss: 0.0096 - reg_l2_loss: 0.0635 - loss: 1.5469 - learning_rate: 0.0099 - gradient_norm: 1.4031 - val_det_loss: 1.7022 - val_cls_loss: 1.2259 - val_box_loss: 0.0095 - val_reg_l2_loss: 0.0636 - val_loss: 1.7657 Epoch 4/50 21/21 [==============================] - 11s 541ms/step - det_loss: 1.2898 - cls_loss: 0.8467 - box_loss: 0.0089 - reg_l2_loss: 0.0636 - loss: 1.3534 - learning_rate: 0.0099 - gradient_norm: 1.8163 - val_det_loss: 1.5550 - val_cls_loss: 1.1171 - val_box_loss: 0.0088 - val_reg_l2_loss: 0.0636 - val_loss: 1.6185 Epoch 5/50 21/21 [==============================] - 20s 970ms/step - det_loss: 1.1272 - cls_loss: 0.7315 - box_loss: 0.0079 - reg_l2_loss: 0.0636 - loss: 1.1908 - learning_rate: 0.0098 - gradient_norm: 1.7106 - val_det_loss: 1.4876 - val_cls_loss: 1.0551 - val_box_loss: 0.0087 - val_reg_l2_loss: 0.0636 - val_loss: 1.5512 Epoch 6/50 21/21 [==============================] - 7s 364ms/step - det_loss: 1.0534 - cls_loss: 0.6823 - box_loss: 0.0074 - reg_l2_loss: 0.0636 - loss: 1.1170 - learning_rate: 0.0097 - gradient_norm: 1.8554 - val_det_loss: 1.1807 - val_cls_loss: 0.7640 - val_box_loss: 0.0083 - val_reg_l2_loss: 0.0636 - val_loss: 1.2443 Epoch 7/50 21/21 [==============================] - 12s 602ms/step - det_loss: 1.0153 - cls_loss: 0.6592 - box_loss: 0.0071 - reg_l2_loss: 0.0636 - loss: 1.0789 - learning_rate: 0.0096 - gradient_norm: 1.8227 - val_det_loss: 1.0752 - val_cls_loss: 0.6828 - val_box_loss: 0.0078 - val_reg_l2_loss: 0.0636 - val_loss: 1.1388 Epoch 8/50 21/21 [==============================] - 11s 519ms/step - det_loss: 0.9751 - cls_loss: 0.6304 - box_loss: 0.0069 - reg_l2_loss: 0.0636 - loss: 1.0387 - learning_rate: 0.0094 - gradient_norm: 1.7939 - val_det_loss: 1.0385 - val_cls_loss: 0.6612 - val_box_loss: 0.0075 - val_reg_l2_loss: 0.0636 - val_loss: 1.1021 Epoch 9/50 21/21 [==============================] - 12s 601ms/step - det_loss: 0.8982 - cls_loss: 0.5847 - box_loss: 0.0063 - reg_l2_loss: 0.0636 - loss: 0.9618 - learning_rate: 0.0093 - gradient_norm: 1.8244 - val_det_loss: 1.0142 - val_cls_loss: 0.6526 - val_box_loss: 0.0072 - val_reg_l2_loss: 0.0636 - val_loss: 1.0778 Epoch 10/50 21/21 [==============================] - 14s 691ms/step - det_loss: 0.9462 - cls_loss: 0.5986 - box_loss: 0.0070 - reg_l2_loss: 0.0636 - loss: 1.0098 - learning_rate: 0.0091 - gradient_norm: 1.9298 - val_det_loss: 0.9879 - val_cls_loss: 0.6335 - val_box_loss: 0.0071 - val_reg_l2_loss: 0.0636 - val_loss: 1.0515 Epoch 11/50 21/21 [==============================] - 11s 519ms/step - det_loss: 0.8871 - cls_loss: 0.5824 - box_loss: 0.0061 - reg_l2_loss: 0.0636 - loss: 0.9507 - learning_rate: 0.0089 - gradient_norm: 1.9898 - val_det_loss: 1.0021 - val_cls_loss: 0.6509 - val_box_loss: 0.0070 - val_reg_l2_loss: 0.0636 - val_loss: 1.0658 Epoch 12/50 21/21 [==============================] - 11s 549ms/step - det_loss: 0.8640 - cls_loss: 0.5624 - box_loss: 0.0060 - reg_l2_loss: 0.0636 - loss: 0.9277 - learning_rate: 0.0087 - gradient_norm: 1.9360 - val_det_loss: 1.0265 - val_cls_loss: 0.6728 - val_box_loss: 0.0071 - val_reg_l2_loss: 0.0636 - val_loss: 1.0901 Epoch 13/50 21/21 [==============================] - 11s 523ms/step - det_loss: 0.8405 - cls_loss: 0.5484 - box_loss: 0.0058 - reg_l2_loss: 0.0636 - loss: 0.9042 - learning_rate: 0.0085 - gradient_norm: 2.1855 - val_det_loss: 1.0291 - val_cls_loss: 0.6903 - val_box_loss: 0.0068 - val_reg_l2_loss: 0.0636 - val_loss: 1.0927 Epoch 14/50 21/21 [==============================] - 12s 572ms/step - det_loss: 0.8082 - cls_loss: 0.5297 - box_loss: 0.0056 - reg_l2_loss: 0.0636 - loss: 0.8718 - learning_rate: 0.0082 - gradient_norm: 1.9138 - val_det_loss: 0.9104 - val_cls_loss: 0.5838 - val_box_loss: 0.0065 - val_reg_l2_loss: 0.0636 - val_loss: 0.9740 Epoch 15/50 21/21 [==============================] - 14s 696ms/step - det_loss: 0.8106 - cls_loss: 0.5221 - box_loss: 0.0058 - reg_l2_loss: 0.0636 - loss: 0.8743 - learning_rate: 0.0080 - gradient_norm: 2.0386 - val_det_loss: 0.9510 - val_cls_loss: 0.6047 - val_box_loss: 0.0069 - val_reg_l2_loss: 0.0636 - val_loss: 1.0146 Epoch 16/50 21/21 [==============================] - 10s 474ms/step - det_loss: 0.7988 - cls_loss: 0.5177 - box_loss: 0.0056 - reg_l2_loss: 0.0636 - loss: 0.8624 - learning_rate: 0.0077 - gradient_norm: 2.1009 - val_det_loss: 0.9642 - val_cls_loss: 0.6307 - val_box_loss: 0.0067 - val_reg_l2_loss: 0.0637 - val_loss: 1.0278 Epoch 17/50 21/21 [==============================] - 12s 601ms/step - det_loss: 0.8057 - cls_loss: 0.5239 - box_loss: 0.0056 - reg_l2_loss: 0.0637 - loss: 0.8694 - learning_rate: 0.0075 - gradient_norm: 2.1718 - val_det_loss: 0.9152 - val_cls_loss: 0.5938 - val_box_loss: 0.0064 - val_reg_l2_loss: 0.0637 - val_loss: 0.9789 Epoch 18/50 21/21 [==============================] - 12s 609ms/step - det_loss: 0.7801 - cls_loss: 0.4993 - box_loss: 0.0056 - reg_l2_loss: 0.0637 - loss: 0.8437 - learning_rate: 0.0072 - gradient_norm: 2.1518 - val_det_loss: 0.9262 - val_cls_loss: 0.5967 - val_box_loss: 0.0066 - val_reg_l2_loss: 0.0637 - val_loss: 0.9899 Epoch 19/50 21/21 [==============================] - 12s 614ms/step - det_loss: 0.7595 - cls_loss: 0.4977 - box_loss: 0.0052 - reg_l2_loss: 0.0637 - loss: 0.8232 - learning_rate: 0.0069 - gradient_norm: 2.3707 - val_det_loss: 0.8870 - val_cls_loss: 0.5698 - val_box_loss: 0.0063 - val_reg_l2_loss: 0.0637 - val_loss: 0.9506 Epoch 20/50 21/21 [==============================] - 13s 632ms/step - det_loss: 0.7826 - cls_loss: 0.5115 - box_loss: 0.0054 - reg_l2_loss: 0.0637 - loss: 0.8463 - learning_rate: 0.0066 - gradient_norm: 2.4091 - val_det_loss: 0.8975 - val_cls_loss: 0.5811 - val_box_loss: 0.0063 - val_reg_l2_loss: 0.0637 - val_loss: 0.9611 Epoch 21/50 21/21 [==============================] - 9s 454ms/step - det_loss: 0.7434 - cls_loss: 0.4903 - box_loss: 0.0051 - reg_l2_loss: 0.0637 - loss: 0.8070 - learning_rate: 0.0063 - gradient_norm: 2.3592 - val_det_loss: 0.8526 - val_cls_loss: 0.5450 - val_box_loss: 0.0062 - val_reg_l2_loss: 0.0637 - val_loss: 0.9163 Epoch 22/50 21/21 [==============================] - 12s 600ms/step - det_loss: 0.7349 - cls_loss: 0.4803 - box_loss: 0.0051 - reg_l2_loss: 0.0637 - loss: 0.7986 - learning_rate: 0.0060 - gradient_norm: 2.3296 - val_det_loss: 0.8977 - val_cls_loss: 0.5602 - val_box_loss: 0.0068 - val_reg_l2_loss: 0.0637 - val_loss: 0.9614 Epoch 23/50 21/21 [==============================] - 12s 591ms/step - det_loss: 0.7190 - cls_loss: 0.4670 - box_loss: 0.0050 - reg_l2_loss: 0.0637 - loss: 0.7826 - learning_rate: 0.0056 - gradient_norm: 2.2218 - val_det_loss: 0.8986 - val_cls_loss: 0.5744 - val_box_loss: 0.0065 - val_reg_l2_loss: 0.0637 - val_loss: 0.9623 Epoch 24/50 21/21 [==============================] - 11s 553ms/step - det_loss: 0.7025 - cls_loss: 0.4588 - box_loss: 0.0049 - reg_l2_loss: 0.0637 - loss: 0.7661 - learning_rate: 0.0053 - gradient_norm: 2.4710 - val_det_loss: 0.8835 - val_cls_loss: 0.5701 - val_box_loss: 0.0063 - val_reg_l2_loss: 0.0637 - val_loss: 0.9472 Epoch 25/50 21/21 [==============================] - 14s 700ms/step - det_loss: 0.7462 - cls_loss: 0.4776 - box_loss: 0.0054 - reg_l2_loss: 0.0637 - loss: 0.8099 - learning_rate: 0.0050 - gradient_norm: 2.5728 - val_det_loss: 0.8594 - val_cls_loss: 0.5605 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.9231 Epoch 26/50 21/21 [==============================] - 10s 482ms/step - det_loss: 0.7219 - cls_loss: 0.4731 - box_loss: 0.0050 - reg_l2_loss: 0.0637 - loss: 0.7856 - learning_rate: 0.0047 - gradient_norm: 2.4891 - val_det_loss: 0.8701 - val_cls_loss: 0.5630 - val_box_loss: 0.0061 - val_reg_l2_loss: 0.0637 - val_loss: 0.9338 Epoch 27/50 21/21 [==============================] - 11s 543ms/step - det_loss: 0.6914 - cls_loss: 0.4505 - box_loss: 0.0048 - reg_l2_loss: 0.0637 - loss: 0.7551 - learning_rate: 0.0044 - gradient_norm: 2.3125 - val_det_loss: 0.8986 - val_cls_loss: 0.5850 - val_box_loss: 0.0063 - val_reg_l2_loss: 0.0637 - val_loss: 0.9623 Epoch 28/50 21/21 [==============================] - 13s 630ms/step - det_loss: 0.7018 - cls_loss: 0.4516 - box_loss: 0.0050 - reg_l2_loss: 0.0637 - loss: 0.7655 - learning_rate: 0.0040 - gradient_norm: 2.7033 - val_det_loss: 0.8693 - val_cls_loss: 0.5590 - val_box_loss: 0.0062 - val_reg_l2_loss: 0.0637 - val_loss: 0.9330 Epoch 29/50 21/21 [==============================] - 11s 529ms/step - det_loss: 0.6712 - cls_loss: 0.4463 - box_loss: 0.0045 - reg_l2_loss: 0.0637 - loss: 0.7349 - learning_rate: 0.0037 - gradient_norm: 2.3739 - val_det_loss: 0.8901 - val_cls_loss: 0.5790 - val_box_loss: 0.0062 - val_reg_l2_loss: 0.0637 - val_loss: 0.9538 Epoch 30/50 21/21 [==============================] - 15s 735ms/step - det_loss: 0.6619 - cls_loss: 0.4346 - box_loss: 0.0045 - reg_l2_loss: 0.0637 - loss: 0.7256 - learning_rate: 0.0034 - gradient_norm: 2.3940 - val_det_loss: 0.8855 - val_cls_loss: 0.5565 - val_box_loss: 0.0066 - val_reg_l2_loss: 0.0637 - val_loss: 0.9492 Epoch 31/50 21/21 [==============================] - 10s 499ms/step - det_loss: 0.6752 - cls_loss: 0.4406 - box_loss: 0.0047 - reg_l2_loss: 0.0637 - loss: 0.7389 - learning_rate: 0.0031 - gradient_norm: 2.6153 - val_det_loss: 0.8728 - val_cls_loss: 0.5536 - val_box_loss: 0.0064 - val_reg_l2_loss: 0.0637 - val_loss: 0.9365 Epoch 32/50 21/21 [==============================] - 11s 547ms/step - det_loss: 0.6605 - cls_loss: 0.4393 - box_loss: 0.0044 - reg_l2_loss: 0.0637 - loss: 0.7242 - learning_rate: 0.0028 - gradient_norm: 2.2926 - val_det_loss: 0.8503 - val_cls_loss: 0.5434 - val_box_loss: 0.0061 - val_reg_l2_loss: 0.0637 - val_loss: 0.9140 Epoch 33/50 21/21 [==============================] - 12s 573ms/step - det_loss: 0.6700 - cls_loss: 0.4388 - box_loss: 0.0046 - reg_l2_loss: 0.0637 - loss: 0.7337 - learning_rate: 0.0025 - gradient_norm: 2.4563 - val_det_loss: 0.8520 - val_cls_loss: 0.5442 - val_box_loss: 0.0062 - val_reg_l2_loss: 0.0637 - val_loss: 0.9157 Epoch 34/50 21/21 [==============================] - 12s 596ms/step - det_loss: 0.6754 - cls_loss: 0.4314 - box_loss: 0.0049 - reg_l2_loss: 0.0637 - loss: 0.7391 - learning_rate: 0.0023 - gradient_norm: 2.5527 - val_det_loss: 0.8223 - val_cls_loss: 0.5216 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8860 Epoch 35/50 21/21 [==============================] - 13s 623ms/step - det_loss: 0.6499 - cls_loss: 0.4243 - box_loss: 0.0045 - reg_l2_loss: 0.0637 - loss: 0.7136 - learning_rate: 0.0020 - gradient_norm: 2.3485 - val_det_loss: 0.8405 - val_cls_loss: 0.5408 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.9042 Epoch 36/50 21/21 [==============================] - 12s 574ms/step - det_loss: 0.6290 - cls_loss: 0.4186 - box_loss: 0.0042 - reg_l2_loss: 0.0637 - loss: 0.6927 - learning_rate: 0.0018 - gradient_norm: 2.3488 - val_det_loss: 0.8436 - val_cls_loss: 0.5452 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.9073 Epoch 37/50 21/21 [==============================] - 13s 631ms/step - det_loss: 0.6446 - cls_loss: 0.4157 - box_loss: 0.0046 - reg_l2_loss: 0.0637 - loss: 0.7083 - learning_rate: 0.0015 - gradient_norm: 2.3455 - val_det_loss: 0.8361 - val_cls_loss: 0.5410 - val_box_loss: 0.0059 - val_reg_l2_loss: 0.0637 - val_loss: 0.8998 Epoch 38/50 21/21 [==============================] - 12s 595ms/step - det_loss: 0.6640 - cls_loss: 0.4317 - box_loss: 0.0046 - reg_l2_loss: 0.0637 - loss: 0.7277 - learning_rate: 0.0013 - gradient_norm: 2.5982 - val_det_loss: 0.8390 - val_cls_loss: 0.5402 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.9027 Epoch 39/50 21/21 [==============================] - 13s 623ms/step - det_loss: 0.6280 - cls_loss: 0.4117 - box_loss: 0.0043 - reg_l2_loss: 0.0637 - loss: 0.6916 - learning_rate: 0.0011 - gradient_norm: 2.3441 - val_det_loss: 0.8396 - val_cls_loss: 0.5415 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.9033 Epoch 40/50 21/21 [==============================] - 15s 721ms/step - det_loss: 0.6398 - cls_loss: 0.4240 - box_loss: 0.0043 - reg_l2_loss: 0.0637 - loss: 0.7035 - learning_rate: 9.0029e-04 - gradient_norm: 2.6224 - val_det_loss: 0.8326 - val_cls_loss: 0.5328 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8963 Epoch 41/50 21/21 [==============================] - 10s 484ms/step - det_loss: 0.6361 - cls_loss: 0.4179 - box_loss: 0.0044 - reg_l2_loss: 0.0637 - loss: 0.6998 - learning_rate: 7.2543e-04 - gradient_norm: 2.4665 - val_det_loss: 0.8264 - val_cls_loss: 0.5282 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8901 Epoch 42/50 21/21 [==============================] - 13s 654ms/step - det_loss: 0.6565 - cls_loss: 0.4141 - box_loss: 0.0048 - reg_l2_loss: 0.0637 - loss: 0.7202 - learning_rate: 5.6814e-04 - gradient_norm: 2.5693 - val_det_loss: 0.8190 - val_cls_loss: 0.5205 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8827 Epoch 43/50 21/21 [==============================] - 12s 577ms/step - det_loss: 0.6390 - cls_loss: 0.4156 - box_loss: 0.0045 - reg_l2_loss: 0.0637 - loss: 0.7027 - learning_rate: 4.2906e-04 - gradient_norm: 2.6238 - val_det_loss: 0.8214 - val_cls_loss: 0.5218 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8851 Epoch 44/50 21/21 [==============================] - 11s 543ms/step - det_loss: 0.6325 - cls_loss: 0.4210 - box_loss: 0.0042 - reg_l2_loss: 0.0637 - loss: 0.6962 - learning_rate: 3.0876e-04 - gradient_norm: 2.5348 - val_det_loss: 0.8233 - val_cls_loss: 0.5214 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8870 Epoch 45/50 21/21 [==============================] - 14s 712ms/step - det_loss: 0.6318 - cls_loss: 0.4115 - box_loss: 0.0044 - reg_l2_loss: 0.0637 - loss: 0.6955 - learning_rate: 2.0774e-04 - gradient_norm: 2.3124 - val_det_loss: 0.8264 - val_cls_loss: 0.5243 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8901 Epoch 46/50 21/21 [==============================] - 11s 518ms/step - det_loss: 0.6508 - cls_loss: 0.4240 - box_loss: 0.0045 - reg_l2_loss: 0.0637 - loss: 0.7145 - learning_rate: 1.2641e-04 - gradient_norm: 2.5532 - val_det_loss: 0.8275 - val_cls_loss: 0.5252 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8912 Epoch 47/50 21/21 [==============================] - 13s 630ms/step - det_loss: 0.6284 - cls_loss: 0.4146 - box_loss: 0.0043 - reg_l2_loss: 0.0637 - loss: 0.6921 - learning_rate: 6.5107e-05 - gradient_norm: 2.5420 - val_det_loss: 0.8269 - val_cls_loss: 0.5248 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8906 Epoch 48/50 21/21 [==============================] - 11s 539ms/step - det_loss: 0.6273 - cls_loss: 0.4124 - box_loss: 0.0043 - reg_l2_loss: 0.0637 - loss: 0.6910 - learning_rate: 2.4083e-05 - gradient_norm: 2.4386 - val_det_loss: 0.8249 - val_cls_loss: 0.5233 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8886 Epoch 49/50 21/21 [==============================] - 13s 627ms/step - det_loss: 0.6412 - cls_loss: 0.4040 - box_loss: 0.0047 - reg_l2_loss: 0.0637 - loss: 0.7049 - learning_rate: 3.5074e-06 - gradient_norm: 2.4736 - val_det_loss: 0.8231 - val_cls_loss: 0.5223 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8868 Epoch 50/50 21/21 [==============================] - 15s 721ms/step - det_loss: 0.6425 - cls_loss: 0.4205 - box_loss: 0.0044 - reg_l2_loss: 0.0637 - loss: 0.7062 - learning_rate: 3.4629e-06 - gradient_norm: 2.4394 - val_det_loss: 0.8218 - val_cls_loss: 0.5215 - val_box_loss: 0.0060 - val_reg_l2_loss: 0.0637 - val_loss: 0.8855
الخطوة 4. قم بتقييم النموذج باستخدام بيانات الاختبار.
بعد تدريب نموذج اكتشاف الكائن باستخدام الصور الموجودة في مجموعة بيانات التدريب ، استخدم الصور الـ 25 المتبقية في مجموعة بيانات الاختبار لتقييم كيفية أداء النموذج مقابل البيانات الجديدة التي لم يسبق لها مثيل من قبل.
نظرًا لأن الحجم الافتراضي للدفعة هو 64 ، فسوف يستغرق الأمر خطوة واحدة لتصفح 25 صورة في مجموعة بيانات الاختبار.
مقاييس التقييم هي نفس COCO .
model.evaluate(test_data)
1/1 [==============================] - 7s 7s/step {'AP': 0.23457745, 'AP50': 0.38357082, 'AP75': 0.25038385, 'APs': -1.0, 'APm': 0.43640736, 'APl': 0.234312, 'ARmax1': 0.1664717, 'ARmax10': 0.33019942, 'ARmax100': 0.37375557, 'ARs': -1.0, 'ARm': 0.5416667, 'ARl': 0.37200606, 'AP_/Baked Goods': 0.07057314, 'AP_/Salad': 0.53682375, 'AP_/Cheese': 0.20270571, 'AP_/Seafood': 0.08837805, 'AP_/Tomato': 0.2744066}
الخطوة 5. تصدير كنموذج TensorFlow Lite.
قم بتصدير نموذج اكتشاف الكائنات المدربة إلى تنسيق TensorFlow Lite عن طريق تحديد المجلد الذي تريد تصدير النموذج الكمي إليه. تقنية التكميم الافتراضية بعد التدريب هي تكميم عدد صحيح كامل.
model.export(export_dir='.')
2021-12-02 12:28:49.181926: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. 2021-12-02 12:29:09.650356: W tensorflow/core/common_runtime/graph_constructor.cc:803] Node 'resample_p7/PartitionedCall' has 1 outputs but the _output_shapes attribute specifies shapes for 3 outputs. Output shapes may be inaccurate. 2021-12-02 12:29:20.773150: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format. 2021-12-02 12:29:20.773204: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency. 2021-12-02 12:29:20.773213: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:372] Ignored change_concat_input_ranges. fully_quantize: 0, inference_type: 6, input_inference_type: 3, output_inference_type: 0
الخطوة 6. قم بتقييم نموذج TensorFlow Lite.
يمكن أن تؤثر عدة عوامل على دقة النموذج عند التصدير إلى TFLite:
- تكميم يساعد على تقليص حجم النموذج من قبل 4 مرات على حساب بعض الانخفاض دقة.
- الأصلي الاستخدامات نموذج TensorFlow لكل فئة غير ماكس تثبيط (NMS) لمرحلة ما بعد المعالجة، في حين يستخدم نموذج TFLite NMS العالمية هذا بكثير أسرع ولكن أقل دقة. ينتج Keras 100 اكتشاف كحد أقصى بينما ينتج tflite 25 اكتشافًا بحد أقصى.
لذلك سيتعين عليك تقييم نموذج TFLite المُصدَّر ومقارنة دقته بنموذج TensorFlow الأصلي.
model.evaluate_tflite('model.tflite', test_data)
25/25 [==============================] - 60s 2s/step {'AP': 0.22160971, 'AP50': 0.36216733, 'AP75': 0.24560829, 'APs': -1.0, 'APm': 0.52389216, 'APl': 0.21991307, 'ARmax1': 0.16296011, 'ARmax10': 0.2850546, 'ARmax100': 0.29889038, 'ARs': -1.0, 'ARm': 0.6166667, 'ARl': 0.29492828, 'AP_/Baked Goods': 0.06930693, 'AP_/Salad': 0.5064266, 'AP_/Cheese': 0.1904948, 'AP_/Seafood': 0.074257426, 'AP_/Tomato': 0.26756287}
يمكنك تنزيل ملف نموذج TensorFlow Lite باستخدام الشريط الجانبي الأيسر من Colab. انقر بزر الماوس الأيمن على model.tflite
الملف واختيار Download
لتحميل البرنامج على جهاز الكمبيوتر المحلي.
هذا النموذج يمكن أن تكون متكاملة إلى الروبوت أو تطبيقات iOS باستخدام API ObjectDetector من مكتبة المهام لايت TensorFlow .
رؤية كائن TFLite التطبيق عينة الكشف عن مزيد من التفاصيل حول كيفية استخدام هذا النموذج في التطبيق العمل.
(اختياري) اختبر نموذج TFLite على صورتك
يمكنك اختبار نموذج TFLite المدرب باستخدام صور من الإنترنت.
- استبدال
INPUT_IMAGE_URL
أدناه مع صورتك المدخلات المطلوبة. - ضبط
DETECTION_THRESHOLD
لتغيير حساسية النموذج. يعني الحد الأدنى أن النموذج سوف يلتقط المزيد من الكائنات ولكن سيكون هناك أيضًا المزيد من الاكتشاف الخاطئ. وفي الوقت نفسه ، تعني العتبة الأعلى أن النموذج لن يلتقط سوى الكائنات التي اكتشفها بثقة.
على الرغم من أنه يتطلب بعض التعليمات البرمجية المعيارية لتشغيل النموذج في Python في هذه اللحظة ، إلا أن دمج النموذج في تطبيق جوال لا يتطلب سوى بضعة أسطر من التعليمات البرمجية.
قم بتحميل نموذج TFLite المدرب وحدد بعض وظائف التصور
import cv2
from PIL import Image
model_path = 'model.tflite'
# Load the labels into a list
classes = ['???'] * model.model_spec.config.num_classes
label_map = model.model_spec.config.label_map
for label_id, label_name in label_map.as_dict().items():
classes[label_id-1] = label_name
# Define a list of colors for visualization
COLORS = np.random.randint(0, 255, size=(len(classes), 3), dtype=np.uint8)
def preprocess_image(image_path, input_size):
"""Preprocess the input image to feed to the TFLite model"""
img = tf.io.read_file(image_path)
img = tf.io.decode_image(img, channels=3)
img = tf.image.convert_image_dtype(img, tf.uint8)
original_image = img
resized_img = tf.image.resize(img, input_size)
resized_img = resized_img[tf.newaxis, :]
resized_img = tf.cast(resized_img, dtype=tf.uint8)
return resized_img, original_image
def detect_objects(interpreter, image, threshold):
"""Returns a list of detection results, each a dictionary of object info."""
signature_fn = interpreter.get_signature_runner()
# Feed the input image to the model
output = signature_fn(images=image)
# Get all outputs from the model
count = int(np.squeeze(output['output_0']))
scores = np.squeeze(output['output_1'])
classes = np.squeeze(output['output_2'])
boxes = np.squeeze(output['output_3'])
results = []
for i in range(count):
if scores[i] >= threshold:
result = {
'bounding_box': boxes[i],
'class_id': classes[i],
'score': scores[i]
}
results.append(result)
return results
def run_odt_and_draw_results(image_path, interpreter, threshold=0.5):
"""Run object detection on the input image and draw the detection results"""
# Load the input shape required by the model
_, input_height, input_width, _ = interpreter.get_input_details()[0]['shape']
# Load the input image and preprocess it
preprocessed_image, original_image = preprocess_image(
image_path,
(input_height, input_width)
)
# Run object detection on the input image
results = detect_objects(interpreter, preprocessed_image, threshold=threshold)
# Plot the detection results on the input image
original_image_np = original_image.numpy().astype(np.uint8)
for obj in results:
# Convert the object bounding box from relative coordinates to absolute
# coordinates based on the original image resolution
ymin, xmin, ymax, xmax = obj['bounding_box']
xmin = int(xmin * original_image_np.shape[1])
xmax = int(xmax * original_image_np.shape[1])
ymin = int(ymin * original_image_np.shape[0])
ymax = int(ymax * original_image_np.shape[0])
# Find the class index of the current object
class_id = int(obj['class_id'])
# Draw the bounding box and label on the image
color = [int(c) for c in COLORS[class_id]]
cv2.rectangle(original_image_np, (xmin, ymin), (xmax, ymax), color, 2)
# Make adjustments to make the label visible for all objects
y = ymin - 15 if ymin - 15 > 15 else ymin + 15
label = "{}: {:.0f}%".format(classes[class_id], obj['score'] * 100)
cv2.putText(original_image_np, label, (xmin, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
# Return the final image
original_uint8 = original_image_np.astype(np.uint8)
return original_uint8
قم بتشغيل اكتشاف الكائن وإظهار نتائج الكشف
INPUT_IMAGE_URL = "https://storage.googleapis.com/cloud-ml-data/img/openimage/3/2520/3916261642_0a504acd60_o.jpg"
DETECTION_THRESHOLD = 0.3
TEMP_FILE = '/tmp/image.png'
!wget -q -O $TEMP_FILE $INPUT_IMAGE_URL
im = Image.open(TEMP_FILE)
im.thumbnail((512, 512), Image.ANTIALIAS)
im.save(TEMP_FILE, 'PNG')
# Load the TFLite model
interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()
# Run inference and draw detection result on the local copy of the original file
detection_result_image = run_odt_and_draw_results(
TEMP_FILE,
interpreter,
threshold=DETECTION_THRESHOLD
)
# Show the detection result
Image.fromarray(detection_result_image)
(اختياري) تجميع لـ Edge TPU
الآن أن لديك نموذج EfficientDet لايت الكم، فمن الممكن لتجميع ونشر ل كورال EdgeTPU .
الخطوة الأولى. قم بتثبيت برنامج التحويل البرمجي EdgeTPU
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
sudo apt-get update
sudo apt-get install edgetpu-compiler
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2537 100 2537 0 0 130k 0 --:--:-- --:--:-- --:--:-- 130k OK deb https://packages.cloud.google.com/apt coral-edgetpu-stable main Hit:1 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic InRelease Hit:2 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates InRelease Hit:3 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-backports InRelease Hit:4 https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64 InRelease Get:5 https://nvidia.github.io/nvidia-container-runtime/ubuntu18.04/amd64 InRelease [1481 B] Get:6 https://nvidia.github.io/nvidia-docker/ubuntu18.04/amd64 InRelease [1474 B] Ign:7 http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 InRelease Hit:8 http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 Release Get:9 http://packages.cloud.google.com/apt google-cloud-logging-wheezy InRelease [5483 B] Hit:10 http://archive.canonical.com/ubuntu bionic InRelease Hit:11 http://security.ubuntu.com/ubuntu bionic-security InRelease Get:13 https://packages.cloud.google.com/apt coral-edgetpu-stable InRelease [6722 B] Get:14 https://packages.cloud.google.com/apt eip-cloud-bionic InRelease [5419 B] Ign:15 https://packages.cloud.google.com/apt coral-edgetpu-stable/main amd64 Packages Get:15 https://packages.cloud.google.com/apt coral-edgetpu-stable/main amd64 Packages [2327 B] Fetched 22.9 kB in 1s (18.7 kB/s) The following packages were automatically installed and are no longer required: linux-gcp-5.4-headers-5.4.0-1040 linux-gcp-5.4-headers-5.4.0-1043 linux-gcp-5.4-headers-5.4.0-1044 linux-gcp-5.4-headers-5.4.0-1049 linux-headers-5.4.0-1049-gcp linux-image-5.4.0-1049-gcp linux-modules-5.4.0-1044-gcp linux-modules-5.4.0-1049-gcp linux-modules-extra-5.4.0-1049-gcp Use 'sudo apt autoremove' to remove them. The following NEW packages will be installed: edgetpu-compiler 0 upgraded, 1 newly installed, 0 to remove and 119 not upgraded. Need to get 7913 kB of archives. After this operation, 31.2 MB of additional disk space will be used. Get:1 https://packages.cloud.google.com/apt coral-edgetpu-stable/main amd64 edgetpu-compiler amd64 16.0 [7913 kB] Fetched 7913 kB in 1s (11.2 MB/s) Selecting previously unselected package edgetpu-compiler. (Reading database ... 283192 files and directories currently installed.) Preparing to unpack .../edgetpu-compiler_16.0_amd64.deb ... Unpacking edgetpu-compiler (16.0) ... Setting up edgetpu-compiler (16.0) ... Processing triggers for libc-bin (2.27-3ubuntu1.2) ...
الخطوة 2. حدد عدد Edge TPUs ، Compile
وEdgeTPU ديه 8MB من SRAM للتخزين المؤقت PARAMATERS نموذج ( مزيد من المعلومات ). هذا يعني أنه بالنسبة للنماذج التي يزيد حجمها عن 8 ميجابايت ، سيتم زيادة وقت الاستدلال من أجل النقل عبر معلمات النموذج. طريقة واحدة لتجنب ذلك هو نموذج الأنابيب المتنوعة - تقسيم النموذج إلى أجزاء يمكن أن يكون لها EdgeTPU مخصصة. هذا يمكن أن يحسن بشكل ملحوظ الكمون.
يمكن استخدام الجدول أدناه كمرجع لعدد Edge TPUs المراد استخدامها - لن يتم تجميع الموديلات الأكبر لـ TPU واحد حيث أن الموترات الوسيطة لا يمكن وضعها في الذاكرة الموجودة على الشريحة.
العمارة النموذجية | الحد الأدنى من TPU | يوصى بها |
---|---|---|
EfficientDet-Lite0 | 1 | 1 |
برنامج EfficientDet-Lite1 | 1 | 1 |
برنامج EfficientDet-Lite2 | 1 | 2 |
برنامج EfficientDet-Lite3 | 2 | 2 |
برنامج EfficientDet-Lite4 | 2 | 3 |
NUMBER_OF_TPUS = 1
!edgetpu_compiler model.tflite --num_segments=$NUMBER_OF_TPUS
Edge TPU Compiler version 16.0.384591198 Started a compilation timeout timer of 180 seconds. Model compiled successfully in 4410 ms. Input model: model.tflite Input size: 4.24MiB Output model: model_edgetpu.tflite Output size: 5.61MiB On-chip memory used for caching model parameters: 4.24MiB On-chip memory remaining for caching model parameters: 3.27MiB Off-chip memory used for streaming uncached model parameters: 0.00B Number of Edge TPU subgraphs: 1 Total number of operations: 267 Operation log: model_edgetpu.log Model successfully compiled but not all operations are supported by the Edge TPU. A percentage of the model will instead run on the CPU, which is slower. If possible, consider updating your model to use only operations supported by the Edge TPU. For details, visit g.co/coral/model-reqs. Number of operations that will run on Edge TPU: 264 Number of operations that will run on CPU: 3 See the operation log file for individual operation details. Compilation child process completed within timeout period. Compilation succeeded!
الخطوة 3. تنزيل ، تشغيل النموذج
مع النموذج (النماذج) المترجمة ، يمكن الآن تشغيلها على EdgeTPU (s) لاكتشاف الكائنات. أولاً ، قم بتنزيل ملف نموذج TensorFlow Lite المترجم باستخدام الشريط الجانبي الأيسر من Colab. انقر بزر الماوس الأيمن على model_edgetpu.tflite
الملف واختيار Download
لتحميل البرنامج على جهاز الكمبيوتر المحلي.
الآن يمكنك تشغيل النموذج بالطريقة التي تفضلها. تتضمن أمثلة الاكتشاف ما يلي:
الاستخدام المتقدم
يغطي هذا القسم موضوعات الاستخدام المتقدمة مثل تعديل النموذج ومعلمات التدريب الفائقة.
قم بتحميل مجموعة البيانات
قم بتحميل بياناتك الخاصة
يمكنك تحميل مجموعة البيانات الخاصة بك للعمل من خلال هذا البرنامج التعليمي. قم بتحميل مجموعة البيانات الخاصة بك باستخدام الشريط الجانبي الأيسر في Colab.
إذا كنت تفضل عدم تحميل مجموعة البيانات الخاصة بك إلى سحابة، يمكنك أيضا تشغيل محليا المكتبة باتباع الدليل .
قم بتحميل بياناتك بتنسيق بيانات مختلف
كما يدعم المكتبة صانع نموذج لل object_detector.DataLoader.from_pascal_voc
طريقة لتحميل البيانات مع VOC باسكال الشكل. makesense.ai و LabelImg هي الأدوات التي يمكن أن تعليق على الصورة وحفظ الشروح على شكل ملفات XML في تنسيق البيانات VOC باسكال:
object_detector.DataLoader.from_pascal_voc(image_dir, annotations_dir, label_map={1: "person", 2: "notperson"})
تخصيص معلمات تشعبية نموذج EfficientDet
معلمات النموذج وخطوط التدريب التي يمكنك ضبطها هي:
-
model_dir
: موقع لحفظ الملفات نقطة تفتيش نموذجية. إذا لم يتم التعيين ، فسيتم استخدام دليل مؤقت. -
steps_per_execution
: عدد من الخطوات في تنفيذ التدريب. -
moving_average_decay
: تعويم. الاضمحلال لاستخدامه في الحفاظ على المتوسطات المتحركة للمعلمات المدربة. -
var_freeze_expr
: التعبير العادي لتعيين اسم بادئة من المتغيرات التي سيتم تجميد أي وسيلة المتبقية نفسها أثناء التدريب. أكثر تحديدا، واستخدامre.match(var_freeze_expr, variable_name)
في مصدر برنامج لتعيين المتغيرات إلى أن تجمد. -
tflite_max_detections
: صحيح، 25 افتراضيا. أقصى عدد لاكتشافات الإخراج في نموذج TFLite. -
strategy
: A مع تحديد سلسلة التي التوزيع الاستراتيجية لاستخدام. القيم المقبولة هي "tpu" و "gpus" و None. tpu 'يعني استخدام TPUStrategy. يعني 'gpus' استخدام MirroredStrategy لـ gpus متعدد. إذا لم يكن هناك شيء ، فاستخدم TF الافتراضي مع OneDeviceStrategy. -
tpu
: الغيمة TPU لاستخدامها في التدريب. يجب أن يكون هذا إما الاسم المستخدم عند إنشاء Cloud TPU ، أو grpc: //ip.address.of.tpu: 8470 url. -
use_xla
: استخدام XLA حتى لو الاستراتيجية ليست تبو. إذا كانت الإستراتيجية هي tpu ، فاستخدم XLA دائمًا ، وليس لهذه العلامة أي تأثير. -
profile
: تمكين الوضع الشخصي. -
debug
: تمكين وضع التصحيح.
ويظهر غيرها من المعالم التي يمكن تعديلها في hparams_config.py .
على سبيل المثال، يمكنك تعيين var_freeze_expr='efficientnet'
التي تجمد المتغيرات مع اسم البادئة efficientnet
(الافتراضي هو '(efficientnet|fpn_cells|resample_p6)'
). هذا يسمح للنموذج بتجميد المتغيرات غير القابلة للتدريب والحفاظ على قيمتها كما هي من خلال التدريب.
spec = model_spec.get('efficientdet_lite0')
spec.config.var_freeze_expr = 'efficientnet'
تغيير نموذج العمارة
يمكنك تغيير بنية النموذج عن طريق تغيير model_spec
. على سبيل المثال، تغيير model_spec
للنموذج EfficientDet-Lite4.
spec = model_spec.get('efficientdet_lite4')
اضبط معلمات التدريب الفائقة
و create
وظيفة هي وظيفة سائق أن يستخدم مكتبة صانع نموذج لخلق نماذج. و model_spec
تحدد المعلمة مواصفات النموذج. و object_detector.EfficientDetSpec
ويدعم الطبقة حاليا. و create
يتألف ظيفة الخطوات التالية:
- يخلق نموذجا للالكشف عن وجوه وفقا ل
model_spec
. - تدرب النموذج. يتم تعيين العهود الافتراضي وحجم دفعة تقصير من قبل
epochs
وbatch_size
المتغيرات فيmodel_spec
الكائن. يمكنك أيضا ضبط hyperparameters التدريب مثلepochs
وbatch_size
التي تؤثر على دقة النموذج. على سبيل المثال،
-
epochs
: صحيح، 50 افتراضيا. يمكن أن تحقق المزيد من العصور دقة أفضل ، ولكنها قد تؤدي إلى زيادة التجهيز. -
batch_size
: صحيح، 64 افتراضيا. عدد العينات المطلوب استخدامها في خطوة تدريبية واحدة. -
train_whole_model
: منطقية، الكاذبة افتراضيا. إذا كان هذا صحيحًا ، فقم بتدريب النموذج بأكمله. خلاف ذلك، وتدريب فقط الطبقات التي لا تتطابقvar_freeze_expr
.
على سبيل المثال ، يمكنك التدرب بفترات أقل وطبقة الرأس فقط. يمكنك زيادة عدد الحقب للحصول على نتائج أفضل.
model = object_detector.create(train_data, model_spec=spec, epochs=10, validation_data=validation_data)
تصدير إلى تنسيقات مختلفة
يمكن أن تكون تنسيقات التصدير واحدة أو قائمة مما يلي:
افتراضيا، وهي تصدر فقط ملف نموذج TensorFlow لايت تحتوي على نموذج بيانات التعريف بحيث يمكنك استخدامها لاحقا في تطبيق ML على الجهاز. يتم تضمين ملف التسمية في البيانات الوصفية.
في العديد من تطبيقات ML على الجهاز ، يعد حجم النموذج عاملاً مهمًا. لذلك ، يوصى بتحديد حجم النموذج لجعله أصغر ومن المحتمل أن يعمل بشكل أسرع. بالنسبة لنماذج EfficientDet-Lite ، يتم استخدام تكميم عدد صحيح كامل لتقدير النموذج افتراضيًا. يرجى الرجوع إلى تكميم بعد التدريب لمزيد من التفاصيل.
model.export(export_dir='.')
يمكنك أيضًا اختيار تصدير الملفات الأخرى المتعلقة بالنموذج لفحصها بشكل أفضل. على سبيل المثال ، تصدير كل من النموذج المحفوظ وملف الملصق على النحو التالي:
model.export(export_dir='.', export_format=[ExportFormat.SAVED_MODEL, ExportFormat.LABEL])
قم بتخصيص تكميم ما بعد التدريب على نموذج TensorFlow Lite
تكميم بعد التدريب هو أسلوب التحويل التي يمكن أن تقلل من حجم النموذج والكمون الاستدلال، مع تحسين سرعة وحدة المعالجة المركزية ومسرع الأجهزة الاستدلال، مع القليل من تدهور في دقة النموذج. وبالتالي ، يتم استخدامه على نطاق واسع لتحسين النموذج.
تطبق مكتبة Model Maker تقنية تكمية افتراضية بعد التدريب عند تصدير النموذج. إذا كنت ترغب في تخصيص تكميم بعد التدريب، الة لصنع نموذج يدعم عدة خيارات ما بعد التدريب تكميم باستخدام QuantizationConfig كذلك. لنأخذ تكميم float16 كمثال. أولاً ، حدد تكوين التقسيم.
config = QuantizationConfig.for_float16()
ثم نقوم بتصدير نموذج TensorFlow Lite بهذا التكوين.
model.export(export_dir='.', tflite_filename='model_fp16.tflite', quantization_config=config)
اقرأ أكثر
يمكنك أن تقرأ لنا وجوه الكشف سبيل المثال لمعرفة التفاصيل التقنية. لمزيد من المعلومات ، يرجى الرجوع إلى:
- TensorFlow لايت نموذج صانع دليل و مرجع API .
- مكتبة مهمة: ObjectDetector للنشر.
- الإشارة نهاية إلى نهاية تطبيقات: الروبوت ، دائرة الرقابة الداخلية ، و التوت PI .