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.