Tutorial Men-deploy Edge ke Android

Hal yang akan Anda buat

Dalam tutorial ini, Anda akan mendownload model TensorFlow Lite kustom yang dieksporl dan dibuat menggunakan AutoML Vision Edge. Kemudian, Anda akan menjalankan aplikasi Android bawaan yang menggunakan model untuk mengidentifikasi gambar bunga.

Screenshot seluler produk akhir
Kredit gambar: Felipe Venâncio, "dari taman ibu saya" (CC BY 2.0, gambar ditunjukkan di aplikasi).

Tujuan

Dalam panduan pengantar end-to-end ini, Anda akan menggunakan kode untuk:

  • Jalankan model terlatih dalam aplikasi Android menggunakan jurus bahasa TFLite.

Sebelum memulai

Melatih model dari AutoML Vision Edge

Sebelum dapat men-deploy model ke perangkat edge, Anda harus melatih dan mengekspor model TF Lite dari AutoML Vision Edge dengan mengikuti panduan memulai model perangkat Edge.

Setelah menyelesaikan panduan memulai, Anda seharusnya telah mengekspor file model terlatih: file TF Lite, file label, dan file metadata, seperti yang ditunjukkan di bawah ini.

file model tf lite penyimpanan cloud

Menginstal TensorFlow

Sebelum memulai tutorial, Anda perlu menginstal beberapa software:

Jika Anda memiliki penginstalan Python yang berfungsi, jalankan perintah berikut untuk mendownload software ini:

pip install --upgrade  "tensorflow==1.7.*"
pip install PILLOW

Referensi dokumentasi TensorFlow resmi jika Anda mengalami masalah dengan proses ini.

Meng-clone repositori Git

Dengan menggunakan command line, clone repositori Git dengan perintah berikut:

git clone https://github.com/googlecodelabs/tensorflow-for-poets-2

Buka direktori clone lokal repositori (direktori tensorflow-for-poets-2). Anda akan menjalankan semua contoh kode berikut dari direktori ini:

cd tensorflow-for-poets-2

Siapkan Aplikasi Android

Menginstal Android Studio

Jika perlu, instal Android Studio 3.0+ secara lokal.

Membuka project dengan Android Studio

Buka project dengan Android Studio dengan mengikuti langkah-langkah berikut:

  1. Buka Android Studio Ikon mulai Android Studio. Setelah dimuat, pilih Ikon project terbuka Android Studio "Open an existing Android Studio project" dari pop-up ini:

    Pop-up project terbuka Android Studio

  2. Dalam pemilih file, pilih tensorflow-for-poets-2/android/tflite dari direktori kerja Anda.

  3. Saat pertama kali membuka project, Anda akan mendapatkan pop-up "Gradle Sync" yang menanyakan cara menggunakan wrapper Gradle. Pilih "Oke".

    Pop-up project terbuka Android Studio

Menjalankan pengujian aplikasi

Aplikasi dapat berjalan di perangkat Android nyata atau di Emulator Android Studio.

Menyiapkan perangkat Android

Anda tidak dapat memuat aplikasi dari Android Studio ke ponsel kecuali jika mengaktifkan "mode developer" dan "Proses Debug USB".

Untuk menyelesaikan proses penyiapan satu kali ini, ikuti instructions ini.

Menyiapkan emulator dengan akses kamera (opsional)

Jika Anda memilih menggunakan emulator dan bukan perangkat Android sebenarnya, Android studio akan mempermudah penyiapan emulator.

Karena aplikasi ini menggunakan kamera, siapkan kamera emulator untuk menggunakan kamera komputer, bukan pola pengujian default.

Untuk menyiapkan kamera emulator, Anda perlu membuat perangkat baru di "Pengelola Perangkat Virtual Android", layanan yang dapat Anda akses dengan tombol Ikon pengelola perangkat virtual ini. Dari halaman AVDM utama, pilih "Bisa Perangkat Virtual":

Opsi membuat perangkat virtual Android Studio

Kemudian, pada halaman "Konfigurasi Verifikasi", di halaman terakhir penyiapan perangkat virtual, pilih "Tampilan Setelan Lanjutan":

Opsi membuat perangkat virtual Android Studio

Dengan menampilkan setelan lanjutan, Anda dapat menyetel kedua sumber kamera untuk menggunakan webcam komputer host:

