LiteRT modellerine meta veri ekleme

LiteRT meta verileri, model açıklamaları için bir standart sunar. İlgili içeriği oluşturmak için kullanılan üst veriler, modelin ne yaptığı ve modelin nasıl çalıştığı hakkında önemli bir bilgi kaynağıdır. giriş / çıkış bilgileri. Meta veri şunları içerir:

Kaggle'da yayınlanan tüm görüntü modelleri Modeller meta verilerdir.

Meta veri biçimine sahip model

model_with_metadata
Şekil 1. Meta veriler ve ilişkili dosyalar içeren TFLite modeli.

Model meta verileri şurada tanımlanır: metadata_schema.fbs CANNOT TRANSLATE FlatBuffer dosyası olarak kaydedebilirsiniz. Şekil 1'de gösterildiği gibi, meta veriler TFLite modelinin alanı şema, "TFLITE_METADATA" adının altında. Bazı modeller ilişkili dosyalarla gelebilir, sınıflandırma etiketi, dosyaları ile kullanılabilir. Bu dosyalar, ZIP biçiminde bir orijinal model dosyasının sonuna eklenir ZipFile "append" komutunu kullanarak mod ('a' modu). TFLite Çevirmen, yeni dosya biçimini öncekiyle aynı şekilde kullanabilir. Paketi inceleyin ilgili dosyalara bakın.

Meta verileri doldurma, görselleştirme ve okuma ile ilgili aşağıdaki talimata bakın.

Meta veri araçlarını ayarlayın

Modelinize meta veri eklemeden önce bir Python programlama dili kullanmanız gerekir nasıl yararlanabileceğinize bakalım. Bu videoda, bunu buradan ayarlayabilirsiniz.

Python programlama ortamını kurduktan sonra ek araçlar:

pip install tflite-support

LiteRT meta veri araçları, Python 3'ü destekler.

Flatbuffers Python API kullanarak meta veri ekleme

Model meta verilerinin şema:

  1. Model bilgileri - Modelin genel açıklaması ve öğelerin lisans şartları gibi. Görüntüleyin ModelMetadata.
    1. Giriş bilgileri - Girişlerin ve ön işlemenin açıklaması gereken veri türlerini öğreneceğiz. Görüntüleyin SubGraphMetadata.input_tensor_metadata.
      1. Çıkış bilgileri: Sonucun açıklaması ve etiketlerle eşleme gibi işlemler gerekir. Görüntüleyin SubGraphMetadata.output_tensor_metadata.

LiteRT şu anda yalnızca tek bir alt grafiği desteklediğinden LiteRT kodu oluşturma aracı ve Android Studio ML Binding özellik yerine ModelMetadata.name ve ModelMetadata.description kullanılacak SubGraphMetadata.name ve SubGraphMetadata.description, görüntülenirken meta verileri ve kod oluşturma sürecini göz önünde bulundurun.

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

Giriş ve çıkış için LiteRT meta verileri, belirli bir giriş ve çıkış türlerini dikkate alması gerekir. Ne olduğu veya giriş ve çıkış türleri şunları içerdiği sürece model işlevsel olarak yapar: TensorFlow tarafından desteklenmektedir. Basit meta veri:

  • Özellik: İmzalanmamış tam sayılar veya kayan noktalı sayılardır.
  • 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ı.

İlgili dosyaları paketleyin

LiteRT modelleri farklı ilişkili dosyalarla gelebilir. Örneğin, doğal dil modelleri genellikle kelime parçalarını kelime ile eşleyen kelime bilgisi dosyalarına sahiptir Kimlikler; sınıflandırma modelleri, nesne kategorilerini belirten etiket dosyalarına sahip olabilir. İlişkili dosyalar (varsa) olmadan model düzgün çalışmaz.

İlişkili dosyalar artık meta veriler aracılığıyla modelle paketlenebilir Python kitaplığı. Yeni LiteRT modeli, aşağıdakileri içeren bir ZIP dosyası haline gelir: hem model hem de ilişkili dosyalar. Sık kullanılan bir ZIP dosyasında açılabilir araçlar. Bu yeni model biçimi, aynı dosya uzantısını (.tflite) kullanmaya devam ediyor. Google mevcut TFLite çerçevesi ve Çevirmeni ile uyumludur. Paket meta verileri" bölümünü inceleyin ve ilişkili dosyaları da modelini inceleyin.

