Mengenali Bunga dengan TensorFlow Lite di iOS

1. Pengantar

657431be3173fa86.pngS

TensorFlow adalah framework machine learning serbaguna. TensorFlow dapat digunakan di mana saja, mulai dari melatih model besar di berbagai cluster di cloud, hingga menjalankan model secara lokal pada sistem tersemat seperti ponsel Anda.

Codelab ini menggunakan TensorFlow Lite untuk menjalankan model pengenalan citra di perangkat iOS.

Yang Akan Anda Pelajari

  • Cara mengoptimalkan model menggunakan konverter TFLite.
  • Cara menjalankannya di aplikasi iOS siap pakai menggunakan penerjemah TFLite.

Yang akan Anda buat

Aplikasi kamera sederhana yang menjalankan program pengenalan gambar TensorFlow untuk mengidentifikasi bunga.

Prasyarat

Jika menjalankan codelab ini di hardware Anda sendiri, pastikan Anda telah menginstal berikut ini:

  • Xcode 10 atau yang lebih tinggi
  • CocoaPods 1.8.0 atau yang lebih tinggi

c45ecd122998622e.png

Lisensi: Gratis digunakan

2. Melatih pengenal bunga menggunakan Colab

Codelab ini akan menggunakan Colaboratory dan Xcode.

Buka Colab yang menggunakan TensorFlow Lite Model Maker untuk melatih pengklasifikasi agar mengenali bunga menggunakan pemelajaran transfer dan mengekspor model TFLite untuk digunakan di aplikasi seluler.

3. Menyiapkan direktori kerja

Meng-clone repositori Git

Perintah berikut akan meng-clone repositori Git yang berisi file yang diperlukan untuk codelab ini:

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

Sekarang, masukkan cd ke root project Xcode dari clone yang baru saja Anda buat. Di situlah Anda akan bekerja selama sisa codelab ini:

cd examples/lite/examples/image_classification/ios

4. Menyiapkan aplikasi iOS

Menginstal Dependensi

Dengan menggunakan CocoaPods, instal dependensi aplikasi iOS (termasuk TensorFlow Lite). Setelah perintah instal selesai, buka ImageClassification.xcworkspace untuk membuka project di Xcode.

pod install --repo-update
open ImageClassification.xcworkspace

5. Menjalankan pengujian aplikasi

Untuk menggunakan kamera, aplikasi harus dijalankan di perangkat sebenarnya karena Simulator iOS tidak memiliki akses ke kamera Mac Anda. Untuk membangun aplikasi di perangkat iOS, Anda harus terdaftar di Apple Developer Program atau memiliki akses ke perangkat yang telah disediakan orang lain untuk Anda.

Jika ingin menjalankan codelab ini di simulator, Anda harus menyalin gambar ke pasteboard dari Safari di simulator itu sendiri. Berikut adalah langkah-langkah untuk memproses gambar di simulator:

  1. Bangun aplikasi ke target simulator pilihan Anda.
  2. Dalam simulator iOS, tekan Cmd+Shift+H untuk meminimalkan aplikasi.
  3. Ketuk Safari di bagian bawah layar utama dan telusuri gambar.
  4. Di hasil penelusuran Google Gambar, ketuk hasil dan tekan lama gambar. Pada dialog yang muncul, pilih "Salin".
  5. Kembali ke aplikasi TFL Classify. Gambar yang disalin akan otomatis ditampilkan bersama dengan hasil inferensi. Jika tidak, pastikan Anda menyalin data gambar itu sendiri dan bukan URL ke gambar.

Menguji Build dan menginstal aplikasi

Sebelum melakukan perubahan apa pun pada aplikasi, mari jalankan versi yang disertakan dengan repositori. Pilih perangkat iOS Anda dari menu dropdown di kiri atas:

275753d3a77a0df3.png

Kemudian, tekan Cmd+R atau tekan tombol Putar f96cf117245c0fa6.png di Xcode untuk membangun aplikasi di perangkat Anda. Aplikasi akan diluncurkan secara otomatis setelah diinstal ke perangkat Anda.