Android Studio memilih opsi sumber kamera

Menjalankan aplikasi asli

Sebelum membuat perubahan apa pun pada aplikasi, jalankan versi yang disertakan dengan repositori.

Untuk memulai proses build dan penginstalan, jalankan sinkronisasi Gradle.

Ikon sinkronisasi Gradle

Setelah menjalankan sinkronisasi Gradle, pilih putar Ikon Play Android Studio.

Setelah memilih tombol putar, Anda harus memilih perangkat dari pop-up ini:

pilih jendela pop-up perangkat

Setelah memilih perangkat, Anda harus mengizinkan Demo Tensorflow untuk mengakses kamera dan file Anda:

izinkan jendela akses kamera

Setelah aplikasi terinstal, klik ikon aplikasi Ikon aplikasi Android Studio untuk meluncurkannya. Versi aplikasi ini menggunakan MobileNet standar, yang telah dilatih pada kategori 1000 ImageNet.

Ini akan terlihat seperti berikut:

jalankan aplikasi pengujian

Menjalankan aplikasi yang disesuaikan

Penyiapan aplikasi default yang mengklasifikasikan gambar ke dalam salah satu class 1000 ImageNet menggunakan MobileNet standar tanpa pelatihan ulang.

Sekarang, lakukan modifikasi sehingga aplikasi akan menggunakan model yang dibuat oleh AutoML Vision Edge untuk kategori gambar kustom Anda.

Tambahkan file model Anda ke project

Project demo dikonfigurasi untuk menelusuri graph.lite, dan file labels.txt dalam direktori android/tflite/app/src/main/assets/.

Ganti dua file asli dengan versi Anda menggunakan perintah berikut:

cp [Downloads]/model.tflite android/tflite/app/src/main/assets/graph.lite
cp [Downloads]/dict.txt  android/tflite/app/src/main/assets/labels.txt

Memodifikasi aplikasi

Aplikasi ini menggunakan model float, sedangkan model yang dibuat oleh AutoML Vision Edge adalah model terkuantisasi. Anda akan membuat beberapa perubahan kode agar aplikasi dapat menggunakan model.

Ubah jenis data labelProbArray dan filterLabelProbArray dari float menjadi byte, dalam definisi anggota class, dan dalam melakukan inisialisasi ImageClassifier.

private byte[][] labelProbArray = null;
private byte[][] filterLabelProbArray = null;

labelProbArray = new byte[1][labelList.size()];
filterLabelProbArray = new byte[FILTER_STAGES][labelList.size()];

Alokasikan imgData berdasarkan jenis int8, dalam melakukan inisialisasi ImageClassifier.

    imgData =
        ByteBuffer.allocateDirect(
            DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);

Transmisikan jenis data labelProbArray dari int8 ke float, di printTopKLabels():

  private String printTopKLabels() {
    for (int i = 0; i < labelList.size(); ++i) {
      sortedLabels.add(
          new AbstractMap.SimpleEntry<>(labelList.get(i), (float)labelProbArray[0][i]));
      if (sortedLabels.size() > RESULTS_TO_SHOW) {
        sortedLabels.poll();
      }
    }
    String textToShow = "";
    final int size = sortedLabels.size();
    for (int i = 0; i < size; ++i) {
      Map.Entry<String, Float> label = sortedLabels.poll();
      textToShow = String.format("\n%s: %4.2f",label.getKey(),label.getValue()) + textToShow;
    }
    return textToShow;
  }

Menjalankan aplikasi Anda

Di Android Studio, jalankan sinkronisasi Gradle sehingga sistem build dapat menemukan file Anda:

Ikon sinkronisasi Gradle

Setelah menjalankan sinkronisasi Gradle, pilih putar Ikon Play Android Studio untuk memulai proses build dan penginstalan seperti sebelumnya.

Ini akan terlihat seperti berikut:

Screenshot seluler produk akhir
Kredit gambar: Felipe Venâncio, "dari kebun ibu saya" (CC BY 2.0, gambar ditampilkan dalam aplikasi).

Anda dapat menahan tombol power dan turunkan volume secara bersamaan untuk mengambil screenshot.

Uji aplikasi yang telah diupdate dengan mengarahkan kamera ke berbagai gambar bunga untuk melihat apakah bunga tersebut diklasifikasikan dengan benar.

