Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Machine Learning
Code

Mulai Dengan Pengenalan Gambar di Core ML

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Ilham Saputra (you can also view the original English article)

Dengan kemajuan teknologi, kami berada di titik di mana perangkat kami dapat menggunakan kamera yang ada di dalamnya untuk mengidentifikasi dan memberi label gambar secara akurat menggunakan kumpulan data yang sudah dilatih sebelumnya. Anda juga dapat melatih model Anda sendiri, tetapi dalam tutorial ini, kami akan menggunakan model sumber terbuka untuk membuat aplikasi klasifikasi gambar.

Saya akan menunjukkan cara membuat aplikasi yang dapat mengidentifikasi gambar. Kami akan mulai dengan proyek Xcode yang kosong, dan menerapkan pengenalan gambar yang menggunakan mesin-belajar satu langkah dalam satu waktu.

Persiapan

Versi Xcode

Sebelum memulai, pastikan Anda memiliki Xcode versi terbaru yang terpasang di Mac Anda. Ini sangat penting karena Core ML hanya akan tersedia di Xcode 9 atau yang lebih baru. Anda dapat memeriksa versi Anda dengan membuka Xcode dan pergi ke Xcode > About Xcode di toolbar bagian atas.

Jika versi Xcode Anda lebih lama dari Xcode 9, Anda dapat pergi ke Mac App Store dan memperbaruinya, atau jika Anda tidak memilikinya, unduh secara gratis.

Contoh Proyek

Proyek Baru

Setelah Anda memastikan Anda memiliki Xcode versi yang tepat, Anda harus membuat proyek Xcode baru.

Lanjutkan dan buka Xcode dan klik Create a new Xcode project.

Figure 1 Create an Xcode Project

Selanjutnya, Anda harus memilih template untuk proyek Xcode baru Anda. Ini sangat umum untuk menggunakan Single View App, jadi lanjutkan dan pilih itu dan klik Next.

Figure 2 Select a Single View Application

Anda dapat menamai proyek apa pun yang Anda suka, tetapi saya akan menamai CoreML Image Classification milik saya. Untuk proyek ini, kami akan menggunakan Swift, jadi pastikan bahwa itu dipilih dalam dropdown Bahasa.

Figure 3 Selecting Language and Naming Application

Mempersiapkan untuk Debug

Menghubungkan iPhone

Karena Xcode Simulator tidak memiliki kamera, Anda harus mencolokkan iPhone Anda. Sayangnya, jika Anda tidak memiliki iPhone, Anda harus meminjam satu untuk dapat mengikuti tutorial ini (dan untuk aplikasi terkait kamera lainnya). Jika Anda sudah memiliki iPhone yang terhubung ke Xcode, Anda dapat langsung beralih ke langkah berikutnya.

Fitur baru yang bagus di Xcode 9 adalah Anda dapat men-debug aplikasi Anda secara nirkabel di perangkat, jadi mari luangkan waktu untuk menyiapkannya sekarang:

Di bilah menu atas, pilih Window > Device and Simulators. Di jendela yang muncul, pastikan bahwa Device dipilih di bagian atas.

Sekarang, pasang perangkat Anda menggunakan kabel petir. Ini harus membuat perangkat Anda muncul di panel kiri jendela Device and Simulators. Cukup klik perangkat Anda, dan centang kotak Connect via Network.

Figure 4 Devices and Simulators

Anda sekarang dapat melakukan debug secara nirkabel pada iPhone ini untuk semua aplikasi di masa mendatang. Untuk menambahkan perangkat lain, Anda dapat mengikuti proses serupa.

Simulator Seleksi

Figure 5 Select a Simulator

Ketika Anda ingin akhirnya menggunakan iPhone Anda untuk melakukan debug, cukup pilih dari dropdown di samping tombol Run. Anda harus melihat ikon jaringan di sebelahnya, menunjukkan bahwa itu terhubung untuk debugging nirkabel. Saya telah memilih iPhone Vardhan, tetapi Anda harus memilih perangkat khusus Anda.

Menyelam lebih dalam