Versi aplikasi ini menggunakan MobileNet standar, yang dilatih sebelumnya dengan 1.000 kategori ImageNet. Ini akan terlihat seperti berikut:

d11436f0bb5a75db.jpeg

6. Menjalankan aplikasi yang disesuaikan

Penyiapan aplikasi default mengklasifikasikan gambar ke salah satu dari 1.000 class ImageNet, menggunakan MobileNet standar.

Sekarang, mari kita modifikasi aplikasi sehingga aplikasi akan menggunakan model yang telah dilatih ulang untuk kategori gambar kustom yang dilatih di Colab.

7. Mengonversi aplikasi untuk menjalankan model Anda

Menambahkan file model Anda ke project

Resource model project berada di ImageClassification > Model pada navigator project Xcode. Untuk menggantinya, hapus terlebih dahulu dua file yang ada di grup Model. Saat diminta, pilih "Move to Trash":

cf2f7fefb2e5075f.png

Kemudian, tarik file model.tflite dan labels.txt yang Anda download dari Colab ke grup Model. Saat diminta, pastikan Copy items if needed dan Add to targets dipilih.

281d7eb72635bb5f.pngS

Mengubah kode aplikasi

Agar aplikasi berfungsi, kita perlu mengupdate jalur logika pemuatan model agar mengarah ke model baru yang kita tambahkan.

Buka ModelDataHandler.swift (jalur navigator Xcode: ImageClassification -> ModelDataHandler -> ModelDataHandler.swift) dan Ubah line 36 menjadi

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

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

Pastikan untuk menyimpan semua perubahan.

8. Menjalankan aplikasi yang disesuaikan

Tekan Cmd+B atau tekan tombol Putar f96cf117245c0fa6.png di Xcode untuk membuat aplikasi di perangkat Anda. Setelah aplikasi diluncurkan, maka akan terlihat seperti ini:

c45ecd122998622e.png

Anda dapat menahan tombol daya dan tombol naikkan volume secara bersamaan untuk mengambil screenshot.

Sekarang coba telusuri bunga di web, arahkan kamera ke layar komputer, dan lihat apakah gambar-gambar tersebut telah diklasifikasikan dengan benar.

Atau minta teman untuk memotret Anda dan mencari tahu jenis TensorFlow Anda \\uf339 \\uf33b \\uf337.

9. Bagaimana cara kerjanya?

Setelah aplikasi berjalan, mari kita lihat kode khusus TensorFlow Lite.

TensorFlowLiteSwift

Aplikasi ini menggunakan library TensorFlowLite Swift melalui CocoaPods. Library Swift adalah wrapper tipis di atas TFLite C API, yang merupakan wrapper library TFLite C++.

Baris berikut dalam file Podfile modul mengambil versi terbaru repositori spesifikasi CocoaPods global pod terbaru ke dalam project.

Podfile

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

Menggunakan TensorFlow Lite Swift API

Semua kode yang berinteraksi dengan TensorFlow Lite terdapat di ModelDataHandler.swift.

Penyiapan

Blok minat pertama adalah penginisialisasi untuk ModelDataHandler:

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

Ada beberapa baris yang harus dibahas secara lebih rinci.

Baris berikut akan membuat juru bahasa TFLite:

ModelDataHandler.swift

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

Interpreter bertanggung jawab untuk meneruskan input data mentah melalui grafik TensorFlow. Kita meneruskan jalur ke penafsir ke model pada disk, lalu penafsir memuatnya sebagai FlatBufferModel.

Baris terakhir memuat daftar label:

loadLabels(fileInfo: labelsFileInfo)

Semua ini dilakukan adalah memuat {i>string<i} dari file teks ke dalam memori.

Menjalankan model

Blok minat kedua adalah metode runModel. Fungsi ini mengambil CVPixelBuffer sebagai input, menjalankan penafsir, dan menampilkan teks yang akan dicetak di aplikasi.

ModelDataHandler.swift

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

10. Apa Langkah Selanjutnya?

Berikut beberapa link untuk informasi lebih lanjut: