Menerapkan Machine Learning di Perangkat iOS Menggunakan Core ML, Swift, dan Neural Engine

Halo habr! Untuk mengantisipasi dimulainya kursus lanjutan "Pengembang iOS" , kami telah menyiapkan terjemahan materi yang berguna untuk Anda secara tradisional.










pengantar



Core ML adalah pustaka pembelajaran mesin yang dirilis oleh Apple di WWDC 2017.



Hal ini memungkinkan pengembang iOS untuk menambahkan pengalaman yang dipersonalisasi secara real-time ke aplikasi mereka menggunakan model pembelajaran mesin lokal lanjutan menggunakan Neural Engine.



A11 Bionic Chip Review





A11 Pengisian Chip Bionik

Transistor: 4,3 miliar

Core: 6 core ARM (64 bit) - 2 frekuensi tinggi (2,4 GHz) - 4

GPU berdaya rendah : 3

Neural Engine - 600 operasi dasar per detik


Pada 12 September 2017 Apple memperkenalkan chip A11 Bionic kepada dunia dengan Neural Engine. Perangkat keras jaringan saraf ini dapat melakukan hingga 600 operasi dasar per detik (BOPS) dan digunakan untuk FaceID, Animoji, dan tugas pembelajaran mesin lainnya. Pengembang dapat menggunakan Neural Engine menggunakan Core ML API.



Core ML mengoptimalkan kinerja pada perangkat dengan memanfaatkan CPU, GPU, dan sumber daya Neural Engine, meminimalkan konsumsi daya dan memori.



Menjalankan model secara lokal di perangkat pengguna menghilangkan kebutuhan akan koneksi jaringan, yang membantu menjaga kerahasiaan data pengguna dan meningkatkan daya respons aplikasi Anda.


Core ML adalah dasar untuk kerangka kerja dan fungsionalitas domain ini. Core ML mendukung Vision untuk analisis gambar, Natural Language untuk pemrosesan kata, Ucapan untuk suara-ke-teks, dan Analisis Suara untuk mengidentifikasi suara dalam audio.





Core ML API

Kami dapat dengan mudah mengotomatiskan tugas membuat model pembelajaran mesin, yang mencakup pelatihan dan pengujian model menggunakan Playground, dan mengintegrasikan file model yang dihasilkan ke dalam proyek iOS kami.



Kiat pemula : Sorot label terpisah untuk tugas klasifikasi.






Diagram blok umum Core ML



Baik. Apa yang akan kita buat?



Dalam tutorial ini, saya akan menunjukkan cara membuat model pengklasifikasi gambar menggunakan Core ML, yang dapat mengklasifikasikan gambar Orange dan Strawberry, dan menambahkan model ini ke aplikasi iOS kita.





Model pengklasifikasi gambar.



Kiat pemula : Klasifikasi gambar mengacu pada masalah pembelajaran yang diawasi di mana kami menggunakan data berlabel (dalam kasus kami, label adalah nama gambar).








Minimum yang dibutuhkan:



  • Pengetahuan tentang bahasa Swift
  • Dasar-dasar Pengembangan IOS
  • Memahami Konsep Pemrograman Berorientasi Objek




Program aplikasi:



  • X-code 10 atau lebih baru
  • SDK iOS 11.0+
  • macOS 10.13+




Pengumpulan data







Saat mengumpulkan data untuk klasifikasi gambar, ikuti pedoman Apple.



  • 10 — , .
  • , .
  • , Create ML UI’s Augmentation: Crop, Rotate, Blur, Expose, Noise Flip.
  • : , . , .
  • , , .
  • , , -.




Setelah Anda mengumpulkan Kumpulan Data Anda, bagi menjadi set Latih dan Pengujian dan letakkan di folder yang sesuai.







CATATAN PENTING: Pastikan Anda mendistribusikan gambar ke folder yang sesuai di dalam folder tes. Karena nama folder berfungsi sebagai label gambar kita.






