iOS'te TensorFlow Lite ile Çiçekleri Tanıyın

1. Giriş

657431be3173fa86.png

TensorFlow çok amaçlı bir makine öğrenimi çerçevesidir. TensorFlow, buluttaki kümeler genelinde büyük modelleri eğitmekten telefonunuz gibi yerleşik bir sistemde modelleri yerel olarak çalıştırmaya kadar her yerde kullanılabilir.

Bu codelab'de, iOS cihazda görüntü tanıma modeli çalıştırmak için TensorFlow Lite kullanılır.

Öğrenecekleriniz

  • TFLite dönüştürücüyü kullanarak modelinizi optimize etme
  • TFLite yorumlayıcısını kullanarak önceden hazırlanmış bir iOS uygulamasında çalıştırma.

Oluşturacağınız nedir?

Çiçekleri tanımlamak için TensorFlow görüntü tanıma programı çalıştıran basit bir kamera uygulaması.

Ön koşullar

Bu codelab'i kendi donanımınızda yapıyorsanız lütfen aşağıdakilerin yüklü olduğundan emin olun:

  • Xcode 10 veya sonraki sürümler
  • CocoaPods 1.8.0 veya sonraki sürümler

c45ecd122998622e.png

Lisans: Ücretsiz kullanım

2. Colab'i kullanarak bir çiçek figürü eğitin

Bu codelab'de Colaboratory ve Xcode kullanılacaktır.

Aktarımla öğrenme yöntemini kullanarak çiçekleri tanımak ve mobil uygulamada kullanılacak bir TFLite modelini dışa aktarmak için bir sınıflandırıcıyı eğitmek için TensorFlow Lite Model Maker'ı kullanan Colab'ı açın.

3. Çalışma dizinini ayarlama

Git deposunu klonlama

Aşağıdaki komut, bu codelab için gerekli olan dosyaları içeren Git deposunu klonlar:

git clone https://github.com/tensorflow/examples.git

Şimdi, az önce oluşturduğunuz klonun Xcode proje köküne cd ekleyin. Bu codelab'in geri kalan kısmı için şurada çalışırsınız:

cd examples/lite/examples/image_classification/ios

4. iOS uygulamasını kurma

Bağımlılıkları Yükleme

CocoaPods'u kullanarak iOS uygulamasının bağımlılıklarını (TensorFlow Lite dahil) yükleyin. Yükleme komutu tamamlandıktan sonra projeyi Xcode'da açmak için ImageClassification.xcworkspace dosyasını açın.

pod install --repo-update
open ImageClassification.xcworkspace

5. Uygulamayı test etme

iOS Simülatörü'nün Mac'inizin kamerasına erişimi olmadığından, kamerayı kullanmak için uygulamanın gerçek bir cihazda çalıştırılması gerekir. iOS cihaz derlemek için Apple Geliştirici Programı'na kayıtlı olmanız veya başka birinin sizin için temel hazırlığını yaptığı bir cihaza erişiminiz olması gerekir.

Simülatörde bu codelab'i çalıştırmak istiyorsanız simülatörün kendisinde Safari'den yapıştırma panosuna görüntü kopyalamanız gerekir. Simülasyon aracında görüntü işleme adımları şunlardır:

  1. Uygulamayı, seçtiğiniz bir simülatör hedefi için derleyin.
  2. iOS simülatöründe uygulamayı küçültmek için Cmd+Üst Karakter+H tuşlarına basın.
  3. Ana ekranın alt kısmındaki Safari'ye dokunun ve bir resim arayın.
  4. Google Görsel arama sonuçlarında bir sonuca dokunun ve resme uzun basın. Açılan iletişim kutusunda "Kopyala"yı seçin.
  5. TFL Classify uygulamasına dönün. Kopyalanan resim, çıkarım sonuçlarıyla birlikte otomatik olarak gösterilir. Görünmüyorsa resmin URL'sini değil, resim verilerini kopyaladığınızdan emin olun.

Uygulamayı test etme ve yükleme

Uygulamada herhangi bir değişiklik yapmadan önce depoyla birlikte gönderilen sürümü çalıştıralım. Sol üstteki açılır menüden iOS cihazınızı seçin:

275753d3a77a0df3.png

Ardından uygulamayı cihazınızda oluşturmak için Cmd+R tuşlarına basın veya Xcode'da Oynat f96cf117245c0fa6.png düğmesine basın. Uygulama, cihazınıza yüklendikten sonra otomatik olarak başlar.

Uygulamanın bu sürümü, 1.000 ImageNet kategorisinde önceden eğitilmiş standart MobileNet'i kullanır. Şuna benzer bir görünümde olacaktır:

d11436f0bb5a75db.jpeg

6. Özelleştirilmiş uygulamayı çalıştırın

Varsayılan uygulama kurulumu, standart MobileNet'i kullanarak resimleri 1.000 ImageNet sınıfından birinde sınıflandırır.

