إضافة بيانات وصفية إلى نماذج TensorFlow Lite

توفّر البيانات الوصفية TensorFlow Lite معيارًا لأوصاف النماذج. تشير رسالة الأشكال البيانية تعد بيانات التعريف مصدرًا مهمًا للمعرفة حول ما يفعله النموذج معلومات الإدخال / الإخراج تتكون بيانات التعريف من

جميع نماذج الصور المنشورة على Kaggle تم تعبئة النماذج بـ بيانات التعريف.

نموذج بتنسيق بيانات وصفية

model_with_metadata
الشكل 1. نموذج TFLite مع البيانات الوصفية والملفات المرتبطة به.

يتم تعريف البيانات الوصفية للنموذج في metadata_schema.fbs، CANNOT TRANSLATE FlatBuffer الملف. وكما هو موضح في الشكل 1، فإنه يتم تخزينها في البيانات الوصفية في حقل نموذج TFLite ، تحت الاسم "TFLITE_METADATA". قد يتم إرفاق بعض النماذج مع ملفات، مثل تصنيف للتصنيف الملفات. يتم ربط هذه الملفات بتنسيق ZIP في نهاية ملف النموذج الأصلي. باستخدام الملف ZipFile "append" الوضع (وضع 'a'). TFLite يمكن لميزة "الترجمة الفورية" استخدام تنسيق الملف الجديد بالطريقة نفسها كما في السابق. راجع الحزمة للملفات المرتبطة للحصول على مزيد من المعلومات.

راجِع التعليمات أدناه حول كيفية تعبئة البيانات الوصفية وعرضها وقراءتها.

إعداد أدوات البيانات الوصفية

قبل إضافة بيانات التعريف إلى نموذجك، سوف تحتاج إلى الاستعانة ببرمجة بايثون لتشغيل TensorFlow. يوجد دليل مفصل حول كيفية لإعداده هنا.

بعد إعداد بيئة برمجة Python، ستحتاج إلى تثبيت أدوات إضافية:

pip install tflite-support

أدوات البيانات الوصفية TensorFlow Lite تتوافق مع Python 3.

إضافة بيانات وصفية باستخدام Flatbuffers Python API

هناك ثلاثة أجزاء لبيانات تعريف النموذج في المخطط:

  1. معلومات النموذج - وصف عام للنموذج والعناصر مثل بنود الترخيص. عرض ModelMetadata.
    1. معلومات الإدخال - وصف مصادر الإدخال والمعالجة المسبقة مطلوبة مثل التسوية. عرض SubGraphMetadata.input_tensor_metadata.
      1. معلومات المخرجات - وصف المخرجات ما بعد المعالجة المطلوبة مثل التعيين إلى التصنيفات. عرض SubGraphMetadata.output_tensor_metadata.

وبما أنّ TensorFlow Lite لا تتيح إلا إنشاء رسم فرعي واحد في هذه المرحلة، أداة إنشاء رموز TensorFlow Lite وربط تعلُّم الآلة في "استوديو Android" الميزة سيستخدم ModelMetadata.name وModelMetadata.description، بدلاً من SubGraphMetadata.name وSubGraphMetadata.description، عند عرض بيانات التعريف وإنشاء التعليمات البرمجية.

أنواع الإدخال والإخراج المتوافقة

لم يتم تصميم البيانات الوصفية TensorFlow Lite للإدخال والمخرجات باستخدام بيانات أنواع النماذج الأولية في الاعتبار، وإنما أنواع المدخلات والمخرجات. لا يهم ما النموذج وظيفيًا، طالما أن أنواع المدخلات والمخرجات تتكون من ما يلي أو مجموعة مما يلي، يتوافق مع TensorFlow بيانات وصفية بسيطة:

  • الميزة - الأرقام التي تكون أعدادً صحيحةً غير بعلامة أو العدد العائم32.
  • صورة: توفّر البيانات الوصفية حاليًا الصور بتنسيق أحمر أخضر أزرق (RGB) وصور بالتدرج الرمادي.
  • صندوق حدود - صناديق حدود مستطيلة الشكل. يتوافق المخطط مع تنوع في الترقيم المخططات.

تجميع الملفات المرتبطة

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

يمكن الآن تجميع الملفات المرتبطة مع النموذج من خلال البيانات الوصفية. Python. سيصبح نموذج TensorFlow Lite الجديد ملف ZIP يحتوي على كل من النموذج والملفات المرتبطة به. يمكن فك ضغطه باستخدام ملف zip المشترك يواصل تنسيق النموذج الجديد هذا استخدام امتداد الملف نفسه، .tflite. أُنشأها جون هنتر، الذي كان متخصصًا متوافق مع إطار عمل TFLite الحالي ومترجم فوري. راجع البيانات الوصفية للحزمة والملفات المرتبطة بها في النموذج لمزيد من التفاصيل.

يمكن تسجيل معلومات الملفات ذات الصلة في البيانات الوصفية. استنادًا إلى نوع الملف والمكان الذي يتم إرفاق الملف به (أي ModelMetadata، SubGraphMetadata وTensorMetadataرمز Android TensorFlow Lite منشئ المحتوى نفسه قبل التعديل أو بعده. المعالجة التلقائية للكائن. الاطّلاع على <استخدام Codegen> قسم من كل ملف مساعد النوع في المخطط لمزيد من التفاصيل.

مَعلمات التسوية والتحديد الكمي

التسوية هي أسلوب شائع للمعالجة المسبقة للبيانات في تعلُّم الآلة. تشير رسالة الأشكال البيانية هدف التسوية هو تغيير القيم إلى مقياس مشترك، دون تشويه الاختلافات في نطاقات القيم.

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

في ما يتعلق بالمعالجة المسبقة وما بعد المعالجة، التسوية والتحديد الكمي هما خطوتان مستقلتان. في ما يلي التفاصيل.

التسوية الكمية

مثال على قيم المعاملات إدخال الصورة في MobileNet للشبكات العائمة ونماذج الكمّية على التوالي.
النموذج العائم:
- المتوسط: 127.5
- المقياس القياسي: 127.5
النموذج الكمّي:
- المتوسط: 127.5
- المعيار القياسي: 127.5
النموذج العائم:
- نقطة الصفر: 0
- المقياس: 1.0
النموذج الكمّي:
- نقطة الصفر: 128.0
- مقياس:0.0078125f




متى يتم الاستدعاء؟


عمليات الإدخال: في حال الإدخال تتم تسوية البيانات في التدريب، المدخل بيانات احتياجات الاستنتاج ستتم تسويته وفقًا لذلك.
النتائج: المخرجات البيانات لن يتم تمثيلها بشكل عام.
يفعل النماذج العائمة ولا يحتاجون إلى تحديد كمي.
قد يكون النموذج الكمي أو قد لا يحتاجون التحديد الكمّي في مرحلة ما قبل/بعد قيد المعالجة. حسب الحالة على نوع بيانات بمقادير الإدخال/الإخراج.
- العشرات العائمة: لا التحديد الكمّي في مرحلة ما قبل/بعد يجب معالجة البيانات. الكمية تُعد عمليات التشغيل وتحديد العمليات في النموذج الرسم البياني.
- مترابطات int8/uint8: بحاجة إلى كمي في المعالجة السابقة/البعدية.


المعادَلة


valueized_input = (إدخال - متوسط) / SD
تحديد كمية الإدخالات:
q = f / مقياس + zeroPoint
التحديد من أجل النتائج:
f = (q - zeroPoint) * المقياس

أين المَعلمات
تم التعبئة بواسطة منشئ النموذج وتخزينها في نموذج بيانات التعريف، مثل NormalizationOptions تم التعبئة تلقائيًا بحلول TFLite، البيانات المخزَّنة في نموذج tflite الملف.
كيفية الحصول على المَعلَمات؟ خلال واجهة برمجة تطبيقات MetadataExtractor [2] عبر TFLite Tensor واجهة برمجة التطبيقات [1] أو من خلال واجهة برمجة تطبيقات MetadataExtractor [2]
إجراء الأعداد العشرية والكميّة تشترك النماذج في نفس قيمة؟ نعم، عدد عشري وكمي نماذج لها نفس التسوية المَعلمات لا، النموذج العائم لا ولا يحتاجون إلى تحديد كمي.
هل يتم استخدام رموز TFLite مولِّد الدفع أو Android ربط تعلُّم الآلة في "استوديو YouTube" الإنشاء تلقائيًا في معالجة البيانات؟
نعم

نعم

[1] TensorFlow Lite Java واجهة برمجة التطبيقات وTensorFlow Lite C++ API.
[2] مكتبة أداة استخراج البيانات الوصفية

عند معالجة بيانات الصور لنماذج uint8، تتمّ التسوية والتحديد الكمّي. يتم تخطيها أحيانًا. ولا بأس في إجراء ذلك عندما تكون قيم البكسل في نطاق [0، 255]. ولكن بشكل عام، يجب عليك دائمًا معالجة البيانات وفقًا معايير التسوية والتحديد الكمي إن أمكن.

أمثلة

يمكنك الاطّلاع على أمثلة حول كيفية تعبئة البيانات الوصفية لمختلف التنسيقات من النماذج هنا:

تصنيف الصور

تنزيل النص البرمجي هنا ، والذي يملأ بيانات التعريف mobilenet_v1_0.75_160_quantized.tflite. قم بتشغيل البرنامج النصي على النحو التالي:

python ./metadata_writer_for_image_classifier.py \
    --model_file=./model_without_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --label_file=./model_without_metadata/labels.txt \
    --export_directory=model_with_metadata

لتعبئة البيانات الوصفية لنماذج تصنيف الصور الأخرى، أضِف مواصفات النموذج. معجب هذه في النص. سيسلط باقي هذا الدليل الضوء على بعض الأقسام الرئيسية في مثال تصنيف الصور لتوضيح العناصر الرئيسية.

نظرة تفصيلية على مثال تصنيف الصور

معلومات الطراز

تبدأ البيانات الوصفية بإنشاء نموذج جديد لمعلومات:

from tflite_support import flatbuffers
from tflite_support import metadata as _metadata
from tflite_support import metadata_schema_py_generated as _metadata_fb

""" ... """
"""Creates the metadata for an image classifier."""

# Creates model info.
model_meta = _metadata_fb.ModelMetadataT()
model_meta.name = "MobileNetV1 image classifier"
model_meta.description = ("Identify the most prominent object in the "
                          "image from a set of 1,001 categories such as "
                          "trees, animals, food, vehicles, person etc.")
model_meta.version = "v1"
model_meta.author = "TensorFlow"
model_meta.license = ("Apache License. Version 2.0 "
                      "http://www.apache.org/licenses/LICENSE-2.0.")

معلومات الإدخال / الإخراج

يوضح لك هذا القسم كيفية وصف توقيع إدخال ومخرجات النموذج. ويمكن استخدام هذه البيانات الوصفية من خلال أدوات إنشاء الرموز التلقائية لإنشاء بيانات رمز المعالجة. لإنشاء معلومات مدخلات أو إخراج حول أداة Tenor:

# Creates input info.
input_meta = _metadata_fb.TensorMetadataT()

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()

إدخال الصورة

الصور هي نوع إدخال شائع لتعلُّم الآلة. البيانات الوصفية لـ TensorFlow Lite تدعم معلومات مثل "مساحة اللون" ومعلومات المعالجة المسبقة، مثل التسوية. لا يتطلّب أبعاد الصورة مواصفات يدوية. لأنه يتوفر بالفعل من خلال شكل متوتر الإدخال ويمكن استنتاجها تلقائيًا.

input_meta.name = "image"
input_meta.description = (
    "Input image to be classified. The expected image is {0} x {1}, with "
    "three channels (red, blue, and green) per pixel. Each value in the "
    "tensor is a single byte between 0 and 255.".format(160, 160))
input_meta.content = _metadata_fb.ContentT()
input_meta.content.contentProperties = _metadata_fb.ImagePropertiesT()
input_meta.content.contentProperties.colorSpace = (
    _metadata_fb.ColorSpaceType.RGB)
input_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.ImageProperties)
input_normalization = _metadata_fb.ProcessUnitT()
input_normalization.optionsType = (
    _metadata_fb.ProcessUnitOptions.NormalizationOptions)
