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

Yayınlanan tüm resim modelleri TensorFlow Lite modelleri barındırılan ve TensorFlow Hub meta verilerle doldurulan.

Meta veri biçimine sahip model

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

Model meta tanımlanan metadata_schema.fbs , bir FlatBuffer dosyasını. Şekil 1'de gösterildiği gibi, depolanan meta alanında TFLite modeli şeması , adı altında, "TFLITE_METADATA" . Bazı modellerde gibi ilişkili dosyalar, gelebilir sınıflandırma etiket dosyaları . Bu dosyalar ZipFile kullanarak bir ZIP gibi orijinal modeli dosyanın sonuna birleştirilmiş "ekleme" modunu ( 'a' modu). TFLite Yorumlayıcı, yeni dosya biçimini eskisi gibi kullanabilir. Bkz Paketi'ni ilişkili dosyaları daha fazla bilgi için.

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. Bu nasıl kurulacağı hakkında ayrıntılı bir rehber vardır 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

Model meta verileri üç bölümü vardır şema :

  1. Model bilgisi - Genel modelin açıklamasının yanı sıra lisans şartları gibi öğeler. Bkz ModelMetadata .
  2. Giriş bilgisi - girişlerin tanımı ve ön-işleme normalizasyonu gibi gerekli. Bkz SubGraphMetadata.input_tensor_metadata .
  3. Çıktı bilgi - çıkış ve post-processing açıklaması etiketlerine haritalama gibi gerektiriyordu. Bkz SubGraphMetadata.output_tensor_metadata .

TensorFlow Lite sadece bu noktada tek subgraph desteklediği için TensorFlow Lite kod üreteci ve Android Studio ML Bağlama özelliği kullanacak ModelMetadata.name ve ModelMetadata.description yerine SubGraphMetadata.name ve SubGraphMetadata.description , meta görüntüleme ve oluşturma kodu.

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 destekler numaralandırma planlarının çeşitli .

İlişkili dosyaları paketleyin

TensorFlow Lite modelleri, farklı ilişkili dosyalarla gelebilir. Örneğin, doğal dil modelleri genellikle sözcük parçalarını sözcük kimlikleriyle eşleyen sözcük dosyalarına sahiptir; 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ı kullanarak tutar .tflite . Mevcut TFLite çerçevesi ve Yorumlayıcı ile uyumludur. Bkz modele Paketi meta ve ilişkili dosyaları daha fazla ayrıntı için.

İlişkili dosya bilgileri meta verilere kaydedilebilir. Dosya türü ve dosya (yani iliştirilmiş yere bağlı ModelMetadata , SubGraphMetadata ve TensorMetadata ), TensorFlow Lite Android kod üreteci nesnesine otomatik öncesi / sonrası işleme tekabül başvurabilir. Bkz her ortak dosya türü <Codegen kullanımı> bölümüne daha fazla ayrıntı için şemada.

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 değiştirmektir.

Model niceleme depolama ve hesaplama her ikisi için ağırlık ve isteğe bağlı olarak, aktivasyon azaltılmış hassasiyet temsilleri sağlayan bir tekniktir.

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

normalleştirme niceleme

Sırasıyla float ve quant modelleri için MobileNet'teki giriş görüntüsünün parametre değerlerinin bir örneği.
Float modeli:
- ortalama: 127.5
- standart: 127.5
Quant modeli:
- ortalama: 127.5
- standart: 127.5
Float modeli:
- sıfırNoktası: 0
- ölçek: 1.0
Quant modeli:
- sıfırNoktası: 128,0
- ölçek:0.0078125f




Ne zaman çağrılır?


Girişler: girdi verileri eğitimde normalize edilirse, çıkarım ihtiyaçlarının girdi verileri buna göre normalize edilecek.
Çıkışlar: Çıktı verileri genel olarak normalize edilmeyecektir.
Float modelleri nicemlemesini ihtiyacı yoktur.
Quantized modeli olabilir veya öncesi / sonrası işleme nicemlemesini 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 nicemlemek:
q = f / ölçek + sıfırNoktası
Çıkışlar için dekuantize:
f = (q - sıfır Noktası) * ölçek

parametreler nerede
Olarak, model oluşturan tarafından Dolgulu ve model meta veri saklanan NormalizationOptions TFLite dönüştürücü tarafından otomatik olarak doldurulur ve tflite model dosyasında saklanır.
Parametreler nasıl alınır? Yoluyla MetadataExtractor API [2] TFLite ile Tensor API [1] ya da geçiş MetadataExtractor API [2]
Float ve quant modelleri aynı değeri paylaşıyor mu? Evet, float ve quant modelleri aynı Normalizasyon parametrelerine sahiptir Hayır, şamandıra modelinin nicelleştirmeye ihtiyacı yoktur.
TFLite Code oluşturucu veya Android Studio ML bağlaması, veri işlemede bunu otomatik olarak oluşturur mu?
Evet

Evet

