Implementieren von maschinellem Lernen auf einem iOS-Gerät mit Core ML, Swift und Neural Engine

Hallo habr! Im Vorfeld des Beginns des Fortgeschrittenenkurses "iOS Developer" haben wir traditionell eine Übersetzung von nützlichem Material für Sie vorbereitet.










Einführung



Core ML ist eine Bibliothek für maschinelles Lernen, die von Apple auf der WWDC 2017 veröffentlicht wurde.



Sie ermöglicht iOS-Entwicklern, ihren Anwendungen mithilfe fortschrittlicher lokaler Modelle für maschinelles Lernen mithilfe der Neural Engine personalisierte Erfahrungen in Echtzeit hinzuzufügen.



A11 Bionic Chip Review





A11 Bionic Chip Filling

Transistoren: 4,3 Milliarden

Kerne: 6 ARM-Kerne (64 Bit) - 2 Hochfrequenz (2,4 GHz) - 4

GPUs mit geringer Leistung : 3

Neural Engine - 600 Basisoperationen pro Sekunde


Am 12. September 2017 stellte Apple der Welt den A11 Bionic Chip mit Neural Engine vor. Diese neuronale Netzwerkhardware kann bis zu 600 Basisoperationen pro Sekunde (BOPS) ausführen und wird für FaceID-, Animoji- und andere maschinelle Lernaufgaben verwendet. Entwickler können die Neural Engine mithilfe der Core ML-API verwenden.



Core ML optimiert die Leistung auf dem Gerät durch Nutzung von CPU-, GPU- und Neural Engine-Ressourcen und minimiert den Speicher- und Stromverbrauch.



Durch das lokale Ausführen des Modells auf dem Gerät des Benutzers ist keine Netzwerkverbindung mehr erforderlich, wodurch die Privatsphäre der Benutzerdaten gewahrt und die Reaktionsfähigkeit Ihrer Anwendung verbessert wird.


Core ML ist die Basis für Frameworks und Funktionen dieser Domain. Core ML unterstützt Vision für die Bildanalyse, Natural Language für die Textverarbeitung, Speech für Sound-to-Text und Sound Analysis zur Identifizierung von Tönen in Audio.





Kern-ML-API

Wir können die Aufgabe des Erstellens von Modellen für maschinelles Lernen, einschließlich des Trainings und Testens des Modells auf dem Spielplatz und der Integration der resultierenden Modelldatei in unser iOS-Projekt, auf einfache Weise automatisieren.



Tipp für Anfänger : Markieren Sie separate Beschriftungen für Klassifizierungsaufgaben.






Allgemeines Blockdiagramm der Kern-ML



Okay. Was werden wir schaffen?



In diesem Tutorial werde ich Ihnen zeigen, wie Sie mit Core ML ein Bildklassifizierungsmodell erstellen, mit dem Orange- und Erdbeerbilder klassifiziert werden können, und dieses Modell unserer iOS-Anwendung hinzufügen.





Bildklassifikatormodell.



Tipp für Anfänger : Die Bildklassifizierung bezieht sich auf überwachte Lernprobleme, bei denen wir beschriftete Daten verwenden (in unserem Fall ist die Beschriftung der Name des Bildes).








Erforderliches Minimum:



  • Kenntnisse der schnellen Sprache
  • IOS-Entwicklungsgrundlagen
  • Grundlegendes zu objektorientierten Programmierkonzepten




Anwendungsprogramme:



  • X-Code 10 oder höher
  • iOS SDK 11.0+
  • macOS 10.13+




Datensammlung







Befolgen Sie beim Sammeln von Daten für die Bildklassifizierung die Richtlinien von Apple.



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




Nachdem Sie Ihren Datensatz gesammelt haben, teilen Sie ihn in Zug- und Testsätze auf und legen Sie sie in den entsprechenden Ordnern ab.







WICHTIGER HINWEIS: Stellen Sie sicher, dass Sie die Bilder in den entsprechenden Ordnern im Testordner verteilen. Weil der Ordnername als Bezeichnung für unsere Bilder dient.






In unserem Fall haben wir zwei Ordner, von denen jeder die entsprechenden Bilder enthält.



Modellerstellung







Keine Panik! Apple hat dies durch die Automatisierung der Meilensteine ​​erheblich vereinfacht.



Mit Core ML können Sie ein bereits trainiertes Modell verwenden, um Eingabedaten zu klassifizieren oder eigene zu erstellen. Das Vision-Framework arbeitet bereits mit Core ML zusammen, um Klassifizierungsmodelle auf Bilder anzuwenden und diese Bilder vorzuverarbeiten sowie maschinelle Lernaufgaben einfacher und robuster zu gestalten.



Befolgen Sie einfach diese Schritte.



SCHRITT 1 : Öffnen Sie Ihren X-Code.

SCHRITT 2 : Erstellen Sie einen sauberen Swift Playground.

SCHRITT 3 : Entfernen Sie den standardmäßig generierten Code, fügen Sie das folgende Programm hinzu und führen Sie es aus playground.



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




Beschreibung:

Hier öffnen wir die Oberfläche des von Xcode bereitgestellten Standard-Modellbauers.



SCHRITT 4 : Ziehen Sie den Trainingsbeispielordner in den Trainingsbereich.



Legen Sie den Trainingsmusterordner in den Trainingsbereich, der durch die gepunkteten Linien gekennzeichnet ist.



Tipp für Anfänger : Sie können unserem Modell auch einen beliebigen Namen geben, indem Sie im Tutorial-Bereich auf den Abwärtspfeil klicken.




Schritt 5 : Xcode verarbeitet das Bild automatisch und startet den Lernprozess. Standardmäßig sind 10 Iterationen erforderlich, um ein Modell zu trainieren, abhängig von den Eigenschaften Ihres Mac und der Größe des Datasets. Sie können den Trainingsfortschritt im Fenster des Spielplatzterminals verfolgen.





Ich warte, während das Modell trainiert wird.



SCHRITT 6 : Nach Abschluss des Trainings können Sie Ihr Modell testen, indem Sie den Ordner Test in den Testbereich ziehen und dort ablegen. Xcode testet Ihr Modell automatisch und zeigt das Ergebnis an.





Wie Sie sehen können, hat unser Modell die Bilder genau klassifiziert.



SCHRITT 7 : Speichern Sie Ihr Modell.









Integration in die iOS-Anwendung:



SCHRITT 1 : Öffnen Sie Ihren X-Code.

SCHRITT 2 : Erstellen Sie eine Single Page iOS-App.

SCHRITT 3 : Öffnen Sie den Projektnavigator.

SCHRITT 4 : Ziehen Sie das trainierte Modell in den Projektnavigator.





Platzieren Sie Ihr Modell im Projektnavigator.



SCHRITT 5: Öffnen Main.storyboardund erstellen Sie eine einfache Schnittstelle wie unten gezeigt, fügen Sie IBOutlets und IBActions für die jeweiligen Ansichten hinzu.





Fügen Sie UIImageView, UIButtons und UILabels hinzu.



SCHRITT 6 : Öffnen Sie die Datei ViewController.swiftund fügen Sie den folgenden Code als Erweiterung hinzu.



  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)  
//     ,     
 
       } 
 
   } 




Beschreibung: Hier erstellen wir eine Erweiterung für unsere ViewController-Klasse und implementieren UINavigationControllerDelegate und UIImagePickerControllerDelegate, um die UIImagePickerView anzuzeigen, wenn der Benutzer auf den PickImage-UIButton klickt. Stellen Sie sicher, dass Sie den Delegatenkontext festlegen.







Schritte zum Zugriff auf das Core ML-Modell in einer iOS-Anwendung







SCHRITT 1 : Stellen Sie sicher, dass Sie die folgenden Bibliotheken importiert haben.



import CoreML 
 import Vision




SCHRITT 2 : Erstellen Sie eine Instanz unserer Model Core ML-Klasse.



let modelobj = ImageClassifier()




SCHRITT 3 : Um Core ML zur Klassifizierung zu zwingen, müssen wir zuerst eine Anfrage wie VNCoreMLRequest bilden (VN steht für Vision).



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




SCHRITT 4: Stellen Sie sicher, dass Sie das Bild so zuschneiden, dass es mit dem Core ML-Modell kompatibel ist. SCHRITT 5: Platzieren Sie den obigen Code in einer benutzerdefinierten Funktion, die ein Anforderungsobjekt zurückgibt.



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! 
    } 




SCHRITT 6 : Wir müssen jetzt unser UIImage in CIImage (CI: CoreImage) konvertieren, damit es als Eingabe für unser Core ML-Modell verwendet werden kann. Dies kann einfach durch Instanziieren von CIImage durch Übergeben von UIImage im Konstruktor erfolgen.



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




SCHRITT 7 : Wir können jetzt unsere bearbeiten, VNCoreMLRequestindem wir einen Anforderungshandler erstellen und übergeben ciImage.



let handler = VNImageRequestHandler(ciImage: ciImage)




SCHRITT 8 : Die Anforderung kann erfüllt werden, indem die Methode perform()aufgerufen und als Parameter übergeben wird VNCoreMLRequest.



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




Beschreibung : DispatchQueue ist ein Objekt, das die Ausführung von Aufgaben nacheinander (oder gleichzeitig) im Hauptthread (oder Hintergrundthread) Ihrer Anwendung verwaltet.



SCHRITT 10 : Platzieren Sie den obigen Code wie unten gezeigt in einer benutzerdefinierten Funktion.



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") 
                } 
            } 




SCHRITT 11 : Erstellen Sie eine benannte benutzerdefinierte Funktion handleResult(), die VNRequestein Fehlerobjekt und ein Fehlerobjekt als Parameter verwendet. Diese Funktion wird nach Abschluss aufgerufen 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") 
        } 
    }  




Hinweis : Dies wird DispatchQueue.main.asyncverwendet, um UIKit-Objekte (in unserem Fall UILabel) mithilfe des UI-Threads oder des Hauptthreads zu aktualisieren, da alle Klassifizierungsaufgaben im Hintergrundthread ausgeführt werden.








Auflistung 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) 
        } 
    }




Alles ist fertig!







Starten Sie nun Ihren Simulator und testen Sie Ihre Anwendung.



Hinweis : Stellen Sie sicher, dass Sie ein Foto von Orangen und Erdbeeren in der Fotobibliothek Ihres Simulators haben.






Klicken Sie auf die Schaltfläche





Bild





auswählen. Wählen Sie ein Bild aus. Klicken Sie auf die Schaltfläche Klassifizieren.





Wählen Sie ein anderes Bild aus und klicken Sie auf Klassifizieren



Hurra:



Sie haben Ihre erste iOS-Anwendung mit Core ML erstellt.



Noch:






All Articles