Bagaimana cara kerjanya?

Setelah aplikasi berjalan, periksa kode spesifik TensorFlow Lite.

AAR TensorFlow-Android

Aplikasi ini menggunakan TFLite Android Archive (AAR) yang telah dikompilasi sebelumnya. AAR ini dihosting di jcenter.

Baris berikut dalam file build.gradle modul menyertakan versi AAR terbaru dari repositori TensorFlow bintray maven dalam project.

build.gradle

repositories {
    maven {
        url 'https://google.bintray.com/tensorflow'
    }
}

dependencies {
    // ...
    compile 'org.tensorflow:tensorflow-lite:+'
}

Gunakan blok berikut untuk menginstruksikan Android Asset Packaging Tool bahwa aset .lite atau .tflite tidak boleh dikompresi. Hal ini penting, karena file .lite akan dipetakan memori, dan file tidak akan berfungsi saat file dikompresi.

build.gradle

android {
    aaptOptions {
        noCompress "tflite"
        noCompress "lite"
    }
}

Menggunakan TFLite Java API

Kode yang berinteraksi ke TFLite terdapat di ImageClassifier.java.

Penyiapan

Blok pertama yang menarik adalah konstruktor untuk ImageClassifier:

ImageClassifier.java

ImageClassifier(Activity activity) throws IOException {
    tflite = new Interpreter(loadModelFile(activity));
    labelList = loadLabelList(activity);
    imgData =
        ByteBuffer.allocateDirect(
            4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);
    imgData.order(ByteOrder.nativeOrder());
    labelProbArray = new float[1][labelList.size()];
    Log.d(TAG, "Created a Tensorflow Lite Image Classifier.");
}

Ada beberapa garis minat tertentu.

Baris berikut akan membuat juru bahasa TFLite:

ImageClassifier.java

tflite = new Interpreter(loadModelFile(activity));

Baris ini membuat instance juru bahasa TFLite. Juru bahasa berfungsi mirip dengan tf.Session (untuk pengguna yang sudah dikenal dengan TensorFlow, di luar TFLite). Anda meneruskan MappedByteBuffer yang berisi model ke juru bahasa. Fungsi lokal loadModelFile membuat MappedByteBuffer yang berisi file aset graph.lite aktivitas.

Baris berikut membuat buffer data input:

ImageClassifier.java

imgData = ByteBuffer.allocateDirect(
    4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);

Buffer byte ini diubah ukurannya untuk menampung data gambar setelah dikonversi menjadi float. Juru bahasa dapat menerima array float secara langsung sebagai input, tetapi ByteBuffer lebih efisien karena menghindari salinan tambahan dalam juru bahasa.

Baris berikut memuat daftar label dan membuat buffer output:

labelList = loadLabelList(activity);
//...
labelProbArray = new float[1][labelList.size()];

Buffer output adalah array float dengan satu elemen untuk setiap label tempat model akan menulis probabilitas output.

Menjalankan model

Blok minat kedua adalah metode classifyFrame. Metode ini mengambil Bitmap sebagai input, menjalankan model, dan menampilkan teks yang akan dicetak di aplikasi.

ImageClassifier.java

String classifyFrame(Bitmap bitmap) {
 // ...
 convertBitmapToByteBuffer(bitmap);
 // ...
 tflite.run(imgData, labelProbArray);
 // ...
 String textToShow = printTopKLabels();
 // ...
}

Metode ini melakukan tiga hal. Pertama, metode ini mengonversi dan menyalin input Bitmap ke imgData ByteBuffer untuk input ke model. Kemudian, metode tersebut akan memanggil metode run penafsir, meneruskan buffer input dan array output sebagai argumen. Penafsir menetapkan nilai dalam array output ke probabilitas yang dihitung untuk setiap class. Node input dan output ditentukan oleh argumen untuk langkah konversi toco yang membuat file model .lite sebelumnya.

Apa Selanjutnya:

Sekarang Anda telah menyelesaikan panduan aplikasi klasifikasi bunga Android menggunakan model Edge. Anda telah menguji aplikasi klasifikasi gambar sebelum memodifikasinya dan mendapatkan anotasi contoh. Anda kemudian memeriksa kode khusus TensorFlow Lite untuk memahami fungsionalitas yang mendasarinya.