Membuat Live Image Classification dengan Core ML

Cara menciptakan aplikasi iOS dengan sistem Live Image Classification dengan Core ML dan Vision di Swift 5

Auriga Aristo
Dipantry
6 min readOct 31, 2020

--

Kembali kita bermain dengan Core ML, machine learning milik Apple. Kali ini kita kembali akan membahas tentang Image Classification, namun di tingkatan yang lebih rumit. Pada postingan saya sebelumnya tentang Core ML (cek di sini), aplikasi yang dibuat akan mengambil gambar lalu gambar tersebut diproses hingga mengembalikan hasil. Berbeda dengan postingan tersebut, kita akan membahas bagaimana jika sistem image classification dilakukan secara live tanpa user harus melakukan foto?

Aplikasi yang akan kita buat tampak seperti video di bawah ini:

Live Image Classification Preview

Aplikasi tersebut hanya memiliki 3 atribut, mulai dari yang paling atas, UIView untuk menampilkan video menggunakan kamera secara live, lalu di bawahnya terdapat 2 buah teks. Teks pertama menampilkan benda apa yang berhasil diprediksi, sedangkan teks kedua menampilkan berapa persentase keyakinan atau tingkat confidence machine learning dalam memprediksi gambar tersebut.

Spesifikasi kamera saya atur menjadi 15 FPS agar tidak memberatkan aplikasi. Pada setiap frame inilah, machine learning akan mempredikasi hasilnya.

Untuk MLModel yang digunakan, kalian bisa menggunakan InceptionV3 pada tutorial sebelumnya atau menggunakan MLModel yang telah disediakan pada website Apple Developer.

Apple Developer — Core ML — https://developer.apple.com/machine-learning/models

Website Apple Developer telah menyediakan beberapa mlmodel yang bisa digunakan, seperti Resnet50 dan MobileNetV2. Kalian bisa memilih untuk menggunakan salah satu diantaranya, namun yang pasti ketiga mlmodel tidak memiliki perbedaan yang signifikan.

Setup Environment

Buat project baru dan masukkan mlmodel ke dalam project kalian. Selanjutnya, kita akan mendesain aplikasi. Kita buat desain yang simpel saja, seperti yang sudah kita lihat pada video di atas.

Warna kuning dan ungu merupakan UIView, saya gunakan warna seperti ini hanya untuk memudahkan kita melihat batas constraint. Setelah mendesain, jangan lupa untuk sambungkan atribut yang kita butuhkan dengan ViewController. Pada gambar di atas, saya memberikan UIView dengan nama videoPreview dan 2 teks lainnya dengan nama nameLabel dan confidenceLabel.

Karena kita akan menggunakan sistem kamera, jangan lupa untuk memasang permission pada info.plist. Permission yang harus dipasang bernama Privacy — Camera Usage Description.

Video Handler

Langkah selanjutnya adalah kita membuat sebuah sistem video pada UIView yang akan mengambil gambar dengan FPS tertentu, dimana pada setiap frame, gambar akan di-capture lalu dilemparkan kepada machine learning untuk diprediksi.

Pertama, mari kita buat sebuah class dengan nama VideoHandler yang akan mengimplentasikan NSObject agar sistem menganggap class ini sebagai sebuah object. Lalu, kita ubah import menjadi yang kita butuhkan, yaitu AVFoundation (library yang bertanggung jawab atas pengambilan video atau penggunaan kamera). Class ini akan berkomunikasi dengan ViewController menggunakan sebuah delegate yang akan kita buat, yaitu VideoHandlerDelegate yang berfungsi untuk melempar foto untuk diprediksi.

Sebelum melanjutkan, mari kita berpikir logika aplikasi ini terlebih dahulu. Contoh, pada setiap gambar diambil (50 FPS, 1 Frame = 20ms), gambar akan dilempar ke ViewController. Machine Learning butuh waktu sekitar 40–80 ms untuk memproses gambar. Apabila gambar yang diambil terlalu cepat, maka aplikasi akan terlalu sibuk untuk memprediksi tanpa henti dan proses akan bertubrukan satu sama lain. Maka dari itu, kita akan memerlukan sebuah antrian untuk menyimpan data gambar yang akan dilempar. Setiap item dalam queue akan dihapus setelah gambar masuk dalam proses ML. Queue yang akan kita gunakan adalah DispatchQueue. Silahkan untuk memberi label pada DispatchQueue sesuai dengan Bundle Identifiermu.

Selanjutnya, kita akan memasang pengaturan kamera serta method memulai dan berhenti menggunakan kamera agar bisa digunakan oleh controller utama. Pada tutorial ini, saya akan memberikan contoh pengaturannya, namun kalian boleh menggantinya sesuai dengan keinginan kalian.

Ada 2 pengaturan yang sangat mempengaruhi performa aplikasi. Pertama, pada baris 5, kalian bisa mengatur jumlah FPS, lalu yang kedua, pada baris 12, kalian bisa mengatur resolusi gambar yang digunakan. Kedua pengaturan ini merupakan pengaturan default, kamu masih bisa mengubahnya melalui viewcontroller. Perlu diketahui, Machine Learning tidak membutuhkan resolusi tinggi untuk memprediksi gambar sehingga pada contoh di atas, saya menggunakan resolusi 640 x 480 dengan orientasi potrait (baris 39). Preview layer di sini berfungsi sebagai penampil video pada tampilan utama.

Setelah membuat pengaturan utama, selanjutnya adalah apa yang harus dilakukan VideoHandler apabila berhasil atau gagal ketika mengambil video. Hal ini dipertanggungjawabkan oleh sebuah delegate yang bernama AVCaptureVideoDataOutputSampleBufferDelegate yang dilengkapi oleh 2 buah method dengan kata kunci didOutput (berhasil) dan didDrop (gagal). Untuk contoh ini kita hanya akan menggunakan method didOutput untuk melempar data menggunakan VideoHandlerDelegate.

View Controller

Setelah selesai mengatur VideoHandler, mari kita atur sistem pada viewcontroller untuk menjalankan proses. Pertama, kita buat sebuah global variable dengan nama classificationModel untuk bertanggung jawab atas menyimpan model. Pada contoh ini, saya menggunakan InceptionV3.

private let classificationModel = try! Inceptionv3(configuration: .init())

Jika kamu menggunakan mlmodel lain, kamu hanya perlu mengganti nama class-nya.

Selanjutnya kita akan mengatur sistem VideoHandler. Ketika tampilan akan muncul atau viewWillAppear, maka pengambilan video akan dimulai atau .start(). Sebaliknya, ketia tampilan akan hilang atau viewWillDisappear, maka pengambilan video akan dihentikan atau .stop(). Selain itu, kita perlu memasang pengaturan pada viewDidLoad agar kamera dapat digunakan dan memunculkan gambar pada UIView.

Di saat yang bersamaan, kita perlu mengatur model agar bisa digunakan oleh machine learning. Jangan lupa untuk import library Vision.

Apabila diperhatikan, saya memasang FPS untuk digunakan adalah 50 FPS. Pada FPS ini, saya telah mencoba bahwa proses yang dilakukan oleh machine learning tidak terlalu lambat atau mengeluarkan hasil yang terlambat setelah pengambilan gambar. Selain itu, FPS rendah juga akan merendahkan performa, yaitu video akan tampak patah-patah atau kurang mulus.

Selanjutnya, kita akan memasang VideoHandlerDelegate pada ViewController untuk mengatur apa yang akan terjadi ketika gambar dikirimkan untuk proses ML.

Terakhir, kita akan membuat sistem Machine Learning atau proses memgubah gambar menjadi hasil prediksi yang akan dimunculkan pada 2 buah label yang sudah kita persiapkan sebelumnya.

Dengan aplikasi kita sudah selesai, sekarang mari kita bahas proses pada ViewController.

Pembahasan

Pada bagian setupModel, kita memasang mlmodel sebagai VNCoreMLModel lalu memasukkan proses ML menjadi VNCoreMLRequest. Pada bagian ini kita mengatur sebuah method yang bernama visionRequestDidComplete sebagai method yang akan dijalankan ketika proses prediksi gambar telah selesai.

Ketika video berhasil mengambil gambar dan dikirimkan melalui VideoHandlerDelegate, gambar dalam bentuk queue berisikan buffer image akan dilempar kepada method yang bernama predictUsingVision untuk diprediksi. Pada method tersebut, method akan mengecek apakah request sudah diinisiasi atau belum. Jika sudah, gambar akan dimasukkan ke dalam VNImageRequestHandler, lalu kita jalankan menggunakan method perform(). Class dan method ini merupakan milik library Vision yang bertanggung jawab akan proses Image Classification.

Ketika gambar berhasil diprediksi, method visionRequestDidComplete akan dipanggil. Isi pengembalian data berupa array yang berisikan object VNClassificationObservation. Pada setiap item dalam array, terdapat teks nama dan tingkat confidence berupa angka desimal (lihat lagi pada tutorial sebelumnya). Setiap hasil akan kita ambil berdasarkan tingkat confidence tertinggi yaitu posisi pertama pada array. Data pertama tersebut akan kita pasang pada kedua label yang sudah kita siapkan pada method showResults().

Tutorial sebelumnya : Membuat Aplikasi Sederhana dengan Core ML

Kesimpulan

Proses Image Classification pada tutorial ini dan tutorial sebelumnya tidak jauh berbeda. Hanya saja pada tutorial ini, kita menggunakan sistem live dari kamera dan membuat sistem penanganan kamera secara manual. Proses dari pengambilan video, pengubahan menjadi gambar, lalu dikirimkan ke ML, dan mengeluarkan hasilnya membutuhkan logika yang mampu membayangkan apalagi jika proses akan dilakukan dengan waktu yang singkat dan bertubrukan satu sama lain. Performa aplikasi juga penting, jangan sampai proses machine learning kewalahan memprediksi gambar karena terlalu banyak gambar yang perlu diprediksi akibat FPS terlalu besar.

Poin penting dalam aplikasi yang harus dilihat adalah apa yang diperlukan oleh pengguna? Apakah video yang paling penting atau hasil prediksi yang terpenting? Karena ini adalah aplikasi untuk memprediksi, maka kita boleh saja menurunkan resolusi video agar mempersedikit jumlah queue yang ada. Akan tetapi jangan terlalu menurunkan kualitas video.

Sekian tutorial dan tips dari saya, selamat mencoba…

--

--

Auriga Aristo
Dipantry

4+ years in Backend Developer | PHP, Java/Kotlin, MySQL, Golang | New story every week