Şimdi uygulamayı, Colab'de eğitilen özel resim kategorilerimiz için yeniden eğitilen modelimizi kullanacak şekilde değiştirelim.

7. Uygulamayı, modelinizi çalıştıracak şekilde dönüştürme

Model dosyalarınızı projeye ekleyin

Projenin model kaynakları, Xcode proje gezgininde ImageClassification > Model konumunda bulunur. Bunları değiştirmek için önce Model grubundaki mevcut iki dosyayı silin. İstendiğinde "Çöp kutusuna taşı"yı seçin:

cf2f7fefb2e5075f.png

Ardından, Colab'den indirdiğiniz model.tflite ve labels.txt dosyalarını Model grubuna sürükleyin. İstendiğinde hem Copy items if needed hem de Add to targets öğesinin seçili olduğundan emin olun.

281d7eb72635bb5f.png

Uygulamanın kodunu değiştirme

Uygulamamızın çalışmasını sağlamak için model yükleme mantığının yolunu, eklediğimiz yeni modele işaret edecek şekilde güncellememiz gerekiyor.

ModelDataHandler.swift dosyasını açın (Xcode gezgin yolu: ImageClassification -> ModelDataHandler -> ModelDataHandler.swift) ve 36. satırı

// before
static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite")

// after
static let modelInfo: FileInfo = (name: "model", extension: "tflite")

Tüm değişiklikleri kaydettiğinizden emin olun.

8. Özelleştirilmiş uygulamayı çalıştırın

Uygulamayı cihazınızda oluşturmak için Cmd+B tuşlarına basın veya Xcode'da Oynat f96cf117245c0fa6.png düğmesine basın. Uygulama başlatıldıktan sonra şu şekilde görünmelidir:

c45ecd122998622e.png

Ekran görüntüsü almak için güç ve sesi artırma düğmelerini aynı anda basılı tutabilirsiniz.

Şimdi web'de çiçek araması yapmayı deneyin, kamerayı bilgisayar ekranına doğrultun ve bu resimlerin doğru şekilde sınıflandırılıp sınıflandırılmadığını kontrol edin.

Ya da bir arkadaşınızdan fotoğrafınızı çekmesini isteyin ve ne tür bir TensorFlow kullanıcısı olduğunuzu öğrenin \\uf339 \\uf33b \\uf337!

9. İşleyiş şekli

Artık uygulama çalıştığına göre, TensorFlow Lite'a özgü koda bakalım.

TensorFlowLiteSwift

Bu uygulama, CocoaPods aracılığıyla TensorFlowLite Swift kitaplığını kullanır. Swift kitaplığı, kendisi de TFLite C++ kitaplığının sarmalayıcısı olan TFLite C API üzerinde ince bir sarmalayıcıdır.

Modülün Podfile dosyasında yer alan aşağıdaki satırlar, kapsül global CocoaPods spesifikasyon deposunun en yeni sürümünü projeye çeker.

Pod dosyası

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

TensorFlow Lite Swift API'yi kullanma

TensorFlow Lite ile etkileşimde bulunan kodun tamamı ModelDataHandler.swift içinde bulunur.

Kurulum

İlgilenilen ilk blok, ModelDataHandler için başlatıcıdır:

ModelDataHandler.swift

/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
  let modelFilename = modelFileInfo.name

  // Construct the path to the model file.
  guard let modelPath = Bundle.main.path(
    forResource: modelFilename,
    ofType: modelFileInfo.extension
  ) else {
    print("Failed to load the model file with name: \(modelFilename).")
    return nil
  }

  // Specify the options for the `Interpreter`.
  self.threadCount = threadCount
  var options = InterpreterOptions()
  options.threadCount = threadCount
  do {
    // Create the `Interpreter`.
    interpreter = try Interpreter(modelPath: modelPath, options: options)
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()
  } catch let error {
    print("Failed to create the interpreter with error: \(error.localizedDescription)")
    return nil
  }
  // Load the classes listed in the labels file.
  loadLabels(fileInfo: labelsFileInfo)
}

Daha ayrıntılı olarak ele alınması gereken birkaç satır var.

Aşağıdaki satır TFLite çevirmenini oluşturur:

ModelDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

Yorumlayıcı, ham veri girişlerini TensorFlow grafiği üzerinden iletmekten sorumludur. Çevirmene disk üzerindeki modelimize giden yolu iletiriz ve çevirmen bunu bir FlatBufferModel olarak yükler.

Son satır etiket listesini yükler:

loadLabels(fileInfo: labelsFileInfo)

Bu işlem, dizeleri bir metin dosyasından belleğe yüklemektir.

Modeli çalıştırma

İlgilenilen ikinci blok runModel yöntemidir. Giriş olarak bir CVPixelBuffer alır, çevirmeni çalıştırır ve uygulamada yazdırılacak metni döndürür.

ModelDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

10. Sıradaki adım:

Daha fazla bilgi edinmek için aşağıdaki bağlantılardan yararlanabilirsiniz: