
Dua tahun lalu, Sundar Pichai, kepala Google, mengatakan bahwa perusahaan dari mobile-first menjadi AI-first dan berfokus pada pembelajaran mesin. Setahun kemudian, Machine Learning Kit dirilis - satu set alat yang dapat Anda gunakan secara efektif ML di iOS dan Android.
Ada banyak pembicaraan tentang ML Kit di AS, tetapi hampir tidak ada informasi dalam bahasa Rusia. Dan karena kami menggunakannya untuk beberapa tugas di Yandex.Money, saya memutuskan untuk berbagi pengalaman dan menunjukkan dengan contoh bagaimana menggunakannya untuk melakukan hal-hal menarik.
Nama saya Yura. Tahun lalu saya bekerja di tim Yandex.Money menggunakan dompet ponsel. Kami akan berbicara tentang pembelajaran mesin di seluler.
Catatan Staf editorial: posting ini menceritakan kembali laporan oleh Yuri Chechetkin "Dari ponsel pertama ke AI pertama" dari Yandex.Money metap Android Paranoid .
Apa itu Kit ML?
Ini adalah SDK seluler Google yang memudahkan penggunaan pembelajaran mesin di perangkat Android dan iOS. Tidak perlu menjadi ahli dalam ML atau dalam kecerdasan buatan, karena dalam beberapa baris kode Anda dapat menerapkan hal-hal yang sangat kompleks. Selain itu, tidak perlu tahu bagaimana jaringan saraf atau optimasi model bekerja.
Apa yang bisa dilakukan ML Kit?
Fitur dasar cukup lebar. Misalnya, Anda dapat mengenali teks, wajah, menemukan dan melacak objek, membuat label untuk gambar dan model klasifikasi Anda sendiri, memindai barcode dan tag QR.
Kami sudah menggunakan pengenalan kode QR dalam aplikasi Yandex.Money.
Ada juga Kit ML
- Pengakuan tengara;
- Definisi bahasa tempat teks ditulis;
- Terjemahan teks pada perangkat;
- Balas cepat ke surat atau pesan.
Selain sejumlah besar metode di luar kotak, ada dukungan untuk model kustom, yang secara praktis memberikan kemungkinan tanpa batas - misalnya, Anda dapat mewarnai foto hitam putih dan membuatnya berwarna.
Penting bahwa Anda tidak perlu menggunakan layanan, API, atau backend untuk ini. Semuanya dapat dilakukan secara langsung di perangkat, jadi kami tidak memuat lalu lintas pengguna, tidak mendapatkan banyak kesalahan jaringan, kami tidak harus memproses banyak kasus, misalnya, kurangnya internet, kehilangan koneksi, dan sebagainya. Terlebih lagi, pada perangkat ini bekerja jauh lebih cepat daripada melalui jaringan.

