TensorFlow Lite modellerine meta veri ekleme

TensorFlow Lite meta verileri, model açıklamaları için bir standart sağlar. Meta veriler, modelin ne yaptığı ve girdi/çıktı bilgileri hakkında önemli bir bilgi kaynağıdır. Meta veriler her ikisinden de oluşur

TensorFlow Hub'da yayınlanan tüm görüntü modelleri meta verilerle dolduruldu.

Meta veri biçimine sahip model

model_with_metadata
Şekil 1. Meta veriler ve ilgili dosyalar içeren TFLite modeli.

Model meta verileri, bir FlatBuffer dosyası olan metadata_schema.fbs içinde tanımlanır. Şekil 1'de gösterildiği gibi, TFLite model şemasının metadata alanında "TFLITE_METADATA" adı altında saklanır. Bazı modeller, sınıflandırma etiketi dosyaları gibi ilişkili dosyalarla birlikte gelebilir. Bu dosyalar, ZipFile "ekleme" modu ( 'a' modu) kullanılarak bir ZIP olarak orijinal model dosyasının sonuna birleştirilir. TFLite Yorumlayıcı, yeni dosya biçimini eskisi gibi kullanabilir. Daha fazla bilgi için İlişkili dosyaları paketleme konusuna bakın.

Meta verilerin nasıl doldurulacağı, görselleştirileceği ve okunacağı hakkında aşağıdaki talimata bakın.

Meta veri araçlarını kurun

Modelinize meta veri eklemeden önce, TensorFlow'u çalıştırmak için bir Python programlama ortamı kurulumuna ihtiyacınız olacak. Bunun nasıl kurulacağına dair ayrıntılı bir kılavuz var burada .

Python programlama ortamını kurduktan sonra, ek araçlar yüklemeniz gerekecektir:

pip install tflite-support

TensorFlow Lite meta veri araçları Python 3'ü destekler.

Flatbuffers Python API kullanarak meta veri ekleme

Şemada model meta verilerinin üç bölümü vardır:

  1. Model bilgileri - Modelin genel açıklamasının yanı sıra lisans koşulları gibi öğeler. ModelMetadata'ya bakın.
  2. Girdi bilgileri - Normalleştirme gibi gerekli girdilerin ve ön işlemenin açıklaması. SubGraphMetadata.input_tensor_metadata'ya bakın.
  3. Çıktı bilgileri - Etiketlere eşleme gibi gerekli çıktı ve son işlemenin açıklaması. SubGraphMetadata.output_tensor_metadata'ya bakın.

TensorFlow Lite bu noktada yalnızca tek alt grafiği desteklediğinden, TensorFlow Lite kod oluşturucu ve Android Studio ML Binding özelliği , meta verileri görüntülerken ve kod oluştururken ModelMetadata.name ve ModelMetadata.description yerine SubGraphMetadata.name ve SubGraphMetadata.description kullanır.

Desteklenen Giriş / Çıkış türleri

Giriş ve çıkış için TensorFlow Lite meta verileri, belirli model türleri düşünülerek değil, daha çok giriş ve çıkış türleri düşünülerek tasarlanmıştır. Modelin işlevsel olarak ne yaptığı önemli değildir, giriş ve çıkış türleri aşağıdakilerden veya bunların bir kombinasyonundan oluştuğu sürece, TensorFlow Lite meta verileri tarafından desteklenir:

  • Özellik - İşaretsiz tamsayılar veya float32 olan sayılar.
  • Görüntü - Meta veriler şu anda RGB ve gri tonlamalı görüntüleri desteklemektedir.
  • Sınırlayıcı kutu - Dikdörtgen şekilli sınırlayıcı kutular. Şema, çeşitli numaralandırma şemalarını destekler.

İlişkili dosyaları paketleyin

TensorFlow Lite modelleri, farklı ilişkili dosyalarla gelebilir. Örneğin, doğal dil modellerinde genellikle sözcük parçalarını sözcük kimlikleriyle eşleyen sözcük dosyaları bulunur; sınıflandırma modelleri, nesne kategorilerini gösteren etiket dosyalarına sahip olabilir. İlişkili dosyalar olmadan (varsa), bir model iyi çalışmayacaktır.

İlişkili dosyalar artık meta veri Python kitaplığı aracılığıyla modelle birlikte paketlenebilir. Yeni TensorFlow Lite modeli, hem modeli hem de ilişkili dosyaları içeren bir zip dosyası haline gelir. Yaygın zip araçlarıyla açılabilir. Bu yeni model biçimi, aynı dosya uzantısını kullanmaya devam ediyor, .tflite . Mevcut TFLite çerçevesi ve Yorumlayıcı ile uyumludur. Daha fazla ayrıntı için meta verileri ve ilişkili dosyaları modele paketleme konusuna bakın.

İlişkili dosya bilgileri meta verilere kaydedilebilir. Dosya türüne ve dosyanın eklendiği yere (yani ModelMetadata , SubGraphMetadata ve TensorMetadata ) bağlı olarak , TensorFlow Lite Android kod oluşturucu nesneye otomatik olarak karşılık gelen ön/son işlemeyi uygulayabilir. Daha fazla ayrıntı için şemadaki her ilişkili dosya türünün <Codegen kullanımı> bölümüne bakın.

Normalizasyon ve nicemleme parametreleri

Normalleştirme, makine öğreniminde yaygın bir veri ön işleme tekniğidir. Normalleştirmenin amacı, değer aralıklarındaki farklılıkları bozmadan değerleri ortak bir ölçeğe dönüştürmektir.

Model niceleme , ağırlıkların azaltılmış kesinlik temsillerine ve isteğe bağlı olarak hem depolama hem de hesaplama için aktivasyonlara izin veren bir tekniktir.

Ön işleme ve son işleme açısından, normalleştirme ve niceleme iki bağımsız adımdır. Detaylar burada.

normalleştirme niceleme

Sırasıyla kayan nokta ve nicelik modelleri için MobileNet'teki giriş görüntüsünün parametre değerlerinin bir örneği.
Şamandıra modeli :
- ortalama: 127.5
- standart: 127.5
Miktar modeli :
- ortalama: 127.5
- standart: 127.5
Şamandıra modeli :
- sıfırNoktası: 0
- ölçek: 1.0
Miktar modeli :
- sıfırNoktası: 128,0
- ölçek:0.0078125f




Ne zaman çağrılır?


Girdiler : Eğitimde girdi verileri normalleştirilirse, çıkarımın girdi verilerinin buna göre normalleştirilmesi gerekir.
Çıktılar : çıktı verileri genel olarak normalleştirilmeyecektir.
Şamandıralı modeller niceleme gerektirmez.
Nicelleştirilmiş model , işlem öncesi/sonrası nicemlemeye ihtiyaç duyabilir veya gerekmeyebilir. Giriş/çıkış tensörlerinin veri tipine bağlıdır.
- yüzer tensörler: ön/son işlemde nicemleme gerekmez. Quant op ve dequant op, model grafiğinde pişirilir.
- int8/uint8 tensörleri: ön/son işlemde niceleme gerekir.


formül


normalized_input = (girdi - ortalama) / standart
Girişler için niceleme :
q = f / ölçek + sıfırNoktası
Çıkışlar için dekuantize et :
f = (q - sıfır Noktası) * ölçek

parametreler nerede
Model yaratıcısı tarafından doldurulur ve model meta verilerinde NormalizationOptions olarak saklanır TFLite dönüştürücü tarafından otomatik olarak doldurulur ve tflite model dosyasında saklanır.
Parametreler nasıl alınır? MetadataExtractor API'si aracılığıyla [2] TFLite Tensor API'si [1] veya MetadataExtractor API'si [2] aracılığıyla
Float ve quant modelleri aynı değeri paylaşıyor mu? Evet, kayan nokta ve nicelik modelleri aynı Normalleştirme parametrelerine sahiptir Hayır, şamandıra modelinin nicemlemeye ihtiyacı yoktur.
TFLite Code oluşturucu veya Android Studio ML bağlaması, veri işlemede bunu otomatik olarak oluşturur mu?
Evet

Evet

[1] TensorFlow Lite Java API ve TensorFlow Lite C++ API .
[2] Meta veri çıkarıcı kitaplığı

uint8 modelleri için görüntü verileri işlenirken, normalleştirme ve niceleme bazen atlanır. Piksel değerleri [0, 255] aralığında olduğunda bunu yapmak uygundur. Ancak genel olarak, uygulanabilir olduğunda verileri her zaman normalleştirme ve niceleme parametrelerine göre işlemelisiniz.

Meta verilerde NormalizationOptions ayarlarsanız, TensorFlow Lite Görev Kitaplığı normalleştirmeyi sizin için işleyebilir. Kuantizasyon ve dekuantizasyon işlemi her zaman kapsüllenir.

Örnekler

Farklı model türleri için meta verilerin nasıl doldurulması gerektiğine ilişkin örnekleri burada bulabilirsiniz:

Görüntü sınıflandırması

Meta verileri mobilenet_v1_0.75_160_quantized.tflite dosyasına yerleştiren komut dosyasını buradan indirin. Komut dosyasını şu şekilde çalıştırın:

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

Diğer görüntü sınıflandırma modelleri için meta verileri doldurmak için, bunun gibi model özelliklerini komut dosyasına ekleyin. Bu kılavuzun geri kalanı, temel öğeleri göstermek için görüntü sınıflandırma örneğindeki bazı önemli bölümleri vurgulayacaktır.

Görüntü sınıflandırma örneğine derinlemesine dalın

Model bilgileri

Meta veriler, yeni bir model bilgisi oluşturarak başlar:

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.")

Giriş / çıkış bilgisi

Bu bölüm, modelinizin giriş ve çıkış imzasını nasıl tanımlayacağınızı gösterir. Bu meta veriler, otomatik kod oluşturucular tarafından işlem öncesi ve sonrası kod oluşturmak için kullanılabilir. Bir tensör hakkında girdi veya çıktı bilgisi oluşturmak için:

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

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

Görüntü girişi

Görüntü, makine öğrenimi için yaygın bir giriş türüdür. TensorFlow Lite meta verileri, renk alanı gibi bilgileri ve normalleştirme gibi ön işleme bilgilerini destekler. Görüntünün boyutu, giriş tensörünün şekli tarafından zaten sağlandığından ve otomatik olarak çıkarılabildiğinden manuel belirtim gerektirmez.

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

Etiket çıktısı

Etiket, TENSOR_AXIS_LABELS kullanılarak ilişkili bir dosya aracılığıyla bir çıktı tensörüne eşlenebilir.

# 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]

Flatbuffers meta verilerini oluşturun

Aşağıdaki kod, model bilgilerini giriş ve çıkış bilgileriyle birleştirir:

# 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()

Modele meta verileri ve ilişkili dosyaları paketleyin

Flatbuffers meta verileri oluşturulduktan sonra, meta veriler ve etiket dosyası populate yöntemiyle TFLite dosyasına yazılır:

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 aracılığıyla modele istediğiniz kadar ilişkili dosyayı paketleyebilirsiniz. Ancak, en azından meta verilerde belgelenen dosyaların paketlenmesi gerekir. Bu örnekte, etiket dosyasının paketlenmesi zorunludur.

Meta verileri görselleştirin

Meta verilerinizi görselleştirmek için Netron'u kullanabilir veya MetadataDisplayer kullanarak bir TensorFlow Lite modelindeki meta verileri bir json biçiminde okuyabilirsiniz:

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 Studio, Android Studio ML Binding özelliği aracılığıyla meta verilerin görüntülenmesini de destekler.

Meta veri sürümü oluşturma

Meta veri şeması , hem şema dosyasındaki değişiklikleri izleyen Semantik sürüm oluşturma numarasına hem de gerçek sürüm uyumluluğunu gösteren Flatbuffers dosya kimliğine göre sürümlendirilir.

Semantik sürüm numarası

Meta veri şeması, MAJOR.MINOR.PATCH gibi Semantik sürüm oluşturma numarasına göre sürümlendirilir. Buradaki kurallara göre şema değişikliklerini takip eder. 1.0.0 sürümünden sonra eklenen alanların geçmişine bakın.

Flatbuffers dosya kimliği

Anlamsal sürüm oluşturma, kurallara uyulması durumunda uyumluluğu garanti eder, ancak gerçek uyumsuzluğu ima etmez. MAJOR numarasının çarpılması, geriye dönük uyumluluğun bozulduğu anlamına gelmez. Bu nedenle, meta veri şemasının gerçek uyumluluğunu belirtmek için Flatbuffers dosya tanımlamasını ( file_identifier ) kullanırız. Dosya tanımlayıcısı tam olarak 4 karakter uzunluğundadır. Belirli bir meta veri şemasına sabitlenir ve kullanıcılar tarafından değiştirilemez. Meta veri şemasının geriye dönük uyumluluğunun herhangi bir nedenle bozulması gerekiyorsa, dosya_tanımlayıcısı örneğin "M001"den "M002"ye yükselir. File_identifier'ın metadata_version'dan çok daha az sıklıkta değiştirilmesi bekleniyor.

Minimum gerekli meta veri ayrıştırıcı sürümü

