Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

TensorFlow Lite Model Maker ile görüntü sınıflandırma

TensorFlow.org'da görüntüleyin Google Colab'de çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin TF Hub modeline bakın

Model Maker kitaplığı, bu modeli cihaz üzerinde makine öğrenimi uygulamaları için dağıtırken bir TensorFlow sinir ağı modelini özel giriş verilerine uyarlama ve dönüştürme sürecini basitleştirir.

Bu defter, çiçekleri bir mobil cihazda sınıflandırmak için yaygın olarak kullanılan bir görüntü sınıflandırma modelinin uyarlanmasını ve dönüştürülmesini göstermek için bu Model Maker kitaplığını kullanan uçtan uca bir örneği göstermektedir.

Önkoşullar

Bu örneği çalıştırmak için, biz GitHub'dan o Modeli Üretici paketinin dahil olmak üzere birçok gerekli paketleri, yüklemeniz gerekir Repo .

pip install tflite-model-maker

Gerekli paketleri içe aktarın.

import numpy as np

import tensorflow as tf
assert tf.__version__.startswith('2')

from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import image_classifier
from tflite_model_maker import ImageClassifierDataLoader
from tflite_model_maker import model_spec

import matplotlib.pyplot as plt

Basit Uçtan Uca Örnek

Veri yolunu alın

Bu basit uçtan uca örnekle oynayabileceğiniz bazı görüntüler alalım. Model Maker için yüzlerce görüntü iyi bir başlangıç ​​olurken, daha fazla veri daha iyi doğruluk sağlayabilir.

Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 1s 0us/step

image_path kendi görüntü klasörlerinizle değiştirebilirsiniz. Colab'a veri yüklemeye gelince, aşağıdaki resimde kırmızı dikdörtgenle gösterilen sol kenar çubuğunda yükleme düğmesini bulabilirsiniz. Bir zip dosyası yüklemeyi ve sıkıştırmayı açmayı deneyin. Kök dosya yolu, geçerli yoldur.

Dosya yükleme

Görüntülerinizi buluta yüklememeyi tercih ederseniz, GitHub'daki kılavuzu izleyerek kitaplığı yerel olarak çalıştırmayı deneyebilirsiniz.

Örneği çalıştırın

Örnek, aşağıda gösterildiği gibi, her biri genel sürecin bir adımını temsil eden 4 satır koddan oluşmaktadır.

Adım 1. Cihazdaki bir ML uygulamasına özgü giriş verilerini yükleyin. Eğitim verilerine ve test verilerine bölün.

data = ImageClassifierDataLoader.from_folder(image_path)
train_data, test_data = data.split(0.9)
INFO:tensorflow:Load image with size: 3670, num_label: 5, labels: daisy, dandelion, roses, sunflowers, tulips.

Adım 2. TensorFlow modelini özelleştirin.

model = image_classifier.create(train_data)

Adım 3. Modeli değerlendirin.

loss, accuracy = model.evaluate(test_data)

Adım 4. TensorFlow Lite modeline aktarın.

Burada, TensorFlow Lite modelini, model açıklamaları için bir standart sağlayan meta verilerle dışa aktarıyoruz. Etiket dosyası meta verilere gömülüdür.

Kendi kullanımınız için yükleme kısmıyla aynı şekilde sol kenar çubuğundan indirebilirsiniz.

model.export(export_dir='.')

Bu basit 4 adımdan sonra, TensorFlow Lite model dosyasını, görüntü sınıflandırma referans uygulamasında olduğu gibi cihaz üstü uygulamalarda da kullanabiliriz.

Ayrıntılı Süreç

Şu anda, EfficientNet-Lite * modelleri, MobileNetV2, ResNet50 gibi çeşitli modelleri görüntü sınıflandırması için önceden eğitilmiş modeller olarak destekliyoruz. Ancak bu kitaplığa yalnızca birkaç satır kodla önceden eğitilmiş yeni modeller eklemek çok esnektir.

Aşağıda, daha fazla ayrıntı göstermek için bu uçtan uca örnek adım adım açıklanmaktadır.

1. Adım: Cihaz Üzerindeki ML Uygulamasına Özel Giriş Verilerini Yükleyin

Çiçek veri seti 5 sınıfa ait 3670 görüntü içerir. Veri kümesinin arşiv sürümünü indirin ve arşive kaldırın.

Veri kümesi aşağıdaki dizin yapısına sahiptir:

flower_photos
|__ daisy
    |______ 100080576_f52e8ee070_n.jpg
    |______ 14167534527_781ceb1b7a_n.jpg
    |______ ...
|__ dandelion
    |______ 10043234166_e6dd915111_n.jpg
    |______ 1426682852_e62169221f_m.jpg
    |______ ...
|__ roses
    |______ 102501987_3cdb8e5394_n.jpg
    |______ 14982802401_a3dfb22afb.jpg
    |______ ...
|__ sunflowers
    |______ 12471791574_bb1be83df4.jpg
    |______ 15122112402_cafa41934f.jpg
    |______ ...
|__ tulips
    |______ 13976522214_ccec508fe7.jpg
    |______ 14487943607_651e8062a1_m.jpg
    |______ ...
image_path = tf.keras.utils.get_file(
      'flower_photos.tgz',
      'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
      extract=True)
image_path = os.path.join(os.path.dirname(image_path), 'flower_photos')

Verileri yüklemek için ImageClassifierDataLoader sınıfını kullanın.

from_folder() yöntemine gelince, klasörden veri yükleyebilir. Aynı sınıfın resim verilerinin aynı alt dizinde olduğunu ve alt klasör adının sınıf adı olduğunu varsayar. Şu anda, JPEG kodlu resimler ve PNG kodlu resimler desteklenmektedir.

data = ImageClassifierDataLoader.from_folder(image_path)

Eğitim verilerine (% 80), doğrulama verilerine (% 10, isteğe bağlı) ve test verilerine (% 10) bölün.

train_data, rest_data = data.split(0.8)
validation_data, test_data = rest_data.split(0.5)

Etiketli 25 resim örneği göster.

plt.figure(figsize=(10,10))
for i, (image, label) in enumerate(data.gen_dataset().unbatch().take(25)):
  plt.subplot(5,5,i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)
  plt.xlabel(data.index_to_label[label.numpy()])
plt.show()

Adım 2: TensorFlow Modelini Özelleştirin

Yüklenen verilere göre özel bir görüntü sınıflandırıcı modeli oluşturun. Varsayılan model EfficientNet-Lite0'dır.

model = image_classifier.create(train_data, validation_data=validation_data)

Ayrıntılı model yapısına bir göz atın.

model.summary()

3. Adım: Özelleştirilmiş Modeli Değerlendirin

Modelin sonucunu değerlendirin, modelin kaybını ve doğruluğunu alın.

loss, accuracy = model.evaluate(test_data)

Öngörülen sonuçları 100 test görüntüsünde çizebiliriz. Kırmızı renkli tahmin edilen etiketler yanlış tahmin edilen sonuçlar iken diğerleri doğrudur.

# A helper function that returns 'red'/'black' depending on if its two input
# parameter matches or not.
def get_label_color(val1, val2):
  if val1 == val2:
    return 'black'
  else:
    return 'red'

# Then plot 100 test images and their predicted labels.
# If a prediction result is different from the label provided label in "test"
# dataset, we will highlight it in red color.
plt.figure(figsize=(20, 20))
predicts = model.predict_top_k(test_data)
for i, (image, label) in enumerate(test_data.gen_dataset().unbatch().take(100)):
  ax = plt.subplot(10, 10, i+1)
  plt.xticks([])
  plt.yticks([])
  plt.grid(False)
  plt.imshow(image.numpy(), cmap=plt.cm.gray)

  predict_label = predicts[i][0][0]
  color = get_label_color(predict_label,
                          test_data.index_to_label[label.numpy()])
  ax.xaxis.label.set_color(color)
  plt.xlabel('Predicted: %s' % predict_label)
plt.show()

Doğruluk uygulama gereksinimini karşılamıyorsa, daha büyük bir modele geçmek, yeniden eğitim parametrelerini ayarlamak gibi alternatifleri keşfetmek için Gelişmiş Kullanım'a başvurulabilir.

Adım 4: TensorFlow Lite Modeline Aktarın

Mevcut modeli meta verilerle TensorFlow Lite model formatına dönüştürün. Varsayılan TFLite dosya adı model.tflite .

model.export(export_dir='.')

TensorFlow Lite modelinin mobil uygulamalara nasıl entegre edileceği hakkında daha fazla ayrıntı için örnek uygulamalara ve görüntü sınıflandırma kılavuzlarına bakın.

İzin verilen dışa aktarma biçimleri aşağıdakilerden biri veya bir listesi olabilir:

  • ExportFormat.TFLITE
  • ExportFormat.LABEL
  • ExportFormat.SAVED_MODEL

Varsayılan olarak, yalnızca TensorFlow Lite modelini meta verilerle dışa aktarır. Ayrıca, farklı dosyaları seçmeli olarak dışa aktarabilirsiniz. Örneğin, yalnızca etiket dosyasını aşağıdaki gibi dışa aktarın:

model.export(export_dir='.', export_format=ExportFormat.LABEL)

Tflite modelini eval_tflite yöntemiyle de evaluate_tflite .

model.evaluate_tflite('model.tflite', test_data)

Gelişmiş Kullanım

create işlevi, bu kitaplığın kritik bir parçasıdır. Öğreticiye benzer önceden eğitilmiş bir modelle transfer öğrenmeyi kullanır.

create işlevi aşağıdaki adımları içerir:

  1. Verileri, parametre validation_ratio ve test_ratio göre eğitim, doğrulama, test verilerine test_ratio . validation_ratio ve test_ratio varsayılan değeri 0.1 ve 0.1 .
  2. TensorFlow Hub'dan temel model olarak bir Görüntü Özellik Vektörü indirin. Varsayılan önceden eğitilmiş model EfficientNet-Lite0'dır.
  3. dropout_rate katmanı ile önceden eğitilmiş model arasına dropout_rate olan bir Bırakma Katmanı ile bir sınıflandırıcı başlığı ekleyin. Varsayılan dropout_rate hızı , TensorFlow Hub tarafından make_image_classifier_lib'deki varsayılan dropout_rate değeridir.
  4. Ham giriş verilerini önceden işleyin. Şu anda, giriş ölçeğini modellemek için her görüntü pikselinin değerini normalleştirme ve bunu model giriş boyutuna yeniden boyutlandırma dahil olmak üzere ön işleme adımları. EfficientNet-Lite0, giriş ölçeğine [0, 1] ve giriş görüntü boyutuna [224, 224, 3] .
  5. Verileri sınıflandırıcı modeline besleyin. Varsayılan olarak, bu tür eğitim devirlerin, seri boyutu, öğrenme hızı, ivme olarak eğitim parametreleri varsayılan değerlerdir make_image_classifier_lib TensorFlow Hub tarafından. Yalnızca sınıflandırıcı kafası eğitilir.

Bu bölümde, farklı bir görüntü sınıflandırma modeline geçiş, eğitim hiperparametrelerini değiştirme vb. Dahil olmak üzere birçok gelişmiş konuyu açıklıyoruz.

TensorFLow Lite modelinde eğitim sonrası niceleme

Eğitim sonrası niceleme , model boyutunu ve çıkarım gecikmesini azaltabilen, aynı zamanda model doğruluğunda çok az bozulma ile CPU ve donanım hızlandırıcı gecikmesini iyileştirebilen bir dönüştürme tekniğidir. Bu nedenle, modeli optimize etmek için yaygın olarak kullanılır.

Model Maker, birden fazla eğitim sonrası niceleme seçeneğini destekler. Örnek olarak tam tamsayı nicemlemeyi alalım. İlk olarak, girdi ve çıktı dahil tüm işlemler için tam tamsayı nicelemeyi zorlamak için niceleme yapılandırmasını tanımlayın. Giriş türü ve çıktı türü varsayılan olarak uint8 . Ayrıca, int8 inference_input_type ve inference_output_type ayarlayarak bunları int8 gibi diğer türlere de değiştirebilirsiniz.

config = configs.QuantizationConfig.create_full_integer_quantization(representative_data=test_data, is_integer_only=True)

Ardından TensorFlow Lite modelini böyle bir konfigürasyonla dışa aktarıyoruz.

model.export(export_dir='.', tflite_filename='model_quant.tflite', quantization_config=config)

model_quant.tflite adlı modeli sol kenar çubuğundan, yukarıda belirtilen yükleme kısmıyla aynı şekilde indirebilirsiniz.

Modeli değiştirin

Bu kitaplıkta desteklenen modele geçin.

Bu kütüphane, EfficientNet-Lite modellerini, MobileNetV2, ResNet50'yi şimdiye kadar desteklemektedir. EfficientNet-Lite , son teknoloji doğruluğa ulaşabilen ve Edge cihazları için uygun olan bir görüntü sınıflandırma modelleri ailesidir. Varsayılan model EfficientNet-Lite0'dır.

Biz sadece parametre ayarlayarak MobileNetV2 modeli geçiş olabilir model_spec için mobilenet_v2_spec içinde create yöntemi.

model = image_classifier.create(train_data, model_spec=model_spec.mobilenet_v2_spec, validation_data=validation_data)