input_normalization.options = _metadata_fb.NormalizationOptionsT()
input_normalization.options.mean = [127.5]
input_normalization.options.std = [127.5]
input_meta.processUnits = [input_normalization]
input_stats = _metadata_fb.StatsT()
input_stats.max = [255]
input_stats.min = [0]
input_meta.stats = input_stats

ناتج التصنيف

يمكن ربط التصنيف بمنظِّم إخراج من خلال ملف مرتبط باستخدام TENSOR_AXIS_LABELS

# Creates output info.
output_meta = _metadata_fb.TensorMetadataT()
output_meta.name = "probability"
output_meta.description = "Probabilities of the 1001 labels respectively."
output_meta.content = _metadata_fb.ContentT()
output_meta.content.content_properties = _metadata_fb.FeaturePropertiesT()
output_meta.content.contentPropertiesType = (
    _metadata_fb.ContentProperties.FeatureProperties)
output_stats = _metadata_fb.StatsT()
output_stats.max = [1.0]
output_stats.min = [0.0]
output_meta.stats = output_stats
label_file = _metadata_fb.AssociatedFileT()
label_file.name = os.path.basename("your_path_to_label_file")
label_file.description = "Labels for objects that the model can recognize."
label_file.type = _metadata_fb.AssociatedFileType.TENSOR_AXIS_LABELS
output_meta.associatedFiles = [label_file]