Dalam kasus kami, kami memiliki dua folder, yang masing-masing berisi gambar yang sesuai.



Pembuatan model







Jangan panik! Apple telah membuat tugas ini jauh lebih mudah dengan mengotomatiskan pencapaiannya.



Dengan Core ML, Anda dapat menggunakan model yang sudah dilatih untuk mengklasifikasikan data masukan, atau membuatnya sendiri. Framework Vision sudah berfungsi dengan Core ML untuk menerapkan model klasifikasi ke gambar dan memproses sebelumnya gambar tersebut, dan untuk membuat tugas pembelajaran mesin lebih sederhana dan lebih kuat.



Ikuti saja langkah-langkah ini.



LANGKAH 1 : Buka kode X Anda.

LANGKAH 2 : Buat Swift Playground yang bersih.

LANGKAH 3 : Hapus kode yang dibuat default, tambahkan program berikut dan jalankan playground.



   import CreateMLUI //  
  
   let builder = MLImageClassifierBuilder() 
//  MLImageClassifierBuilder
 
   builder.showInLiveView() 
//   Xcode Model builder




Deskripsi:

Di sini kami membuka antarmuka pembuat model default yang disediakan oleh Xcode.



LANGKAH 4 : Tarik folder contoh pelatihan ke area pelatihan.



Tempatkan folder contoh latihan di area latihan yang ditandai dengan garis putus-putus.



Kiat pemula : Kami juga dapat memberikan nama sewenang-wenang untuk model kami dengan mengeklik panah bawah di area tutorial.




Langkah 5 : Xcode akan secara otomatis memproses gambar dan memulai proses pembelajaran. Secara default, dibutuhkan 10 iterasi untuk melatih model, bergantung pada karakteristik Mac Anda dan ukuran kumpulan data. Anda dapat melihat kemajuan pelatihan di jendela terminal Playground.





Saya menunggu sementara model sedang dilatih.



LANGKAH 6 : Setelah menyelesaikan pelatihan, Anda dapat menguji model Anda dengan menyeret dan melepaskan folder Test ke dalam area pengujian. Xcode akan secara otomatis menguji model Anda dan menampilkan hasilnya.





Seperti yang Anda lihat, model kami telah mengklasifikasikan gambar secara akurat.



LANGKAH 7 : Simpan model Anda.









Integrasi ke dalam aplikasi iOS:



LANGKAH 1 : Buka kode X Anda.

LANGKAH 2 : Buat aplikasi iOS Satu Halaman.

LANGKAH 3 : Buka navigator proyek.

LANGKAH 4 : Tarik model terlatih ke navigator proyek.





Tempatkan model Anda di navigator proyek.



LANGKAH 5: Buka Main.storyboarddan buat antarmuka sederhana seperti yang ditunjukkan di bawah ini, tambahkan IBOutlets dan IBActions untuk masing-masing tampilan.





Tambahkan UIImageView, UIButtons dan UILabels.



LANGKAH 6 : Buka file ViewController.swiftdan tambahkan kode berikut sebagai ekstensi.



  extension ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { 
 
 
       func getimage() { 
 
           let imagePicker = UIImagePickerController()
//  UIImagePickerController()
 
           imagePicker.delegate = self //  
 
           imagePicker.sourceType = .photoLibrary  //       
 
           imagePicker.allowsEditing = true  //   
 
           present(imagePicker, animated: true)  //  UIPickerView
 
       } 
 
       func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo : [UIImagePickerController.InfoKey: Any]) { 
 
           let fimage = info[.editedImage] as!UIImage 
//      .editedImage   info 
 
           //    UIImage
 
           fruitImageView.image = fimage  
//    UIImageView
 
           dismiss(animated: true, completion: nil)  //   ,    
 
       } 
 
       func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
 
           dismiss(animated: true, completion: nil)  
//     ,     
 
       } 
 
   } 