Pengenalan teks
Tugas: diberi foto, Anda perlu agar teks dilingkari dalam persegi panjang.
Kami mulai dengan ketergantungan pada Gradle. Cukup menghubungkan satu ketergantungan, dan kami siap bekerja.
dependencies {
Layak menentukan metadata yang mengatakan bahwa model akan diunduh ke perangkat saat mengunduh aplikasi dari Play Market. Jika Anda tidak melakukan ini dan mengakses API tanpa model, kami akan mendapatkan kesalahan, dan model tersebut harus diunduh di latar belakang. Jika Anda perlu menggunakan beberapa model, disarankan untuk menentukannya dipisahkan dengan koma. Dalam contoh kami, kami menggunakan model OCR, dan nama sisanya dapat ditemukan dalam dokumentasi .
<application ...> ... <meta-data android:name="com.google.firebase.ml.vision.DEPENDENCIES" android:value="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" --> </application>
Setelah konfigurasi proyek, Anda perlu mengatur nilai input. Kit ML bekerja dengan tipe FirebaseVisionImage, kami memiliki lima metode, tanda tangan yang saya tulis di bawah ini. Mereka mengubah tipe Android dan Java yang biasa menjadi tipe ML Kit, yang dengannya nyaman digunakan.
fun fromMediaImage(image: Image, rotation: Int): FirebaseVisionImage fun fromBitmap(bitmap: Bitmap): FirebaseVisionImage fun fromFilePath(context: Context, uri: Uri): FirebaseVisionImage fun fromByteBuffer( byteBuffer: ByteBuffer, metadata: FirebaseVisionImageMetadata ): FirebaseVisionImage fun fromByteArray( bytes: ByteArray, metadata: FirebaseVisionImageMetadata ): FirebaseVisionImage
Perhatikan dua yang terakhir - mereka bekerja dengan array byte dan dengan buffer byte, dan kita perlu menentukan metadata sehingga ML Kit mengerti bagaimana menangani semuanya. Metadata, pada kenyataannya, menjelaskan format, dalam hal ini, lebar dan tinggi, format default, IMAGE_FORMAT_NV21 dan rotasi.
val metadata = FirebaseVisionImageMetadata.Builder() .setWidth(480) .setHeight(360) .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21) .setRotation(rotation) .build() val image = FirebaseVisionImage.fromByteBuffer(buffer, metadata)
Saat input data dikumpulkan, buat detektor yang akan mengenali teks.
Ada dua jenis detektor, di perangkat dan di awan, mereka dibuat secara harfiah dalam satu baris. Perlu dicatat bahwa detektor pada perangkat hanya berfungsi dengan bahasa Inggris. Detektor cloud mendukung lebih dari 20 bahasa, mereka harus ditentukan dalam metode setLanguageHints khusus.
Jumlah bahasa yang didukung lebih dari 20, semuanya ada di situs web resmi. Dalam contoh kita, hanya bahasa Inggris dan Rusia.
Setelah Anda memiliki input dan detektor, cukup panggil metode processImage pada detektor ini. Kami mendapatkan hasil dalam bentuk tugas, di mana kami menggantung dua panggilan balik - untuk sukses dan untuk kesalahan. Pengecualian standar datang ke kesalahan, dan tipe FirebaseVisionText datang untuk sukses dari onSuccessListener.
val result: Task<FirebaseVisionText> = detector.processImage(image) .addOnSuccessListener { result: FirebaseVisionText ->
Bagaimana cara kerjanya dengan tipe FirebaseVisionText?
Ini terdiri dari blok teks (TextBlock), yang pada gilirannya terdiri dari garis (Baris), dan garis elemen (Elemen). Mereka bersarang satu sama lain.
Selain itu, masing-masing kelas memiliki lima metode yang mengembalikan data yang berbeda tentang objek. Kotak adalah area di mana teks berada, kepercayaan adalah ketepatan teks yang dikenali, titik sudut adalah titik sudut searah jarum jam, mulai dari sudut kiri atas, bahasa yang dikenali dan teks itu sendiri.
FirebaseVisionText contains a list of FirebaseVisionText.TextBlock which contains a list of FirebaseVisionText.Line which is composed of a list of FirebaseVisionText.Element. fun getBoundingBox(): Rect
Untuk apa ini?
Kita dapat mengenali seluruh teks dalam gambar dan paragraf individu, potongan, garis atau hanya kata-kata. Dan sebagai contoh, kita bisa beralih, pada setiap tahap mengambil teks, mengambil perbatasan teks ini, dan menggambar. Sangat nyaman
Kami berencana untuk menggunakan alat ini dalam aplikasi kami untuk mengenali kartu bank, label yang lokasinya tidak standar. Tidak semua perpustakaan pengenalan kartu berfungsi dengan baik, dan untuk kartu khusus, Kit ML akan sangat berguna. Karena ada sedikit teks, sangat mudah untuk diproses dengan cara ini.
Pengakuan objek dalam foto

Menggunakan alat berikut sebagai contoh, saya ingin menunjukkan bahwa prinsip operasi kira-kira sama. Dalam hal ini, pengakuan atas apa yang digambarkan pada objek. Kami juga membuat dua detektor, satu di perangkat, yang lain di cloud, kami dapat menentukan akurasi minimum sebagai parameter. Standarnya adalah 0,5, ditunjukkan 0,7, dan siap untuk digunakan. Kami juga mendapatkan hasilnya dalam bentuk FirebaseImageLabel, ini adalah daftar label, yang masing-masing berisi ID, deskripsi, dan akurasi.
Harold menyembunyikan kebahagiaan

Anda dapat mencoba memahami seberapa baik Harold menyembunyikan rasa sakit dan apakah dia bahagia pada saat yang sama. Kami menggunakan alat pengenal wajah, yang, selain mengenali fitur wajah, dapat memberi tahu betapa bahagianya seseorang. Ternyata, Harold 93% bahagia. Atau dia menyembunyikan rasa sakit dengan sangat baik.

Dari mudah ke mudah, tetapi sedikit lebih rumit. Model khusus.
Tugas: klasifikasi apa yang digambarkan dalam foto.
Saya mengambil gambar laptop dan mengenali modem, komputer desktop dan keyboard. Kedengarannya seperti kebenaran. Ada seribu pengklasifikasi, dan ia mengambil tiga dari mereka yang paling menggambarkan foto ini.

Saat bekerja dengan model khusus, kami juga dapat bekerja dengan keduanya di perangkat dan melalui cloud.
Jika kami bekerja melalui cloud, Anda harus pergi ke Firebase Console, ke tab ML Kit, dan untuk mengetuk kustom, tempat kami dapat mengunggah model kami ke TensorFlow Lite, karena ML Kit bekerja dengan model dengan resolusi ini. Jika kita menggunakannya pada perangkat, kita dapat dengan mudah menempatkan model di bagian proyek sebagai aset.

Kami menunjukkan ketergantungan pada penerjemah, yang dapat bekerja dengan model khusus, dan jangan lupa tentang izin untuk bekerja dengan Internet.
<uses-permission android:name="android.permission.INTERNET" /> dependencies {
Untuk model-model yang ada di perangkat, Anda harus menunjukkan dalam Gradle bahwa model tersebut tidak boleh dikompres, karena dapat terdistorsi.
android {
Ketika kami telah mengonfigurasi semua yang ada di lingkungan kami, kami harus menetapkan kondisi khusus, yang meliputi, misalnya, penggunaan Wi-Fi, juga dengan Android N yang memerlukan pengisian daya dan memerlukan idle perangkat tersedia - kondisi ini menunjukkan bahwa ponsel sedang mengisi daya atau dalam mode siaga.
var conditionsBuilder: FirebaseModelDownloadConditions.Builder = FirebaseModelDownloadConditions.Builder().requireWifi() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Saat kami membuat model jarak jauh, kami menetapkan inisialisasi dan kondisi pembaruan, serta tanda apakah model kami harus diperbarui. Nama model harus cocok dengan yang kami tentukan di Firebase console. Ketika kami membuat model jarak jauh, kami harus mendaftarkannya di Firebase Model Manager.
val cloudSource: FirebaseRemoteModel = FirebaseRemoteModel.Builder("my_cloud_model") .enableModelUpdates(true) .setInitialDownloadConditions(conditions) .setUpdatesDownloadConditions(conditions) .build() FirebaseModelManager.getInstance().registerRemoteModel(cloudSource)
Kami melakukan langkah-langkah yang sama untuk model lokal, tentukan namanya, jalur ke model, dan daftarkan di Firebase Model Manager.
val localSource: FirebaseLocalModel = FirebaseLocalModel.Builder("my_local_model") .setAssetFilePath("my_model.tflite") .build() FirebaseModelManager.getInstance().registerLocalModel(localSource)
Setelah itu, Anda perlu membuat opsi seperti itu di mana kami menentukan nama model kami, menginstal model jarak jauh, menginstal model lokal dan membuat penerjemah dengan opsi ini. Kita dapat menentukan model jarak jauh, atau hanya model lokal, dan penerjemah sendiri akan mengerti yang mana yang akan digunakan.
val options: FirebaseModelOptions = FirebaseModelOptions.Builder() .setRemoteModelName("my_cloud_model") .setLocalModelName("my_local_model") .build() val interpreter = FirebaseModelInterpreter.getInstance(options)
Kit ML tidak tahu apa-apa tentang format input dan output data model khusus, jadi Anda perlu menentukannya.
Input data adalah array multidimensi, di mana 1 adalah jumlah gambar, 224x224 adalah resolusi, dan 3 adalah gambar RGB tiga saluran. Nah, tipe datanya adalah byte.
val input = intArrayOf(1, 224, 224, 3)
Nilai output adalah 1000 pengklasifikasi. Kami mengatur format nilai input dan output dalam byte dengan array multidimensi yang ditentukan. Selain byte, float, long, int juga tersedia.
Sekarang kita mengatur nilai input. Kami mengambil Bitmap, mengompresnya menjadi 224 dengan 224, mengubahnya menjadi ByteBuffer dan membuat nilai input menggunakan FirebaseModelInput menggunakan pembangun khusus.
val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true) val imgData = convertBitmapToByteBuffer(bitmap) val inputs: FirebaseModelInputs = FirebaseModelInputs.Builder() .add(imageData) .build()
Dan sekarang, ketika ada juru bahasa, format nilai input dan output dan nilai input itu sendiri, kita dapat mengeksekusi permintaan menggunakan metode run. Kami mentransfer semua hal di atas sebagai parameter, dan sebagai hasilnya kami mendapatkan FirebaseModelOutput, yang di dalamnya berisi generik dari tipe yang kami tentukan. Dalam hal ini, itu adalah array Byte, setelah itu kita dapat mulai memproses. Ini persis seribu pengklasifikasi yang kami minta, dan kami tampilkan, misalnya, 3 teratas yang paling cocok.
interpreter.run(inputs, inputOutputOptions) .addOnSuccessListener { result: FirebaseModelOutputs -> val labelProbArray = result.getOutput<Array<ByteArray>>(0)
Implementasi satu hari
Semuanya sangat mudah diimplementasikan, dan pengenalan objek dengan alat bawaan dapat direalisasikan hanya dalam satu hari. Alat ini tersedia di iOS dan Android, selain itu, Anda dapat menggunakan model TensorFlow yang sama untuk kedua platform.
Selain itu, ada banyak metode yang tersedia di luar kotak yang dapat mencakup banyak kasus. Sebagian besar API tersedia di perangkat, yaitu, pengakuan akan bekerja bahkan tanpa Internet.
Dan yang paling penting - dukungan untuk model khusus yang dapat digunakan sesuka Anda untuk tugas apa pun.
Tautan yang bermanfaat
Dokumentasi Kit ML
Proyek Demo Kit Github ML
Pembelajaran Mesin untuk seluler dengan Firebase (Google I / O'19)
Machine Learning SDK untuk pengembang seluler (Google I / O'18)
Membuat pemindai kartu kredit menggunakan Firebase ML Kit (Medium.com)