İlişkili dosya bilgileri meta verilere kaydedilebilir. Şuna bağlı olarak: dosya türü ve dosyanın eklendiği yeri (ör. ModelMetadata, SubGraphMetadata ve TensorMetadata), LiRT Android kodu oluşturma aracı, ilgili öncesi/sonrası uygulayabilir otomatik olarak nesneye işlenir. <Codegen kullanımı> şunun bölümü: her bir ortak dosya tür inceleyebilirsiniz.

Normalleştirme ve niceleme parametreleri

Normalleştirme, makine öğreniminde yaygın olarak kullanılan bir veri ön işleme tekniğidir. İlgili içeriği oluşturmak için kullanılan normalleştirmenin amacı değerleri ortak bir ölçekte değiştirmektir. ve değer aralıklarındaki farklılıkları bozabilir.

Model niceleme, ağırlıkların daha düşük kesinlikte temsil edilmesine olanak tanıyan ve isteğe bağlı olarak hem depolama hem de hesaplama için etkinleştirme.

Ön işleme ve işleme sonrası, normalleştirme ve nicelik açısından birbirinden bağımsız iki adımdır. Sorunla ilgili ayrıntılar aşağıda belirtilmiştir.

Normalleştirme Nicelendirme

. Örnek parametre değerleri giriş resmi Kayan reklam ve nicel modelleri, tıklayın.
Kaydırma modeli:
- ortalama: 127,5
- std: 127.5
Nitelik modeli:
- ortalama: 127,5
- std: 127,5
Kaydırma modeli:
- sıfır Nokta: 0
- ölçek: 1,0
Nitelik modeli:
- sıfır Nokta: 128,0
- ölçek:0,0078125f

.
.
.
. Ne zaman çağrılmalı?

.
. Girişler: Giriş ise veriler normalleştirildiği zaman ve ürün ekipleri çıkarım ihtiyaçları verileri normalleştirilecek buna göre hazırlar.
. Çıkışlar: çıktı verilerin kullanımı normalleştirilmiş olmasıdır.
Kaydırma modelleri şunları yapar: ölçmeye gerek yoktur.
. Nitelikli model veya gerekmeyebilir öncesi/sonrası nicelleştirme işleniyor. Duruma göre değişken veri türüne göre giriş/çıkış tensörleridir.
. - kayan noktalı tensörler: hayır öncesi/sonrası nicelleştirme biraz zaman alabilir. Quant op ve dequant op modelimiz, grafiğe dönüştürülebilir.
. - int8/uint8 tensörleri: ve projenin devam edebilir.

.
. Formül

.
. normalleştirilmiş_giriş = (giriş - ortalama) / std
Girişler için miktar belirleme:
q = f / ölçek + zeroPoint
Şu kadar süreyle bölün: çıkışlar:
f = (q - sıfır Nokta) * ölçek

. parametreler
Model oluşturucu tarafından dolduruldu ve modelde depolanır meta verileri NormalizationOptions. Otomatik olarak doldurulan: TFLite dönüştürücü ve tflite modelinde saklanıyor dosyası olarak kaydedebilirsiniz.
Nasıl edinilir? ne olacak? Video reklamlar, MetadataExtractor API'si [2] TFLite aracılığıyla Tensor API [1] veya aracılığıyla MetadataExtractor API'sı [2]
Bolluk ve nicelik hesaplama model aynı değer nedir? Evet, kayan ve miktar modellerin de aynı Normalleştirme parametreler Hayır, kayan model ölçmeye gerek yoktur.
TFLite Kodu oluşturma aracı veya Android Studio ML bağlaması otomatik olarak oluşturmak nasıl yardımcı oluyor?
. Evet

. Evet

[1] LiteRT Java API ve LiteRT C++ API.
. [2] Meta veri ayıklayıcı kitaplığı