إنشاء مخازن ثابتة للبيانات الوصفية

يدمج الرمز التالي معلومات النموذج مع المدخلات والمخرجات المعلومات:

# Creates subgraph info.
subgraph = _metadata_fb.SubGraphMetadataT()
subgraph.inputTensorMetadata = [input_meta]
subgraph.outputTensorMetadata = [output_meta]
model_meta.subgraphMetadata = [subgraph]

b = flatbuffers.Builder(0)
b.Finish(
    model_meta.Pack(b),
    _metadata.MetadataPopulator.METADATA_FILE_IDENTIFIER)
metadata_buf = b.Output()

تجميع البيانات الوصفية والملفات المرتبطة في النموذج

وبمجرد إنشاء مخازن البيانات الوصفية المسطحة، يتم الاحتفاظ ببيانات التعريف وملف التصنيف في ملف TFLite باستخدام طريقة populate:

populator = _metadata.MetadataPopulator.with_model_file(model_file)
populator.load_metadata_buffer(metadata_buf)
populator.load_associated_files(["your_path_to_label_file"])
populator.populate()

يمكنك تجميع أي عدد تريده من الملفات المرتبطة في النموذج من خلال load_associated_files ومع ذلك، لا بد من تجميع هذه الملفات على الأقل موثقة في بيانات التعريف. في هذا المثال، يكون تعبئة ملف التسمية إلزامي.

تصور البيانات الوصفية

يمكنك استخدام Netron لعرض أو يمكنك قراءة البيانات الوصفية من نموذج TensorFlow Lite إلى ملف json باستخدام MetadataDisplayer:

displayer = _metadata.MetadataDisplayer.with_model_file(export_model_path)
export_json_file = os.path.join(FLAGS.export_directory,
                                os.path.splitext(model_basename)[0] + ".json")
json_file = displayer.get_metadata_json()
# Optional: write out the metadata as a json file
with open(export_json_file, "w") as f:
  f.write(json_file)

يتيح "استوديو Android" أيضًا عرض البيانات الوصفية من خلال ميزة تعلُّم الآلة في "استوديو Android" الربط الجديدة.

تحديد إصدارات البيانات الوصفية

تتضمن بيانات التعريف المخطّط عن طريق رقم الإصدار الدلالي، الذي يتتبع تغييرات وملف المخطط، ومن خلال تعريف ملف Flatbuffers، والذي يشير إلى التوافق الفعلي مع الإصدارات.

رقم الإصدار الدلالي

يتم تحديد نسخة من مخطط البيانات الوصفية من خلال إصدار دلالات والرقم، مثل MAJOR.MINOR.PATCH. يتتبّع تغييرات المخطط وفقًا للقواعد هنا. الاطلاع على تاريخ الحقول تمت إضافتها بعد الإصدار 1.0.0.

تحديد ملف Flatbuffers

تضمن إمكانية تحديد الإصدارات الدلالية التوافق في حال اتّباع القواعد، ولكن لا يمكن لا يشير إلى عدم التوافق الحقيقي. عند البحث عن رقم MAJOR، لا يعني بالضرورة أن التوافق مع الأنظمة القديمة معطلة. لذلك، استخدم ملف المخزن المؤقت الثابت تحديد الهوية file_identifier، للإشارة إلى التوافق الحقيقي لمخطط البيانات الوصفية. معرف الملف هو يبلغ طولها 4 أحرف بالضبط. فهي ثابتة في مخطط بيانات تعريف معينة ولا للتغيير من قبل المستخدمين. إذا كان التوافق مع الأنظمة القديمة لمخطط بيانات التعريف عليك أن تتعرض لسبب ما، ليزداد جودة معرف الملف، على سبيل المثال، من "M001" إلى "M002". من المتوقّع أن يتغيّر معنيّة File_identifier بوتيرة أقل بكثير بشكل متكرر أكثر من البيانات الوصفية_version.

الحد الأدنى اللازم لإصدار محلل البيانات الوصفية

