توفر البيانات الوصفية LiteRT معيارًا لأوصاف النماذج. تشير رسالة الأشكال البيانية تعد بيانات التعريف مصدرًا مهمًا للمعرفة حول ما يفعله النموذج معلومات الإدخال / الإخراج تتكون بيانات التعريف من
- الأجزاء التي يستطيع الإنسان قراءتها والتي تنقل أفضل الممارسات عند استخدام النموذج، أو
- الأجزاء التي يستطيع الجهاز قراءتها ويمكن الاستفادة منها من خلال أدوات إنشاء الرموز، مثل رمز LiteRT Android منشئ وربط تعلُّم الآلة في "استوديو Android" .
جميع نماذج الصور المنشورة على Kaggle تم تعبئة النماذج بـ بيانات التعريف.
نموذج بتنسيق بيانات وصفية
يتم تعريف البيانات الوصفية للنموذج في
metadata_schema.fbs،
CANNOT TRANSLATE
FlatBuffer
الملف. وكما هو موضح في الشكل 1، فإنه يتم تخزينها في
البيانات الوصفية
في حقل نموذج TFLite
،
تحت الاسم "TFLITE_METADATA"
. قد يتم إرفاق بعض النماذج مع ملفات،
مثل تصنيف للتصنيف
الملفات.
يتم ربط هذه الملفات بتنسيق ZIP في نهاية ملف النموذج الأصلي.
باستخدام الملف ZipFile "append"
الوضع (وضع 'a'
). TFLite
يمكن لميزة "الترجمة الفورية" استخدام تنسيق الملف الجديد بالطريقة نفسها كما في السابق. راجع الحزمة
للملفات المرتبطة للحصول على مزيد من المعلومات.
راجِع التعليمات أدناه حول كيفية تعبئة البيانات الوصفية وعرضها وقراءتها.
إعداد أدوات البيانات الوصفية
قبل إضافة بيانات التعريف إلى نموذجك، سوف تحتاج إلى الاستعانة ببرمجة بايثون لتشغيل TensorFlow. يوجد دليل مفصل حول كيفية لإعداده هنا.
بعد إعداد بيئة برمجة Python، ستحتاج إلى تثبيت أدوات إضافية:
pip install tflite-support
أدوات البيانات الوصفية لـ LiteRT تدعم Python 3.
إضافة بيانات وصفية باستخدام Flatbuffers Python API
هناك ثلاثة أجزاء لبيانات تعريف النموذج في المخطط:
- معلومات النموذج - وصف عام للنموذج والعناصر
مثل بنود الترخيص. عرض
ModelMetadata.
- معلومات الإدخال - وصف مصادر الإدخال والمعالجة المسبقة
مطلوبة مثل التسوية. عرض
SubGraphMetadata.input_tensor_metadata.
- معلومات المخرجات - وصف المخرجات ما بعد المعالجة المطلوبة مثل التعيين إلى التصنيفات. عرض SubGraphMetadata.output_tensor_metadata.
- معلومات الإدخال - وصف مصادر الإدخال والمعالجة المسبقة
مطلوبة مثل التسوية. عرض
SubGraphMetadata.input_tensor_metadata.
ونظرًا لأن LiteRT لا يدعم إلا رسمًا بيانيًا فرعيًا واحدًا في هذه المرحلة،
أداة إنشاء رموز LiteRT
وربط تعلُّم الآلة في "استوديو Android"
الميزة
سيستخدم ModelMetadata.name
وModelMetadata.description
، بدلاً من
SubGraphMetadata.name
وSubGraphMetadata.description
، عند عرض
بيانات التعريف وإنشاء التعليمات البرمجية.
أنواع الإدخال والإخراج المتوافقة
لم يتم تصميم بيانات LiteRT للإدخال والمخرجات مع معايير أنواع النماذج الأولية في الاعتبار، وإنما أنواع المدخلات والمخرجات. لا يهم ما النموذج وظيفيًا، طالما أن أنواع المدخلات والمخرجات تتكون من ما يلي أو مجموعة مما يلي، يتوافق مع TensorFlow بيانات وصفية بسيطة:
- الميزة - الأرقام التي تكون أعدادً صحيحةً غير بعلامة أو العدد العائم32.
- صورة: توفّر البيانات الوصفية حاليًا الصور بتنسيق أحمر أخضر أزرق (RGB) وصور بالتدرج الرمادي.
- صندوق حدود - صناديق حدود مستطيلة الشكل. يتوافق المخطط مع تنوع في الترقيم المخططات.
تجميع الملفات المرتبطة
قد تأتي نماذج LiteRT مع ملفات مرتبطة مختلفة. على سبيل المثال: عادةً ما تحتوي نماذج اللغات الطبيعية على ملفات لفظ تربط أجزاء الكلمات بالكلمات. المعرّفات: قد تحتوي نماذج التصنيف على ملفات تسمية تشير إلى فئات الكائنات. بدون الملفات المرتبطة (إن وجدت)، لن يعمل النموذج بشكلٍ جيد.
يمكن الآن تجميع الملفات المرتبطة مع النموذج من خلال البيانات الوصفية.
Python. يصبح نموذج LiteRT الجديد ملف zip يحتوي على
كل من النموذج والملفات المرتبطة به. يمكن فك ضغطه باستخدام ملف zip المشترك
يواصل تنسيق النموذج الجديد هذا استخدام امتداد الملف نفسه، .tflite
. أُنشأها جون هنتر، الذي كان متخصصًا
متوافق مع إطار عمل TFLite الحالي ومترجم فوري. راجع البيانات الوصفية للحزمة
والملفات المرتبطة بها في
النموذج لمزيد من التفاصيل.
يمكن تسجيل معلومات الملفات ذات الصلة في البيانات الوصفية. استنادًا إلى
نوع الملف والمكان الذي يتم إرفاق الملف به (أي ModelMetadata
،
SubGraphMetadata
وTensorMetadata
)، رمز LiteRT Android
منشئ المحتوى نفسه قبل التعديل أو بعده.
المعالجة التلقائية للكائن. الاطّلاع على <استخدام Codegen> قسم من
كل ملف مساعد
النوع
في المخطط لمزيد من التفاصيل.
مَعلمات التسوية والتحديد الكمي
التسوية هي أسلوب شائع للمعالجة المسبقة للبيانات في تعلُّم الآلة. تشير رسالة الأشكال البيانية هدف التسوية هو تغيير القيم إلى مقياس مشترك، دون تشويه الاختلافات في نطاقات القيم.
تحديد كمية النماذج هي أسلوب تسمح بتمثيل دقيق للأوزان، واختياريًا، عمليات تنشيط لكل من التخزين والحوسبة.
في ما يتعلق بالمعالجة المسبقة وما بعد المعالجة، التسوية والتحديد الكمي هما خطوتان مستقلتان. في ما يلي التفاصيل.
التسوية | الكمية | |
---|---|---|
مثال على قيم المعاملات إدخال الصورة في MobileNet للشبكات العائمة ونماذج الكمّية على التوالي. |
النموذج العائم: - المتوسط: 127.5 - المقياس القياسي: 127.5 النموذج الكمّي: - المتوسط: 127.5 - المعيار القياسي: 127.5 |
النموذج العائم: - نقطة الصفر: 0 - المقياس: 1.0 النموذج الكمّي: - نقطة الصفر: 128.0 - مقياس:0.0078125f |
متى يتم الاستدعاء؟ |
عمليات الإدخال: في حال الإدخال تتم تسوية البيانات في التدريب، المدخل بيانات احتياجات الاستنتاج ستتم تسويته وفقًا لذلك. النتائج: المخرجات البيانات لن يتم تمثيلها بشكل عام. |
يفعل النماذج العائمة
ولا يحتاجون إلى تحديد كمي. قد يكون النموذج الكمي أو قد لا يحتاجون التحديد الكمّي في مرحلة ما قبل/بعد قيد المعالجة. حسب الحالة على نوع بيانات بمقادير الإدخال/الإخراج. - العشرات العائمة: لا التحديد الكمّي في مرحلة ما قبل/بعد يجب معالجة البيانات. Quant تُعد عمليات التشغيل وتحديد العمليات في النموذج الرسم البياني. - مترابطات 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] إصدار LiteRT Java
واجهة برمجة التطبيقات
وLiteRT C++
واجهة برمجة التطبيقات:
[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()
إدخال الصورة
الصور هي نوع إدخال شائع لتعلُّم الآلة. البيانات الوصفية LiteRT تدعم معلومات مثل "مساحة اللون" ومعلومات المعالجة المسبقة، مثل التسوية. لا يتطلّب أبعاد الصورة مواصفات يدوية. لأنه يتوفر بالفعل من خلال شكل متوتر الإدخال ويمكن استنتاجها تلقائيًا.
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 لعرض
أو يمكنك قراءة البيانات الوصفية من نموذج LiteRT إلى ملف 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، ننصحك باستخدام
ميزة AAR للبيانات الوصفية لـ LiteRT والتي تتم استضافتها على
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);
وعلى الرغم من أن نموذج LiteRT
المخطّط
يدعم عدة لغات فرعية، لا يدعم مترجم TFLite حاليًا سوى
فقرة فرعية واحدة. لذلك، يحذف MetadataExtractor
فهرس الرسم البياني الفرعي كإدخال.
الوسيطة بطرقها.
قراءة الملفات المرتبطة من النماذج
يعد نموذج LiteRT مع بيانات التعريف والملفات المرتبطة في الأساس 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;