uint8 modelleri için görüntü verileri işlenirken normalleştirme ve niceleme, bazen atlanır. Piksel değerleri [0, 255]. Ancak genel olarak, verileri her zaman normalleştirme ve niceleme parametrelerinden yararlanabilirsiniz.

Örnekler

Farklı veri grupları için meta verilerin nasıl doldurulması gerektiğine dair farklı model türlerini görebilirsiniz:

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

Komut dosyasını indirin burada gibi bir şablon oluşturarak meta verileri 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 modellerinin meta verilerini doldurmak için model özelliklerini ekleyin. beğeni bu yazıya dökülür. Bu kılavuzun geri kalanında, teşhis yanıtlarınız doğrultusunda kullanabilirsiniz.

Resim sınıflandırma örneğini ayrıntılı olarak inceleme

Model bilgileri

Meta veri, 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ümde, modelinizin giriş ve çıkış imzasının nasıl açıklanacağı gösterilmektedir. Bu meta veriler, otomatik kod oluşturucular tarafından unutmayın. Bir tensör hakkında giriş veya çıkış bilgileri oluşturmak için:

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

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

Resim girişi

Resim, makine öğreniminde yaygın olarak kullanılan bir giriş türüdür. LiteRT meta verileri renk alanı ve ön işleme bilgileri gibi bilgileri [örneğin, yapabilirsiniz. Resmin boyutu manuel spesifikasyon gerektirmez. çünkü zaten girdi tensörünün şekliyle sağlandığından ve türetmektir.

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, ilişkili bir dosya kullanılarak çıkış tensörüyle 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]

Meta veri Flatbuffers oluşturma

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

# 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

Meta veri Sabit Arabellekleri oluşturulduktan sonra, meta veriler ve etiket dosyası TFLite dosyasına populate yöntemiyle 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()

Model içine istediğiniz sayıda ilişkilendirilmiş dosyayı load_associated_files Ancak, en azından bu dosyaları paketlemek bunu her zaman açık bir şekilde yapabilirsiniz. Bu örnekte, etiket dosyasını paketleme zorunlu.

Meta verileri görselleştirme

Netron kullanarak veya bir LiteRT modelindeki meta verileri json biçiminde okuyabilirsiniz biçimi için MetadataDisplayer kullanın:

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 üzerinden meta verilerin görüntülenmesini de destekler. Bağlama özelliği kullanıma sunduk.

Meta veri sürümü oluşturma

Meta veriler şema sürümü, hem Anlamsal sürüm oluşturma numarası ile oluşturulur. Bu numara da şema dosyasını ve Flatbuffers dosya kimliğinin hangi gerçek sürüm uyumluluğu.

Anlamsal sürüm numarası

Meta veri şeması sürümü, Anlamsal sürüm oluşturma numara, MAJOR.MINOR.PATCH gibi. Şema değişikliklerini kurallara göre izler burada bulabilirsiniz. alanları 1.0.0 sürümünden sonra eklendi.

Flatbuffers dosya kimliği

Anlamsal sürüm oluşturma, kurallara uyduğu takdirde uyumluluğu garanti eder, ancak gerçek uyumsuzluğu ima etmez. MAJOR numarasını yukarı çekerken, geriye dönük uyumluluğun bozulduğu anlamına gelmez. Bu nedenle, Flatbuffers dosyasını kullanarak kimlik, file_identifier, özelliğini kullanın. Dosya tanımlayıcısı: olması gerekir. Belirli bir meta veri şemasına sabitlenmiş olup kullanıcılar tarafından değiştirilebilir. Meta veri şemasının geriye dönük uyumluluğu bir nedenden dolayı bozulması gerekiyorsa file_identifier, örneğin, "M001"den "M002"ye değiştirin. File_identifier'nın çok daha az değiştirilmesi bekleniyor meta veriler_version'dan daha sık kullanılır.

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