يتضمن الحد الأدنى الضروري من محلل بيانات التعريف النسخة هو الحد الأدنى لإصدار محلل بيانات التعريف (الكود الذي يُنشئه المخزن المؤقت لـ Flatbugs) الذي قراءة بيانات التعريف الثابتة للمخازن الثابتة بالكامل. يُعد الإصدار رقم الإصدار الأكبر بين إصدارات جميع الحقول التي تم ملؤها أصغر إصدار متوافق يشار إليه بمعرّف الملف. الحد الأدنى تتم تعبئة إصدار المحلل اللغوي لبيانات التعريف الضروري تلقائيًا من خلال MetadataPopulator عند تعبئة البيانات الوصفية في نموذج TFLite يمكنك الاطّلاع على أداة استخراج البيانات الوصفية للاطّلاع على المزيد من المعلومات حول كيفية يتم استخدام الحد الأدنى اللازم لإصدار محلل البيانات الوصفية.

قراءة البيانات الوصفية من النماذج

تُعد مكتبة استخراج بيانات التعريف أداة مناسبة لقراءة بيانات التعريف الملفات المرتبطة من نماذج عبر أنظمة أساسية مختلفة (راجع نموذج Java النسخة وC++ الإصدار). يمكنك إنشاء أداة استخراج البيانات الوصفية بلغات أخرى باستخدام مكتبة الموارد الثابتة.

قراءة البيانات الوصفية بلغة Java

لاستخدام مكتبة "أداة استخراج البيانات الوصفية" في تطبيق Android، ننصحك باستخدام الترميز المتقدّم للبيانات الوصفية لـ TensorFlow Lite والمستضاف على MavenCentral. وتتضمّن الفئة MetadataExtractor، بالإضافة إلى FlatBuffers Java. ارتباطات لبيانات التعريف مخطط والنموذج Google Cloud Platform.

يمكنك تحديد ذلك في اعتماديات build.gradle على النحو التالي:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite-metadata:0.1.0'
}

لاستخدام لقطات ليلية، تأكَّد من إضافة لقطة Sonatype. المستودع.

يمكنك إعداد كائن MetadataExtractor باستخدام ByteBuffer الذي يشير إلى إلى النموذج:

public MetadataExtractor(ByteBuffer buffer);

يجب أن تظل ByteBuffer كما هي بدون تغيير طوال فترة بقاء كائن MetadataExtractor. قد يتعذّر الإعداد إذا كان ملف "المخزن المؤقت الثابت" معرف البيانات الوصفية للنموذج لا يتطابق مع معرف برنامج تحليل البيانات الوصفية. عرض تحديد إصدارات البيانات الوصفية للاطّلاع على المزيد من المعلومات

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

public final boolean isMinimumParserVersionSatisfied();

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

public boolean hasMetadata();

تتيح لك MetadataExtractor وظائف مناسبة للحصول على موصلات الإدخال/الإخراج' بيانات التعريف. على سبيل المثال،

public int getInputTensorCount();
public TensorMetadata getInputTensorMetadata(int inputIndex);
public QuantizationParams getInputTensorQuantizationParams(int inputIndex);
public int[] getInputTensorShape(int inputIndex);
public int getoutputTensorCount();
public TensorMetadata getoutputTensorMetadata(int inputIndex);
public QuantizationParams getoutputTensorQuantizationParams(int inputIndex);
public int[] getoutputTensorShape(int inputIndex);

على الرغم من أن نموذج TensorFlow Lite المخطّط يدعم عدة لغات فرعية، لا يدعم مترجم TFLite حاليًا سوى فقرة فرعية واحدة. لذلك، يحذف MetadataExtractor فهرس الرسم البياني الفرعي كإدخال. الوسيطة بطرقها.

قراءة الملفات المرتبطة من النماذج

يعد نموذج TensorFlow Lite مع البيانات الوصفية والملفات المرتبطة في الأساس ZIP الذي يمكن فك ضغطه باستخدام أدوات ZIP الشائعة للحصول على الملفات المرتبطة. على سبيل المثال، يمكنك فك ضغط mobilenet_v1_0.75_160_quantized واستخراج ملف التصنيف في النموذج على النحو التالي:

$ unzip mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
Archive:  mobilenet_v1_0.75_160_quantized_1_metadata_1.tflite
 extracting: labels.txt

يمكنك أيضًا قراءة الملفات المرتبطة من خلال مكتبة استخراج البيانات الوصفية.

في Java، أدخِل اسم الملف في MetadataExtractor.getAssociatedFile. :

public InputStream getAssociatedFile(String fileName);

وبالمثل، في لغة C++، يمكن القيام بذلك باستخدام الطريقة، ModelMetadataExtractor::GetAssociatedFile:

tflite::support::StatusOr<absl::string_view> GetAssociatedFile(
      const std::string& filename) const;