[1] if TensorFlow Lite Java API ve TensorFlow Lite C ++ API .
[2] meta çıkarıcı kütüphanesi

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.

TensorFlow Lite Görev Kütüphanesi kurmak eğer sizin için normalleştirme işleyebilir NormalizationOptions metaverilerde. 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ı

Senaryoyu indirin burada meta hangi olarak doldurulur, mobilenet_v1_0.75_160_quantized.tflite . 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 doldurmak meta veriler için, gibi modeli özelliklerini eklemek Bu komut dosyası içine. 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ış bilgileri

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 kullanarak ilişkili dosyası yoluyla bir çıkış tensör eşlenebilir 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]

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

Meta Flatbuffers oluşturulduktan sonra meta veri ve etiket dosyası yoluyla TFLite dosyasına yazılır populate yöntemle:

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

Eğer aracılığıyla modeli istediğiniz gibi birçok ilişkili dosyaları olarak toparlayabiliriz load_associated_files . Ancak, en azından meta verilerde belgelenen dosyaların paketlenmesi gerekir. Bu örnekte, etiket dosyasının paketlenmesi zorunludur.

Meta verileri görselleştirin

Sen kullanabilirsiniz Netron sizin meta görselleştirmek için, veya kullandığınız bir json biçime bir TensorFlow Lite modeli meta verileri okuyabilir 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 Studio ayrıca aracılığıyla meta gösteren destekler Android Studio ML Bağlama özelliği .

Meta veri sürümü oluşturma

Meta şema şema dosyasının değişiklikleri izler ve gerçek versiyonu uyumluluğu gösterir Flatbuffers dosya tanımlama ile Semantik sürüm numarası, her iki sürüm edilir.

Semantik sürüm numarası

Meta şema ile sürüm olan Semantik sürüm numarası örneğin MAJOR.MINOR.PATCH gibi. Bu kurallara göre şema değişiklikleri izler burada . Bkz alanların tarihini sürümünden sonra eklendi 1.0.0 .

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, kullandığımız Flatbuffers dosya tanımlama , file_identifier meta şeması gerçek uyumluluğunu göstermek için. 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ü

Asgari gerekli meta ayrıştırıcı sürümü tam olarak meta Flatbuffers okuyabilir meta ayrıştırıcı minimum sürümü (Flatbuffers kodunu oluşturduktan) 'dir. 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. Minimum gerekli meta ayrıştırıcı sürümü otomatik tarafından doldurulur MetadataPopulator meta bir TFLite modeline doldurulur zaman. Bkz meta çıkarıcı asgari gerekli meta ayrıştırıcı versiyonu nasıl kullanıldığına ilişkin daha fazla bilgi için.

Modellerden meta verileri okuyun

Meta Veri Extractor kütüphanesi farklı platformlarda bir modellerden meta ve ilgili dosyaları (bkz okumak için elverişli bir araçtır 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 uygulamasında Meta Veri Extractor kütüphanesini kullanmak için, biz kullanmanızı tavsiye TensorFlow Lite Meta Veri AAR MavenCentral barındırılan . İçerdiği MetadataExtractor sınıfını yanısıra için FlatBuffers Java bağlamaları meta şema ve modeli şeması .

Eğer bu belirtebilirsiniz build.gradle şöyle bağımlılıkları:

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

Gece anlık kullanmak için emin eklediğinizi yapmak Sonatype anlık depo .

Bir başlatabilir MetadataExtractor bir nesneyi ByteBuffer o modelde puan:

public MetadataExtractor(ByteBuffer buffer);

ByteBuffer tüm ömrü için değişmeden kalmalıdır MetadataExtractor nesne. 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. Bkz meta sürüm daha fazla bilgi için.

Eşleşen dosya tanımlayıcılarıyla, meta veri çıkarıcı, Flatbuffers'ın ileri ve geri 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. Asgari gerekli çözümleyici sürümü meta tam olarak meta Flatbuffers okuyabilir meta ayrıştırıcı minimum sürümünü gösterir. 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. Model çağırarak meta veriler bulunur olmadığını kontrol edebilirsiniz hasMetadata yöntemi:

public boolean hasMetadata();

MetadataExtractor giriş / çıkış tensörlerle meta almak için uygun fonksiyonları 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);

Gerçi TensorFlow Lite modeli şema birden subgraphs destekler TFLite Tercüman şu anda sadece tek bir alt grafiğini desteklemektedir. Bu nedenle, MetadataExtractor yöntemlerinden bir giriş bağımsız değişken olarak atlar subgraph dizini.

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, unzip mobilenet_v1_0.75_160_quantized ve şöyle modelinde etiket dosyasını ayıklamak:

$ 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, içine dosya adı geçmesi MetadataExtractor.getAssociatedFile yöntemiyle:

public InputStream getAssociatedFile(String fileName);

Benzer şekilde, C ++, bu yöntemle, ile yapılabilir ModelMetadataExtractor::GetAssociatedFile :

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