Sekarang setelah Anda membuat proyek dan mengatur iPhone Anda sebagai simulator, kami akan menyelam lebih dalam dan mulai memprogram aplikasi klasifikasi gambar waktu nyata.

Mempersiapkan proyek Anda

Mendapatkan Model

Untuk dapat mulai membuat aplikasi klasifikasi gambar Core ML Anda, Anda harus terlebih dahulu mendapatkan model Core ML dari situs web Apple. Seperti yang saya sebutkan sebelumnya, Anda juga dapat melatih model Anda sendiri, tetapi itu membutuhkan proses yang terpisah. Jika Anda menggulir ke bagian bawah situs web pembelajaran mesin Apple, Anda akan dapat memilih dan mengunduh model.

Dalam tutorial ini, saya akan menggunakan model MobileNet.mlmodel, tetapi Anda dapat menggunakan model apa pun selama Anda tahu namanya dan dapat memastikan bahwa model itu berakhiran .mlmodel.

Figure 6 Working with Models

Mengimpor Perpustakaan

Ada beberapa kerangka kerja yang perlu Anda impor bersama dengan UIKit biasa. Di bagian atas file, pastikan pernyataan impor berikut ada:

Kami memerlukan AVKit karena kami akan membuat AVCaptureSession untuk menampilkan umpan langsung sambil mengklasifikasikan gambar dalam waktu nyata. Juga, karena ini menggunakan visi komputer, kita perlu mengimpor kerangka kerja Vision.

Merancang antarmuka pengguna Anda

Bagian penting dari aplikasi ini adalah menampilkan label data klasifikasi gambar serta umpan video langsung dari kamera perangkat. Untuk mulai merancang antarmuka pengguna Anda, pergilah ke file Main.storyboard Anda.

Menambahkan Image View

Kepala ke Object Library dan cari Image View. Cukup tarik ini ke Pengontrol Tampilan Anda untuk menambahkannya. Jika mau, Anda juga dapat menambahkan gambar placeholder sehingga Anda bisa mendapatkan gambaran umum tentang seperti apa tampilan aplikasi saat digunakan.

Jika Anda memilih untuk memiliki gambar placeholder, pastikan bahwa Content Mode diatur ke Aspect Fit, dan Anda mencentang kotak yang bertuliskan Clip to Bounds. Dengan cara ini, gambar tidak akan muncul membentang, dan itu tidak akan muncul di luar kotak UIImageView.

Figure 7 Content Mode

Inilah tampilan papan ceritamu sekarang:

Figure 8 Storyboard

Menambahkan View

Kembali ke Object Library, cari sebuah View dan seret ke View Controller Anda. Ini akan berfungsi sebagai latar belakang yang bagus untuk label kami sehingga tidak disembunyikan dalam gambar yang ditampilkan. Kami akan membuat tampilan ini tembus pandang sehingga beberapa lapisan pratinjau masih terlihat (ini hanya sentuhan yang bagus untuk antarmuka pengguna aplikasi).

Tarik ini ke bagian bawah layar sehingga menyentuh wadah di tiga sisi. Tidak masalah ketinggian apa yang Anda pilih karena kami akan menetapkan batasan untuk ini hanya sesaat di sini.

Figure 9 Storyboard

Menambahkan label

Ini, mungkin, adalah bagian terpenting dari antarmuka pengguna kami. Kami perlu menampilkan apa yang menurut aplikasi kami objek tersebut, dan seberapa yakin itu (tingkat kepercayaan). Seperti yang mungkin Anda duga, Anda harus menyeret dua Label(s) dari Object Library ke tampilan yang baru saja kita buat. Seret label ini di suatu tempat di dekat pusat, ditumpuk di atas satu sama lain.

Untuk label teratas, arahkan ke Atributes Inspector dan klik tombol T di samping gaya dan ukuran font dan, di munculan, pilih System sebagai font. Untuk membedakan ini dari label kepercayaan, pilih Black sebagai style. Terakhir, ubah size menjadi 24.

Figure 10 Object Label Attributes

Untuk label bawah, ikuti langkah yang sama, tetapi sebagai ganti memilih Black sebagai style, pilih Reguler, dan untuk size, pilih 17.

Figure 11 Confidence Label Attributes

Gambar di bawah ini menunjukkan tampilan Storyboard Anda ketika Anda telah menambahkan semua tampilan dan label ini. Jangan khawatir jika mereka tidak persis sama dengan milik Anda; kami akan menambahkan kendala kepada mereka di langkah berikutnya.

Figure 12 Storyboard Final

Menambahkan Batasan

Agar aplikasi ini berfungsi pada berbagai ukuran layar, penting untuk menambahkan batasan. Langkah ini tidak penting bagi aplikasi lainnya, tetapi sangat disarankan agar Anda melakukan ini di semua aplikasi iOS Anda.

Batasan Tampilan Gambar

Hal pertama yang perlu dibatasi adalah UIImageView kami. Untuk melakukan ini, pilih tampilan gambar Anda, dan buka Pin Menu di toolbar bawah (ini terlihat seperti persegi dengan batasan dan itu yang kedua dari kanan). Kemudian, Anda harus menambahkan nilai-nilai berikut:

Figure 13 Image Constraints

Sebelum Anda melanjutkan, pastikan bahwa kotak Constrain to Margin tidak dicentang karena ini akan membuat celah antara layar dan tampilan gambar yang sebenarnya. Kemudian, tekan Enter. Sekarang UIImageView Anda terpusat di layar, dan seharusnya terlihat tepat di semua ukuran perangkat.

View Constraints

Sekarang, langkah selanjutnya adalah membatasi tampilan di mana label muncul. Pilih tampilan, lalu buka Pin Menu lagi. Tambahkan nilai-nilai berikut:

Figure 14 View Constraints

Sekarang, cukup tekan Enter untuk menyimpan nilai. Tampilan Anda sekarang dibatasi ke bagian bawah layar.

Label Constraints

Karena tampilan sekarang dibatasi, Anda dapat menambahkan batasan pada label relatif terhadap tampilan alih-alih layar. Ini berguna jika Anda kemudian memutuskan untuk mengubah posisi label atau tampilan.

Pilih kedua label, dan letakkan dalam tampilan tumpukan. Jika Anda tidak tahu cara melakukan ini, Anda hanya perlu menekan tombol (yang kedua dari kiri) yang terlihat seperti tumpukan buku dengan panah ke bawah. Anda kemudian akan melihat tombol menjadi satu objek yang dapat dipilih.

Klik pada tampilan tumpukan Anda, lalu klik Menu Align (ketiga dari kiri) dan pastikan kotak-kotak berikut dicentang:

Figure 15 Label Constraints

Sekarang, tekan Enter. Label Anda harus dipusatkan pada tampilan dari langkah sebelumnya, dan mereka sekarang akan tampak sama pada semua ukuran layar.

Outlet Builder Antarmuka

Langkah terakhir dalam antarmuka pengguna adalah menghubungkan elemen ke kelas ViewController(). Cukup buka Assistant Editor dan kemudian Control-Click dan Drag setiap elemen ke bagian atas kelas Anda di dalam ViewController.swift. Inilah yang akan saya namai di tutorial ini:

  • UILabel: objectLabel
  • UILabel: confidenceLabel
  • UIImageView: imageView

Tentu saja, Anda dapat menamai mereka apa pun yang Anda inginkan, tetapi ini adalah nama-nama yang akan Anda temukan dalam kode saya.

Mempersiapkan Sesi Tangkap

Umpan video langsung akan membutuhkan AVCaptureSession, jadi mari buat satu sekarang. Kami juga akan menampilkan masukan kamera kami kepada pengguna dalam waktu nyata. Membuat sesi penangkapan adalah proses yang cukup panjang, dan penting bagi Anda untuk memahami cara melakukannya karena itu akan berguna dalam pengembangan lain yang Anda lakukan dengan menggunakan kamera on-board pada perangkat Apple mana pun.

Ekstensi dan Fungsi Kelas

Untuk memulai, kita dapat membuat ekstensi kelas dan kemudian membuatnya sesuai dengan protokol AVCaptureVideoDataOutputSampleBufferDelegate. Anda dapat dengan mudah melakukan ini dalam kelas ViewController yang sebenarnya, tetapi kami menggunakan praktik terbaik di sini sehingga kode tersebut rapi dan terorganisir (ini adalah cara Anda melakukannya untuk aplikasi produksi).

Sehingga kita dapat memanggil ini di dalam viewDidLoad(), kita harus membuat fungsi yang disebut setupSession() yang tidak mengambil parameter apa pun. Anda dapat menamai ini apa pun yang Anda inginkan, tetapi perhatikan penamaan saat kami memanggil metode ini nanti.

Setelah Anda selesai, kode Anda akan terlihat seperti berikut:

Perangkat Input dan Menangkap Sesi

Langkah pertama dalam menciptakan sesi pengambilan adalah untuk memeriksa apakah perangkat memiliki kamera atau tidak. Dengan kata lain, jangan mencoba menggunakan kamera jika tidak ada kamera. Selanjutnya kita perlu membuat sesi pengambilan yang sebenarnya.

Tambahkan kode berikut untuk metode setupSession() Anda:

Di sini, kami menggunakan pernyataan guard let untuk memeriksa apakah perangkat (AVCaptureDevice) memiliki kamera. Ketika Anda mencoba untuk mendapatkan kamera perangkat, Anda juga harus menentukan mediaType, yang, dalam hal ini, adalah .video.

Kemudian, kami membuat AVCaptureDeviceInput, yang merupakan masukan yang membawa media dari perangkat untuk menangkap sesi.

Akhirnya, kami hanya membuat instance kelas AVCaptureSession, dan kemudian menetapkan ke variabel disebut session. Kami telah menyesuaikan bitrate dan kualitas sesi ke Ultra-High-Definition (UHD) yang 3840 dengan 2160 piksel. Anda dapat bereksperimen dengan pengaturan ini untuk melihat apa yang berhasil untuk Anda.

Tinjauan Layer dan Output

Langkah selanjutnya dalam melakukan pengaturan AVCaptureSession kami adalah membuat layer pratinjau, di mana pengguna dapat melihat input dari kamera. Kami akan menambahkan ini ke UIImageView yang kami buat sebelumnya di Storyboard kami. Bagian yang paling penting, sebenarnya adalah menciptakan output kami untuk model Core ML untuk diproses nanti dalam tutorial ini, yang juga akan kami lakukan di langkah ini.

Tambahkan kode berikut tepat di bawah kode dari langkah sebelumnya:

Kami pertama kali membuat instance dari kelas AVCaptureVideoPreviewLayer, dan kemudian menginisialisasi dengan sesi yang kami buat di langkah sebelumnya. Setelah itu selesai, kami menugaskannya ke variabel yang disebut previewLayer. Lapisan ini digunakan untuk benar-benar menampilkan input dari kamera.

Selanjutnya, kita akan membuat lapisan pratinjau mengisi seluruh layar dengan mengatur dimensi bingkai ke tampilan. Dengan cara ini, tampilan yang diinginkan akan bertahan untuk semua ukuran layar. Untuk benar-benar menunjukkan lapisan pratinjau, kami akan menambahkannya sebagai sub-lapisan UIImageView yang kami buat saat kami membuat antarmuka pengguna.

Sekarang, untuk bagian penting: Kami membuat sebuah instance dari kelas AVCaptureDataOutput dan menugaskannya ke variabel yang disebut output.

Masukan dan Mulai Sesi

Akhirnya, kami selesai dengan sesi penangkapan kami. Semua yang harus dilakukan sebelum kode Core ML yang sebenarnya adalah menambahkan input dan memulai sesi pengambilan.

Tambahkan dua baris berikut kode langsung di bawah langkah sebelumnya:

Ini menambah masukan yang kami buat sebelumnya ke AVCaptureSession, karena sebelum ini, kami hanya membuat masukan dan tidak menambahkannya. Terakhir, baris kode ini memulai sesi yang telah kami habiskan begitu lama membuat.

Mengintegrasikan Model Core ML

Kami sudah mengunduh model, jadi langkah selanjutnya adalah benar-benar menggunakannya di aplikasi kami. Jadi mari kita mulai dengan menggunakannya untuk mengklasifikasikan gambar.

Mendelegasikan Metode

Untuk memulai, Anda harus menambahkan metode delegasi berikut ke dalam aplikasi Anda:

Metode delegasi ini dipicu ketika bingkai video baru ditulis. Di aplikasi kami, ini terjadi setiap kali bingkai direkam melalui umpan video langsung kami (kecepatan ini sepenuhnya bergantung pada perangkat keras tempat aplikasi dijalankan).

Pixel Buffer dan Model

Sekarang, kita akan mengubah gambar (satu bingkai dari umpan hidup) menjadi buffer piksel, yang dikenali oleh model. Dengan ini, kita akan dapat membuat VNCoreMLRequest nantinya.

Tambahkan dua baris kode berikut ke dalam metode delegasi yang Anda buat sebelumnya:

Pertama kita membuat buffer piksel (format yang diterima Core ML) dari argumen yang dilewatkan melalui metode delegasi, dan kemudian menetapkannya ke variabel yang disebut pixelBuffer. Kemudian kami menetapkan model MobileNet kami ke model yang disebut konstan.

Perhatikan bahwa kedua hal ini dibuat menggunakan pernyataan guard let, dan bahwa fungsi akan kembali jika salah satu dari ini adalah nilai nil.

Membuat permintaan

Setelah dua baris kode sebelumnya telah dieksekusi, kita tahu pasti bahwa kita memiliki buffer pixel dan model. Langkah selanjutnya adalah membuat VNCoreMLRequest menggunakan keduanya.

Tepat di bawah langkah sebelumnya, tempelkan baris kode berikut di dalam metode delegasi:

Di sini, kami membuat request yang disebut konstan dan menugaskannya kembali nilai dari metode VNCoreMLRequest ketika model kami dilewatkan ke dalamnya.

Mendapatkan dan Menyortir Hasil

Kami hampir selesai! Yang perlu kita lakukan sekarang adalah mendapatkan hasil kita (apa yang menurut model citra kita) dan kemudian menampilkannya kepada pengguna.

Tambahkan dua baris kode ke handler penyelesaian permintaan Anda:

Jika hasil dari data (dari penuntas penyelesaian permintaan) tersedia sebagai larik VNClassificationObservations, baris kode ini mendapatkan objek pertama dari larik yang kita buat sebelumnya. Akan kemudian ditetapkan untuk konstan disebut firstObject. Obyek pertama dalam array adalah satu yang gambar pengakuan mesin memiliki yang paling percaya diri.

Menampilkan Data dan Pengolahan Gambar

Ingat ketika kami membuat dua label (keyakinan dan objek)? Sekarang kita akan menggunakannya untuk menampilkan apa yang dipikirkan oleh model tersebut.

Tambahkan baris berikut kode setelah langkah sebelumnya:

Pernyataan if memastikan bahwa algoritma tersebut setidaknya 50% pasti tentang identifikasi objeknya. Lalu kita hanya mengatur firstObject sebagai teks objectLabel karena kita tahu bahwa tingkat kepercayaan cukup tinggi. Kami hanya akan menampilkan persentase kepastian menggunakan properti teks dari confidenceLabel. Karena firstObject.confidence direpresentasikan sebagai desimal, kita perlu mengalikan dengan 100 untuk mendapatkan persentase.

Hal terakhir yang harus dilakukan adalah mengolah gambar melalui algoritma yang baru saja kita buat. Untuk melakukan ini, Anda harus mengetikkan baris kode berikut secara langsung sebelum keluar dari metode pengambilan captureOutput(_:didOutput:from:):

Kesimpulan

Konsep yang Anda pelajari dalam tutorial ini dapat diterapkan untuk berbagai jenis aplikasi. Saya harap Anda menikmati belajar mengklasifikasikan gambar menggunakan ponsel Anda. Meskipun mungkin belum sempurna, Anda dapat melatih model Anda sendiri di masa depan agar lebih akurat.

Berikut adalah apa yang harus app seperti bila dilakukan:

Figure 16 Final Application

Saat Anda berada di sini, lihat beberapa posting kami yang lain tentang pembelajaran mesin dan pengembangan aplikasi iOS!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.