Deskripsi: Di sini kami membuat ekstensi untuk kelas ViewController kami dan mengimplementasikan UINavigationControllerDelegate dan UIImagePickerControllerDelegate untuk menampilkan UIImagePickerView saat pengguna mengklik UIButton PickImage. Pastikan Anda mengatur konteks delegasi.







Langkah-langkah yang terkait dengan mengakses model Core ML di aplikasi iOS







LANGKAH 1 : Pastikan Anda telah mengimpor perpustakaan berikut.



import CoreML 
 import Vision




LANGKAH 2 : Buat instance dari kelas Model Core ML kami.



let modelobj = ImageClassifier()




LANGKAH 3 : Untuk memaksa Core ML melakukan klasifikasi, pertama-tama kita harus membentuk permintaan jenis VNCoreMLRequest (VN singkatan dari Vision)



var myrequest: VNCoreMLRequest? 
//  VNCoreMLRequest
 
myrequest = VNCoreMLRequest(model: fruitmodel, completionHandler: { (request, error) in    
//    
 
               //  ,     Core ML
 
               self.handleResult(request: request, error: error)
//  
 
                                                     })




LANGKAH 4: Pastikan Anda memotong gambar agar kompatibel dengan model Core ML. LANGKAH 5: Tempatkan kode di atas dalam fungsi kustom yang mengembalikan objek permintaan.



myrequest!.imageCropAndScaleOption = .centerCrop







 func mlrequest() - > VNCoreMLRequest { 
        var myrequest: VNCoreMLRequest ? 
            let modelobj = ImageClassifier() 
        do { 
            let fruitmodel = 
                try VNCoreMLModel( 
                    for: modelobj.model) 
 
           myrequest = VNCoreMLRequest(model: fruitmodel, completionHandler: {   
                (request, error) in self.handleResult(request: request, error: error) 
          
           }) 
 
       } catch { 
           print("Unable to create a request") 
 
       } 
 
       myrequest!.imageCropAndScaleOption = .centerCrop 
        return myrequest! 
    } 




LANGKAH 6 : Sekarang kita perlu mengonversi UIImage kita ke CIImage (CI: CoreImage) agar dapat digunakan sebagai masukan untuk model Core ML kita. Ini dapat dengan mudah dilakukan dengan membuat instance CIImage dengan meneruskan UIImage di konstruktor.



guard  let ciImage = CIImage(image: image)  else { 
       return 
    } 




LANGKAH 7 : Sekarang kita dapat memproses milik kita VNCoreMLRequestdengan membuat penangan permintaan dan meneruskan ciImage.



let handler = VNImageRequestHandler(ciImage: ciImage)




LANGKAH 8 : Permintaan dapat dipenuhi dengan memanggil metode perform()dan meneruskannya sebagai parameter VNCoreMLRequest.



DispatchQueue.global(qos: .userInitiated).async { 
       let handler = VNImageRequestHandler(ciImage: ciImage) 
       do { 
           try handler.perform([self.mlrequest()]) 
       } catch {  
           print("Failed to get the description")  
       }  
   } 




Deskripsi : DispatchQueue adalah objek yang mengelola eksekusi tugas secara berurutan (atau bersamaan) di thread utama (atau latar belakang) aplikasi Anda.



LANGKAH 10 : Tempatkan kode di atas dalam fungsi kustom seperti yang ditunjukkan di bawah ini.



func excecuteRequest(image: UIImage) { 
 
            guard 
            let ciImage = CIImage(image: image) 
            else { 
                return 
            } 
            DispatchQueue.global(qos: .userInitiated).async { 
                let handler = VNImageRequestHandler(ciImage: ciImage) 
                do { 
                    try handler.perform([self.mlrequest()]) 
                } catch { 
                    print("Failed to get the description") 
                } 
            } 




LANGKAH 11 : Buat fungsi kustom bernama handleResult()yang mengambil objek VNRequestkesalahan dan objek kesalahan sebagai parameter. Fungsi ini akan dipanggil setelah selesai VNCoreMLRequest.



func handleResult(request: VNRequest, error: Error ? ) { 
 
       if let classificationresult = request.results as ? [VNClassificationObservation] {//      VNClassificationObservation
 
           DispatchQueue.main.async { 
               self.fruitnamelbl.text = classificationresult.first!.identifier// UILabel          prperty
                print(classificationresult.first!.identifier)
            } 
        } 
        else { 
            print("Unable to get the results") 
        } 
    }  




Catatan : Ini DispatchQueue.main.asyncdigunakan untuk memperbarui objek UIKit (dalam kasus kami adalah UILabel) menggunakan UI Thread atau Main Thread, karena semua tugas klasifikasi dilakukan di thread latar belakang.








Daftar ViewController.Swift





import UIKit 
    import CoreML 
    import Vision 
    class ViewController: UIViewController { 
        var name: String = "" 
        @IBOutlet weak 
        var fruitnamelbl: UILabel!@IBOutlet weak 
        var fruitImageView: UIImageView!override func viewDidLoad() { 
            super.viewDidLoad() 
            //       .  
        } 
        @IBAction func classifybtnclicked(_ sender: Any) { 
            excecuteRequest(image: fruitImageView.image!) 
        } 
        @IBAction func piclimage(_ sender: Any) { 
            getimage() 
        } 
        func mlrequest() - > VNCoreMLRequest { 
            var myrequest: VNCoreMLRequest ? 
                let modelobj = ImageClassifier() 
           do { 
                let fruitmodel = 
                    try VNCoreMLModel( 
                        for: modelobj.model) 
                myrequest = VNCoreMLRequest(model: fruitmodel, completionHandler: { 
                    (request, error) in self.handleResult(request: request, error: error) 
                }) 
            } catch { 
                print("Unable to create a request") 
            } 
            myrequest!.imageCropAndScaleOption = .centerCrop 
            return myrequest! 
        } 
        func excecuteRequest(image: UIImage) { 
            guard 
            let ciImage = CIImage(image: image) 
            else { 
                return 
            } 
            DispatchQueue.global(qos: .userInitiated).async { 
                let handler = VNImageRequestHandler(ciImage: ciImage) 
                do { 
                    try handler.perform([self.mlrequest()]) 
                } catch { 
                    print("Failed to get the description") 
                } 
            } 
        } 
        func handleResult(request: VNRequest, error: Error ? ) { 
            if let classificationresult = request.results as ? [VNClassificationObservation] { 
                DispatchQueue.main.async { 
                    self.fruitnamelbl.text = classificationresult.first!.identifier 
                    print(classificationresult.first!.identifier) 
                } 
            } 
            else { 
                print("Unable to get the results") 
            } 
        } 
    } 
    extension ViewController: UINavigationControllerDelegate, UIImagePickerControllerDelegate { 
        func getimage() { 
            let imagePicker = UIImagePickerController() 
            imagePicker.delegate = self 
            imagePicker.sourceType = .photoLibrary 
            imagePicker.allowsEditing = true 
            present(imagePicker, animated: true) 
        } 
        func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { 
            let fimage = info[.editedImage] as!UIImage 
            fruitImageView.image = fimage 
            dismiss(animated: true, completion: nil) 
        } 
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
            dismiss(animated: true, completion: nil) 
        } 
    }




Semuanya sudah siap!







Sekarang mulai Simulator Anda dan uji aplikasi Anda.



Catatan : Pastikan Anda memiliki foto jeruk dan stroberi di perpustakaan foto Simulator Anda.






Klik tombol Pilih Gambar





Pilih gambar apa pun





Klik tombol Klasifikasi





Pilih gambar lain dan klik Klasifikasi



Hore:



Anda telah membuat aplikasi iOS pertama Anda menggunakan Core ML.



Namun:






All Articles