Google I / O, 18-20 Mayıs'ta geri dönüyor! Yer ayırın ve programınızı oluşturun Şimdi kaydolun
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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 Lite barındırılan modellerde ve TensorFlow Hub'da yayınlanan tüm görüntü modelleri meta verilerle doldurulmuştur.

Meta veri formatlı model

model_with_metadata
Şekil 1. Metadata ve ilişkili dosyalara sahip TFLite modeli.

Model meta verileri , bir FlatBuffer dosyası olan metadata_schema.fbs'de tanımlanır. Şekil 1'de gösterildiği gibi, TFLite model şemasının meta veri alanında "TFLITE_METADATA" adı altında "TFLITE_METADATA" . 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 Interpreter, yeni dosya biçimini eskisi gibi kullanabilir. Daha fazla bilgi için İlişkili dosyaları paketleme bölümüne bakın.

Meta verilerin nasıl doldurulacağı, görselleştirileceği ve okunacağıyla ilgili 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 olacaktır. Bunun nasıl kurulacağına dair ayrıntılı bir kılavuz burada var .

Python programlama ortamını kurduktan sonra, ek araçlar kurmanız gerekecek:

pip install tflite-support

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

Meta veri ekleme

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

  1. Model bilgileri - Modelin genel açıklaması ve lisans koşulları gibi öğeler. ModelMetadata'ya bakın.
  2. Giriş bilgileri - Girişlerin açıklaması ve normalleştirme gibi gerekli ön işlem. Bkz. SubGraphMetadata.input_tensor_metadata .
  3. Çıktı bilgileri - Çıktının açıklaması ve etiketlere eşleme gibi gerekli son işlem. 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 tasarlanmamıştır, bunun yerine giriş ve çıkış türleri dikkate alınır. Modelin işlevsel olarak ne yaptığı önemli değildir, giriş ve çıkış türleri aşağıdakilerden veya aşağıdakilerin bir kombinasyonundan oluştuğu sürece, TensorFlow Lite meta verileri tarafından desteklenir:

  • Özellik - İşaretsiz tam sayı veya float32 olan sayılar.
  • Resim - Meta veriler şu anda RGB ve gri tonlamalı resimleri 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 kelime parçalarını kelime kimlikleriyle eşleyen kelime 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 paketlenebilir. Yeni TensorFlow Lite modeli, hem modeli hem de ilişkili dosyaları içeren bir zip dosyası haline gelir. Yaygın fermuar araçlarıyla ambalajından çıkarılabilir. Bu yeni model biçimi aynı dosya uzantısı olan .tflite kullanmaya devam ediyor. Mevcut TFLite çerçevesi ve Yorumlayıcı ile uyumludur. Daha fazla ayrıntı için bkz. Mtadata ve ilişkili dosyaları modele paketleme .

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

Normalleştirme ve niceleme 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ış kesinlikte temsillerine ve isteğe bağlı olarak hem depolama hem de hesaplama için etkinleştirmelere 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. İş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.
Yüzer model :
- ortalama: 127.5
- standart: 127.5
Quant modeli :
- ortalama: 127.5
- standart: 127.5
Yüzer model :
- zeroPoint: 0
- ölçek: 1.0
Quant modeli :
- zeroPoint: 128.0
- ölçek: 0.0078125f




Ne zaman çağırılmalı?


Girdiler : Eğitimde giriş verileri normalize edilirse, çıkarımın girdi verilerinin buna göre normalleştirilmesi gerekir.
Çıktılar : çıktı verileri genel olarak normalleştirilmeyecektir.
Float modelleri nicelemeye ihtiyaç duymaz.
Nicelleştirilmiş model , ön / son işlemede nicelemeye ihtiyaç duyabilir veya gerekmeyebilir. Giriş / çıkış tensörlerinin veri türüne bağlıdır.
- yüzer tensörler: ön / son işlemede niceleme gerekmez. Quant op ve dequant op, model grafiğine eklenir.
- int8 / uint8 tensörleri: ön / son işlemede nicemlemeye ihtiyaç duyar.


Formül


normalized_input = (girdi - ortalama) / std
Girişler için nicelleştirme :
q = f / ölçek + sıfır noktası
Çıktılar için dequantize :
f = (q - sıfır noktası) * ölçek

Parametreler nerede
Model oluşturucu tarafından doldurulur ve NormalizationOptions olarak model meta verilerinde 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 [2] aracılığıyla TFLite Tensor API [1] veya MetadataExtractor API [2] aracılığıyla
Float ve quant modelleri aynı değeri paylaşır mı? Evet, float ve quant modelleri aynı Normalizasyon parametrelerine sahiptir Hayır, kayan modelin nicelemeye ihtiyacı yoktur.
TFLite Kod oluşturucu veya Android Studio ML bağlama, 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ü verilerini işlerken, normalleştirme ve niceleme bazen atlanır. Piksel değerleri [0, 255] aralığında olduğunda bunu yapmak sorun değil. Ancak genel olarak, verileri her zaman uygulanabilir olduğunda normalleştirme ve niceleme parametrelerine göre işlemelisiniz.

Örnekler

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

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

Meta verileri mobilenet_v1_0.75_160_quantized.tflite'a dolduran 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 üzere, bunun gibi model özelliklerini komut dosyasına ekleyin. Bu kılavuzun geri kalanı, temel unsurları açıklamak için görüntü sınıflandırma örneğindeki bazı temel bölümleri vurgulayacaktır.

Görüntü sınıflandırma örneğini derinlemesine inceleyin

Model bilgisi

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, ön ve son işlem kodu oluşturmak için otomatik kod üreteçleri tarafından 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 girdi 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, zaten giriş tensörünün şekli tarafından sağlandığından ve otomatik olarak çıkarılabildiğinden manuel spesifikasyon 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 çıkışı

Etiket, TENSOR_AXIS_LABELS kullanılarak ilişkili bir dosya aracılığıyla bir çıktı tensörüne 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]

Metadata Flatbuffers'ı 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()

Meta verileri ve ilişkili dosyaları modele paketleyin

Metadata Flatbuffers oluşturulduktan sonra, meta veriler ve etiket dosyası populate yöntemi ile 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ı load_associated_files . Ancak, en azından meta verilerde belgelenen dosyaları paketlemek gerekir. Bu örnekte, etiket dosyasını paketlemek 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, meta verilerin Android Studio ML Binding özelliği aracılığıyla görüntülenmesini de destekler.

Meta veri versiyonlama

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

Anlamsal sürüm oluşturma numarası

Meta veri şeması, MAJOR.MINOR.PATCH gibi Anlamsal sürüm oluşturma numarasıyla sürümlenir. 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 versiyonlama, kurallara uyulduğu takdirde uyumluluğu garanti eder, ancak gerçek uyumsuzluk anlamına gelmez. MAJOR sayısının artması, 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 kimliğini ( file_identifier) ​​kullanıyoruz . Dosya tanımlayıcı tam olarak 4 karakter uzunluğundadır. Belirli bir meta veri şemasına sabitlenmiştir ve kullanıcılar tarafından değiştirilemez. Meta veri şemasının geriye dönük uyumluluğunun herhangi bir nedenle bozulması gerekirse, dosya tanımlayıcısı, örneğin "M001" den "M002" ye yükselecektir. Dosya tanımlayıcısının meta veri_sürümünden çok daha az değiştirilmesi beklenir.

Gerekli minimum meta veri ayrıştırıcı sürümü

Gerekli minimum meta veri ayrıştırıcı sürümü , Flatbuffers meta verilerini tam olarak okuyabilen meta veri ayrıştırıcısının (Flatbuffers tarafından üretilen kod) minimum sürümüdür. Sürüm, doldurulan tüm alanların sürümleri arasındaki en büyük sürüm numarası ve dosya tanımlayıcı tarafından belirtilen en küçük uyumlu sürümdür. MetadataPopulator veriler bir TFLite modeline doldurulduğunda, gerekli minimum meta veri ayrıştırıcı sürümü MetadataPopulator tarafından otomatik olarak doldurulur. Gerekli minimum 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.

Modellerdeki meta verileri okuyun

Metadata Extractor kitaplığı, farklı platformlarda 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 başka dillerde kendi meta veri çıkarıcı aracınızı oluşturabilirsiniz.

Meta verileri Java'da okuyun

Metadata Extractor kitaplığını Android uygulamanızda kullanmak için MavenCentral'da barındırılan TensorFlow Lite Metadata AAR'ı kullanmanızı öneririz . MetadataExtractor sınıfının yanı sıra, 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'
}

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

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

public MetadataExtractor(ByteBuffer buffer);

ByteBuffer , MetadataExtractor nesnesinin tü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ümlemesine bakın.

Eşleşen dosya tanımlayıcıları ile meta veri çıkarıcı, Flatbuffers'ın ileri ve geri uyumluluk mekanizması nedeniyle tüm geçmiş ve gelecekteki şemalardan üretilen meta verileri başarıyla okuyacaktır. Ancak, gelecekteki şemalardan alanlar eski meta veri ayıklayıcıları tarafından ayıklanamaz. Meta verilerin minimum gerekli ayrıştırıcı sürümü , Flatbuffers meta verilerini tam olarak okuyabilen minimum meta veri ayrıştırıcı sürümünü belirtir. Gerekli minimum 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 veriler olmadan bir modele geçişe izin verilir. Ancak, meta verilerden okuyan yöntemlerin çağrılması, çalışma zamanı hatalarına neden olur. hasMetadata yöntemini çağırarak bir modelin meta veriye sahip olup olmadığını kontrol edebilirsiniz:

public boolean hasMetadata();

MetadataExtractor , giriş / çıkış tensörlerinin meta verilerini almanız için kullanışlı 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ş bağımsız değişkeni olarak alt grafik dizinini atlar.

İlişkili dosyaları modellerden okuyun

Metadata ve ilişkili dosyalara sahip TensorFlow Lite modeli, esasen, 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'in sıkıştırmasını açabilir ve modeldeki etiket dosyasını aşağıdaki gibi çıkarabilirsiniz:

$ 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 MetadataExtractor.getAssociatedFile :

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;