Test verilerindeki doğruluğu ve kaybı görmek için yeni yeniden eğitilmiş MobileNetV2 modelini değerlendirin.

loss, accuracy = model.evaluate(test_data)

TensorFlow Hub'da modele geçin

Ayrıca, TensorFlow Hub formatıyla bir görüntüyü girip bir özellik vektörü çıkaran diğer yeni modellere de geçebiliriz.

Örnek olarak Inception V3 modeli olarak, ImageModelSpec bir nesnesi olan ve Inception V3 modelinin özelliklerini içeren inception_v3_spec tanımlayabiliriz.

Biz model adı belirtmeniz gerekir name , TensorFlow Hub modeli url uri . Bu arada, input_image_shape varsayılan değeri [224, 224] input_image_shape . Inception V3 modeli için bunu [299, 299] olarak değiştirmemiz gerekiyor.

inception_v3_spec = model_spec.ImageModelSpec(
    uri='https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1')
inception_v3_spec.input_image_shape = [299, 299]

Ardından, ayarı tarafından parametre model_spec için inception_v3_spec içinde create yöntemi, biz Inception V3 modelinin yeniden eğitmek olabilir.

Kalan adımlar tamamen aynı ve sonunda özelleştirilmiş bir InceptionV3 TensorFlow Lite modeli elde edebiliriz.

Kendi özel modelinizi değiştirin

TensorFlow Hub'da olmayan özel modeli kullanmak istiyorsak, ModelSpec'i TensorFlow Hub'da oluşturmalı ve dışa aktarmalıyız .

Ardından yukarıdaki işlem gibi ImageModelSpec nesnesini tanımlamaya başlayın.

Eğitim hiper parametrelerini değiştirin

Biz de böyle bir eğitim hyperparameters değiştirebilecek epochs , dropout_rate ve batch_size modeli doğruluğunu etkileyebilir. Ayarlayabileceğiniz model parametreleri şunlardır:

  • epochs : Daha fazla çağ, yakınsayıncaya kadar daha iyi doğruluk elde edebilir, ancak çok fazla dönem için eğitim aşırı uyuma neden olabilir.
  • dropout_rate : Bırakma oranı, aşırı uymaktan kaçının. Varsayılan olarak hiçbiri.
  • batch_size : bir eğitim adımında kullanılacak örnek sayısı. Varsayılan olarak hiçbiri.
  • validation_data : Doğrulama verileri. Yok ise, doğrulama sürecini atlar. Varsayılan olarak hiçbiri.
  • train_whole_model : train_whole_model , Hub modülü üstteki sınıflandırma katmanı ile birlikte eğitilir. Aksi takdirde, yalnızca en üst sınıflandırma katmanını eğitin. Varsayılan olarak hiçbiri.
  • learning_rate : Temel öğrenme oranı. Varsayılan olarak hiçbiri.
  • momentum : optimize ediciye iletilen bir Python kayan nokta. Yalnızca use_hub_library True olduğunda kullanılır. Varsayılan olarak hiçbiri.
  • shuffle : Boolean, verilerin karıştırılıp karıştırılmayacağı. Varsayılan olarak yanlış.
  • use_augmentation : Boolean, önişleme için veri use_augmentation kullanın. Varsayılan olarak yanlış.
  • use_hub_library : Boolean, kullanım make_image_classifier_lib tensorflow göbekten modelini yeniden eğitmek. Bu eğitim hattı, birçok kategoriyle karmaşık veri kümeleri için daha iyi performans sağlayabilir. Varsayılan olarak doğrudur.
  • warmup_steps : Öğrenme oranındaki ısınma programı için ısınma adımlarının sayısı. Yok ise, iki dönemdeki toplam eğitim adımları olan varsayılan ısınma_adımları kullanılır. Yalnızca use_hub_library False olduğunda kullanılır. Varsayılan olarak hiçbiri.
  • model_dir : İsteğe bağlı, model kontrol noktası dosyalarının konumu. Yalnızca use_hub_library False olduğunda kullanılır. Varsayılan olarak hiçbiri.

Gibi varsayılan olarak Yok olan parametreler epochs somut varsayılan parametreleri alacak make_image_classifier_lib TensorFlow Hub kütüphane ya gelen train_image_classifier_lib .

Örneğin, daha fazla çağla eğitim yapabiliriz.

model = image_classifier.create(train_data, validation_data=validation_data, epochs=10)

Yeni yeniden eğitilmiş modeli 10 eğitim dönemi ile değerlendirin.

loss, accuracy = model.evaluate(test_data)