Gerekli minimum meta veri ayrıştırıcısı sürüm meta veri ayrıştırıcısının (Flatbuffers tarafından oluşturulan kod) Flatbuffers meta verisinin tamamını okuyabilir. Bu sürüm fiilen doldurulan tüm alanların sürümleri arasındaki en büyük sürüm numarası ve dosya tanımlayıcısının belirttiği en küçük uyumlu sürümü kullanın. Minimum gereken meta veri ayrıştırıcı sürümü, Search Ads 360'ta bulunan Meta veriler bir TFLite modeline doldurulduğunda MetadataPopulator. Bkz. meta veri ayıklayıcıyı kullanabilirsiniz. gerekli en düşük meta veri ayrıştırıcı sürümünün kullanılması gerekir.

Modellerden meta verileri okuma

Meta Veri Ayıklayıcı kitaplığı, meta verileri okumak ve yeni verilere erişmek için farklı platformlardaki bir modelden alınmış ilişkili dosyaları (Java için sürüm ve C++ sürümünü indirin. Diğer dillerde kendi meta veri ayıklayıcı aracınızı Düz arabellek kitaplığı.

Java'da meta verileri okuma

Android uygulamanızda Meta Veri Ayıklayıcı kitaplığını kullanmak için Barındırılan LiteRT Meta Veri AAR'si MavenCentral. MetadataExtractor sınıfını ve FlatBuffers Java'yı içerir. meta veriler için bağlamalar şema ve model şeması.

Bunu build.gradle bağımlılıklarınızda aşağıdaki şekilde 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üsü eklediğinizden emin olun depo.

Bir MetadataExtractor nesnesini, işaret eden ByteBuffer ile başlatabilirsiniz açıklama:

public MetadataExtractor(ByteBuffer buffer);

ByteBuffer, tüm ömrü boyunca değişmeden kalmalıdır. MetadataExtractor nesne algılandı. Flatbuffers dosyası yüklenirken başlatma işlemi başarısız olabilir model meta verileri tanımlayıcısı, meta veri ayrıştırıcının tanımlayıcısıyla eşleşmiyor. Görüntüleyin meta veri sürümünü oluşturma başlıklı makaleyi inceleyin.

Meta veri ayıklayıcı, eşleşen dosya tanımlayıcıları olduğunda ve geriye dönük uyumluluk mekanizmasını destekler. Ancak, gelecekteki alanlar Şemalar, eski meta veri ayıklayıcılar tarafından çıkarılamaz. Gereken minimum meta verinin ayrıştırıcı sürümünü meta verileri okuyabilen meta veri ayrıştırıcının minimum sürümünü belirtir Düz tamponlar dolu. Minimum değerin geçerli olmadığını doğrulamak için aşağıdaki yöntemi kullanabilirsiniz: gerekli ayrıştırıcı sürümü koşulu karşılandı:

public final boolean isMinimumParserVersionSatisfied();

Meta verileri olmayan bir modelin geçirilmesine izin verilir. Ancak, okuması çalışma zamanı hatalarına neden olur. Bir modelin hasMetadata yöntemini çağırarak meta verileri:

public boolean hasMetadata();

MetadataExtractor, aşağıdakileri elde etmeniz için kullanışlı işlevler sunar: giriş/çıkış tensörleri meta verilerdir. Ö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);

LiteRT modeli şema birden çok alt grafiği desteklese de, TFLite Çevirmeni şu anda yalnızca bir görebilirsiniz. Bu nedenle MetadataExtractor, giriş olarak alt grafik dizinini atlar bağımsız değişkeninin yöntemlerine eklenmesi gerekir.

Modellerden ilişkili dosyaları okuma

Meta veriler ve ilişkili dosyalar içeren LiteRT modeli aslında yaygın olarak kullanılan zip araçlarıyla açılabilen bir ZIP dosyası yükleyin. Örneğin, mobilenet_v1_0.75_160_quantized ve modeldeki etiket dosyasını aşağıdaki gibi çıkarın:

$ 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ı Meta Veri Ayıklayıcı kitaplığı aracılığıyla da okuyabilirsiniz.

Java'da, dosya adını MetadataExtractor.getAssociatedFile bölümüne iletin yöntem:

public InputStream getAssociatedFile(String fileName);

Benzer şekilde, C++ ürününde bu yöntem şu yöntemle yapılabilir: ModelMetadataExtractor::GetAssociatedFile:

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