Minimum gerekli meta veri ayrıştırıcı sürümü , meta veri Flatbuffers meta verilerini tam olarak okuyabilen minimum meta veri ayrıştırıcı sürümüdür (Flatbuffers tarafından oluşturulan kod). Sürüm, doldurulan tüm alanların sürümleri arasında etkin bir şekilde en büyük sürüm numarası ve dosya tanımlayıcı tarafından belirtilen en küçük uyumlu sürümdür. Gerekli minimum meta veri ayrıştırıcı sürümü, meta veriler bir TFLite modeline yerleştirildiğinde MetadataPopulator tarafından otomatik olarak doldurulur. Minimum gerekli meta veri ayrıştırıcı sürümünün nasıl kullanıldığı hakkında daha fazla bilgi için meta veri çıkarıcıya bakın.

Modellerden meta verileri okuyun

Metadata Extractor kitaplığı, farklı platformlardaki bir modelden meta verileri ve ilişkili dosyaları okumak için kullanışlı bir araçtır (bkz. Java sürümü ve C++ sürümü ). Flatbuffers kitaplığını kullanarak diğer dillerde kendi meta veri çıkarma aracınızı oluşturabilirsiniz.

Java'daki meta verileri okuyun

Android uygulamanızda Metadata Extractor kitaplığını kullanmak için MavenCentral'da barındırılan TensorFlow Lite Metadata AAR'ı kullanmanızı öneririz. MetadataExtractor sınıfını ve ayrıca meta veri şeması ve model şeması için FlatBuffers Java bağlamalarını içerir.

Bunu build.gradle bağımlılıklarınızda aşağıdaki gibi belirtebilirsiniz:

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

Gecelik anlık görüntüleri kullanmak için Sonatype anlık görüntü deposunu eklediğinizden emin olun.

Modele işaret eden bir ByteBuffer ile MetadataExtractor nesnesini başlatabilirsiniz:

public MetadataExtractor(ByteBuffer buffer);

ByteBuffer , MetadataExtractor nesnesinin tüm kullanım ömrü boyunca değişmeden kalmalıdır. Model meta verilerinin Flatbuffers dosya tanımlayıcısı, meta veri ayrıştırıcısınınkiyle eşleşmezse başlatma başarısız olabilir. Daha fazla bilgi için meta veri sürümüne bakın.

Eşleşen dosya tanımlayıcıları ile, meta veri çıkarıcı, Flatbuffers'ın ileriye ve geriye dönük uyumluluk mekanizması nedeniyle tüm geçmiş ve gelecek şemalardan oluşturulan meta verileri başarıyla okuyacaktır. Ancak, gelecekteki şemalardan alanlar, eski meta veri çıkarıcılar tarafından ayıklanamaz. Meta verinin minimum gerekli ayrıştırıcı sürümü , metadata Flatbuffers'ı tam olarak okuyabilen minimum meta veri ayrıştırıcı sürümünü belirtir. Minimum gerekli ayrıştırıcı sürüm koşulunun karşılanıp karşılanmadığını doğrulamak için aşağıdaki yöntemi kullanabilirsiniz:

public final boolean isMinimumParserVersionSatisfied();

Meta veri içermeyen bir modele geçişe izin verilir. Ancak, meta verilerden okunan yöntemleri çağırmak, çalışma zamanı hatalarına neden olur. hasMetadata yöntemini çağırarak bir modelin meta verisi olup olmadığını kontrol edebilirsiniz:

public boolean hasMetadata();

MetadataExtractor , giriş/çıkış tensörlerinin meta verilerini almanız için uygun işlevler sağlar. Örneğin,

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 model şeması birden çok alt grafiği desteklese de, TFLite Yorumlayıcı şu anda yalnızca tek bir alt grafiği desteklemektedir. Bu nedenle, MetadataExtractor , yöntemlerinde bir giriş argümanı olarak alt grafik indeksini atlar.

Modellerden ilişkili dosyaları okuyun

Meta verileri ve ilişkili dosyaları içeren TensorFlow Lite modeli, temel olarak, ilişkili dosyaları almak için yaygın zip araçlarıyla açılabilen bir zip dosyasıdır. Örneğin, mobilenet_v1_0.75_160_quantized dosyasını açabilir ve modeldeki etiket dosyasını aşağıdaki gibi ayıklayabilirsiniz:

$ 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

İlişkili dosyaları Metadata Extractor kitaplığı aracılığıyla da okuyabilirsiniz.

Java'da dosya adını MetadataExtractor.getAssociatedFile yöntemine iletin:

public InputStream getAssociatedFile(String fileName);

Benzer şekilde, C++'da bu, ModelMetadataExtractor::GetAssociatedFile yöntemiyle yapılabilir:

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