Mit dem technologischen Fortschritt sind wir an einem Punkt, an dem unsere Geräte ihre eingebauten Kameras verwenden können, um Bilder anhand eines vorbereiteten Datensatzes genau zu identifizieren und zu kennzeichnen. Sie können auch Ihre eigenen Modelle trainieren. In diesem Lernprogramm verwenden wir ein Open-Source-Modell, um eine App zur Bildklassifizierung zu erstellen.
Ich zeige Ihnen, wie Sie eine App erstellen, mit der Bilder identifiziert werden können. Wir beginnen mit einem leeren Xcode-Projekt und implementieren die maschinell lernende Bilderkennung Schritt für Schritt.
Bevor Sie beginnen, vergewissern Sie sich, dass auf Ihrem Mac die neueste Version von Xcode installiert ist. Dies ist sehr wichtig, da Core ML nur unter Xcode 9 oder neuer verfügbar ist. Sie können Ihre Version überprüfen, indem Sie Xcode öffnen und zu gehen Xcode > Über Xcode in der oberen Symbolleiste.
Wenn Ihre Xcode-Version älter als Xcode 9 ist, können Sie sie im Mac App Store aktualisieren und aktualisieren. Wenn Sie sie nicht haben, können Sie sie kostenlos herunterladen.
Nachdem Sie sichergestellt haben, dass Sie über die richtige Version von Xcode verfügen, müssen Sie ein neues Xcode-Projekt erstellen.
Öffnen Sie Xcode und klicken Sie auf Erstellen Sie ein neues Xcode-Projekt.
Als Nächstes müssen Sie eine Vorlage für Ihr neues Xcode-Projekt auswählen. Es ist ziemlich üblich, eine Einzelansicht App, Gehen Sie also vor und wählen Sie das aus und klicken Sie auf Nächster.
Sie können Ihrem Projekt einen beliebigen Namen geben, aber ich benenne meinen CoreML-Bildklassifizierung. Für dieses Projekt verwenden wir Swift. Vergewissern Sie sich, dass es im ausgewählt ist Sprache Dropdown-Liste.
Da der Xcode Simulator über keine Kamera verfügt, müssen Sie Ihr iPhone anschließen. Wenn Sie kein iPhone besitzen, müssen Sie sich eines leihen, um dieses Tutorial (und andere kamerabezogene Apps) mitverfolgen zu können. Wenn Sie bereits ein iPhone mit Xcode verbunden haben, können Sie mit dem nächsten Schritt fortfahren.
Eine praktische Neuerung in Xcode 9 ist, dass Sie Ihre App drahtlos auf einem Gerät debuggen können. Nehmen Sie sich also die Zeit, um das jetzt einzurichten:
Wählen Sie in der oberen Menüleiste Fenster > Geräte und Simulatoren.Stellen Sie sicher, dass im angezeigten Fenster Geräte wird oben ausgewählt.
Schließen Sie jetzt Ihr Gerät mit einem Blitzkabel an. Dadurch sollte Ihr Gerät im linken Bereich des angezeigt werden Geräte und Simulatoren Fenster. Klicken Sie einfach auf Ihr Gerät und überprüfen Sie die Verbinden Sie sich über ein Netzwerk Box.
Sie können jetzt drahtlos auf diesem iPhone für alle zukünftigen Apps debuggen. Um andere Geräte hinzuzufügen, können Sie einen ähnlichen Vorgang ausführen.
Wenn Sie schließlich Ihr iPhone zum Debuggen verwenden möchten, wählen Sie es einfach aus der Dropdown-Liste neben dem Symbol aus Lauf Taste. Sie sollten ein Netzwerksymbol daneben sehen, das anzeigt, dass es für das drahtlose Debugging angeschlossen ist. Ich habe ausgewählt Vardhans iPhone, Sie müssen jedoch Ihr spezifisches Gerät auswählen.
Nachdem Sie Ihr Projekt erstellt und Ihr iPhone als Simulator eingerichtet haben, gehen wir ein wenig tiefer und beginnen, die Echtzeit-Bildklassifizierungs-App zu programmieren.
Um mit der Erstellung Ihrer Kern-ML-Bildklassifizierungs-App beginnen zu können, müssen Sie zunächst das Core-ML-Modell von der Apple-Website herunterladen. Wie bereits erwähnt, können Sie auch Ihre eigenen Modelle trainieren. Dies erfordert jedoch einen separaten Prozess. Wenn Sie auf der Machine Learning-Website von Apple nach unten blättern, können Sie ein Modell auswählen und herunterladen.
In diesem Tutorial benutze ich die MobileNet.mlmodel Modell, aber Sie können jedes Modell verwenden, solange Sie dessen Namen kennen und sicherstellen können, dass es endet .mlmodel.
Es gibt ein paar Frameworks, die Sie zusammen mit den üblichen importieren müssen UIKit
. Stellen Sie am Anfang der Datei sicher, dass die folgenden Importanweisungen vorhanden sind:
Import UIKit Import AVKit Import Vision
Wir werden es brauchen AVKit
weil wir ein erstellen werden AVCaptureSession
Live-Feed anzeigen und Bilder in Echtzeit klassifizieren. Da dies Computer Vision verwendet, müssen wir auch die importieren Vision
Rahmen.
Ein wichtiger Teil dieser App ist das Anzeigen der Bildklassifizierungsdaten-Labels sowie der Live-Video-Feeds der Kamera des Geräts. Um mit der Gestaltung Ihrer Benutzeroberfläche zu beginnen, gehen Sie zu Ihrer Hauptplatine Datei.
Gehe zum Objektbibliothek und suche nach einem Bildansicht. Ziehen Sie dieses einfach auf Ihren View Controller, um es hinzuzufügen. Wenn Sie möchten, können Sie auch ein Platzhalterbild hinzufügen, um eine allgemeine Vorstellung davon zu bekommen, wie die App aussehen wird, wenn sie verwendet wird.
Wenn Sie sich für ein Platzhalterbild entscheiden, stellen Sie sicher, dass die Inhaltsmodus ist eingestellt auf Aspect Fit, und dass Sie das Kästchen markieren, das sagt Clip auf Bounds. Auf diese Weise wird das Bild nicht gestreckt und außerhalb des Bereichs angezeigt UIImageView
Box.
So sollte Ihr Storyboard jetzt aussehen:
Zurück in Objektbibliothek, Suche nach einem Aussicht und ziehen Sie es auf Ihren View Controller. Dies dient als Hintergrund für unsere Etiketten, damit sie nicht im angezeigten Bild verborgen werden. Wir werden diese Ansicht durchsichtig machen, sodass ein Teil der Vorschauebene noch sichtbar ist (dies ist nur eine nette Geste für die Benutzeroberfläche der App)..
Ziehen Sie dies an den unteren Rand des Bildschirms, sodass der Container auf drei Seiten berührt wird. Es ist egal, welche Höhe Sie wählen, da wir hier in einem Moment Einschränkungen festlegen werden.
Dies ist vielleicht der wichtigste Teil unserer Benutzeroberfläche. Wir müssen anzeigen, was unsere App für das Objekt hält und wie sicher es ist (Vertrauensniveau). Wie Sie wahrscheinlich schon vermutet haben, müssen Sie zwei ziehen Etikette(s)von dem Objektbibliothek auf die Ansicht, die wir gerade erstellt haben. Ziehen Sie diese Beschriftungen in die Mitte, übereinander gestapelt.
Gehen Sie für das obere Etikett zum Attribute-Inspektor und klicken Sie auf die T neben dem Schriftstil und der Schriftgröße und wählen Sie im Popup System als die Schriftart. Um dies vom Vertrauenssiegel zu unterscheiden, wählen Sie Schwarz als die Stil. Zuletzt ändern Sie die Größe zu 24.
Führen Sie für das unterste Etikett die gleichen Schritte aus, jedoch nicht auswählen Schwarz als die Stil, wählen Regulär, und für die Größe, wählen 17.
Das Bild unten zeigt, wie Ihr Das Storyboard sollte aussehen, wenn Sie alle diese Ansichten und Beschriftungen hinzugefügt haben. Mach dir keine Sorgen, wenn sie nicht genau dasselbe sind wie deine; Wir werden ihnen im nächsten Schritt Einschränkungen hinzufügen.
Damit diese App mit unterschiedlichen Bildschirmgrößen arbeiten kann, müssen Sie Einschränkungen hinzufügen. Dieser Schritt ist für den Rest der App nicht entscheidend, es wird jedoch dringend empfohlen, dies in allen Ihren iOS-Apps zu tun.
Das Erste, was wir einschränken müssen, ist unser UIImageView
. Wählen Sie dazu Ihre Bildansicht aus und öffnen Sie die Pin-Menü in der unteren Symbolleiste (dies sieht aus wie ein Quadrat mit den Einschränkungen und es ist das zweite von rechts). Dann müssen Sie die folgenden Werte hinzufügen:
Bevor Sie fortfahren, stellen Sie sicher, dass die Beschränkung auf Ränder Das Kontrollkästchen ist nicht aktiviert, da dadurch eine Lücke zwischen dem Bildschirm und der tatsächlichen Bildansicht entsteht. Dann schlagen Sie Eingeben.Jetzt dein UIImageView
ist auf dem Bildschirm zentriert und sollte auf allen Gerätegrößen richtig aussehen.
Der nächste Schritt besteht darin, die Ansicht einzuschränken, in der die Beschriftungen angezeigt werden. Wählen Sie die Ansicht aus und gehen Sie dann zu Pin-Menü nochmal. Fügen Sie die folgenden Werte hinzu:
Jetzt einfach schlagen Eingeben um die Werte zu speichern. Ihre Ansicht ist jetzt auf den unteren Bildschirmrand beschränkt.
Da die Ansicht jetzt eingeschränkt ist, können Sie die Beschriftungen relativ zur Ansicht anstelle des Bildschirms mit Einschränkungen versehen. Dies ist hilfreich, wenn Sie sich später entscheiden, die Position der Beschriftungen oder der Ansicht zu ändern.
Wählen Sie beide Etiketten aus und legen Sie sie in einer Stapelansicht ab. Wenn Sie nicht wissen, wie das geht, müssen Sie einfach die Taste (die zweite von links) drücken, die wie ein Stapel Bücher mit einem nach unten zeigenden Pfeil aussieht. Sie sehen dann, dass die Schaltflächen zu einem auswählbaren Objekt werden.
Klicken Sie auf Ihre Stapelansicht und anschließend auf Menü ausrichten (dritte von links) und vergewissern Sie sich, dass die folgenden Kontrollkästchen aktiviert sind:
Jetzt schlagen Eingeben. Ihre Beschriftungen sollten in der Ansicht aus dem vorherigen Schritt zentriert sein und werden jetzt auf allen Bildschirmgrößen gleich angezeigt.
Der letzte Schritt in der Benutzeroberfläche wäre das Verbinden der Elemente mit Ihrem ViewController ()
Klasse. Einfach das öffnen Schnittassistenz und dann Control-Click und Ziehen jedes Element an die Spitze Ihrer Klasse ViewController.swift. Ich werde sie in diesem Tutorial benennen:
UILabel
: objectLabel
UILabel
: confidenceLabel
UIImageView
: Bildansicht
Natürlich können Sie sie beliebig benennen, aber dies sind die Namen, die Sie in meinem Code finden.
Der Live-Video-Feed erfordert eine AVCaptureSession
, also lass uns jetzt einen erstellen. Wir werden dem Benutzer auch unsere Kameraeingaben in Echtzeit anzeigen. Das Erstellen einer Capture-Sitzung ist ein ziemlich langer Prozess. Es ist wichtig, dass Sie wissen, wie dies ausgeführt wird, da dies für alle anderen Entwicklungen nützlich ist, die Sie mit der integrierten Kamera auf einem Apple-Gerät durchführen.
Zu Beginn können wir eine Klassenerweiterung erstellen und diese dann an die anpassen AVCaptureVideoDataOutputSampleBufferDelegate
Protokoll. Sie können dies leicht innerhalb der tatsächlichen tun ViewController
Klasse, aber wir verwenden hier Best Practices, damit der Code ordentlich und organisiert ist (so würden Sie es für Produktionsanwendungen tun).
Damit wir das innerhalb von nennen können viewDidLoad ()
, Wir müssen eine Funktion erstellen, die aufgerufen wird setupSession ()
das nimmt keine Parameter auf. Sie können diesem Namen einen beliebigen Namen geben, achten Sie jedoch auf die Benennung, wenn Sie diese Methode später aufrufen.
Sobald Sie fertig sind, sollte Ihr Code folgendermaßen aussehen:
// MARK: - AVCaptureSession-Erweiterung ViewController: AVCaptureVideoDataOutputSampleBufferDelegate func setupSession () // Ihr Code geht hier hin
Der erste Schritt beim Erstellen der Aufnahmesitzung ist das Überprüfen, ob das Gerät über eine Kamera verfügt. Verwenden Sie die Kamera also nicht, wenn keine Kamera vorhanden ist. Wir müssen dann die eigentliche Capture-Sitzung erstellen.
Fügen Sie folgenden Code hinzu setupSession ()
Methode:
guard let device = AVCaptureDevice.default (für: .video) else return guard let Eingabe = versuchen? AVCaptureDeviceInput (Gerät: Gerät) else return let session = AVCaptureSession () session.sessionPreset = .hd4K3840x2160
Hier benutzen wir eine Wache lassen
Anweisung, um zu überprüfen, ob das Gerät (AVCaptureDevice
) hat eine Kamera. Wenn Sie versuchen, die Kamera des Geräts abzurufen, müssen Sie auch die Kamera angeben Medientyp
, was in diesem Fall ist .Video
.
Dann erstellen wir eine AVCaptureDeviceInput
, Dies ist ein Eingang, der die Medien vom Gerät zur Aufnahmesitzung bringt.
Zum Schluss erstellen wir einfach eine Instanz von AVCaptureSession
Klasse, und weisen Sie sie dann einer aufgerufenen Variablen zu Session
. Wir haben die Bitrate und die Qualität der Session angepasst Ultra-High-Definition (UHD) mit 3840 x 2160 Pixeln. Sie können mit dieser Einstellung experimentieren, um herauszufinden, was für Sie funktioniert.
Der nächste Schritt in unserem AVCaptureSession
Setup ist das Erstellen einer Vorschauebene, in der der Benutzer die Eingabe von der Kamera sehen kann. Wir werden dies dem hinzufügen UIImageView
Wir haben zuvor in unserem Storyboard erstellt. Der wichtigste Teil ist jedoch die Erstellung unserer Ausgabe für das Core-ML-Modell, die später in diesem Lernprogramm verarbeitet werden soll. Dies wird auch in diesem Schritt durchgeführt.
Fügen Sie den folgenden Code direkt unter dem Code aus dem vorherigen Schritt hinzu:
et previewLayer = AVCaptureVideoPreviewLayer (session: session) previewLayer.frame = view.frame imageView.layer.addSublayer (previewLayer) let output = AVCaptureVideoDataOutput () output.setSampleBufferDelegate (self, queue: DispatchQueue ") (Ausgabe)
Wir erstellen zuerst eine Instanz von AVCaptureVideoPreviewLayer
Klasse, und initialisieren Sie es mit der Sitzung, die wir im vorherigen Schritt erstellt haben. Nachdem dies erledigt ist, weisen wir es einer aufgerufenen Variablen zu previewLayer
. Diese Ebene wird verwendet, um die Eingabe der Kamera anzuzeigen.
Als Nächstes wird die Vorschauebene den gesamten Bildschirm ausfüllen, indem Sie die Rahmenabmessungen auf die der Ansicht setzen. Auf diese Weise bleibt das gewünschte Erscheinungsbild für alle Bildschirmgrößen erhalten. Um die Vorschauebene tatsächlich anzuzeigen, fügen wir sie als Unterebene der hinzu UIImageView
dass wir erstellt haben, als wir die Benutzeroberfläche erstellten.
Nun zum wichtigen Teil: Wir erstellen eine Instanz von AVCaptureDataOutput
Klasse und weisen sie einer aufgerufenen Variablen zu Ausgabe
.
Endlich sind wir mit unserer Capture-Session fertig. Vor dem eigentlichen Core ML-Code müssen Sie nur noch die Eingabe hinzufügen und die Erfassungssitzung starten.
Fügen Sie die folgenden zwei Codezeilen direkt unter dem vorherigen Schritt hinzu:
// Setzt die Eingabe der AVCaptureSession auf die Kamera-Eingabe des Geräts session.addInput (input) // Startet die Capture-Sitzung session.startRunning ()
Dies fügt die zuvor erstellte Eingabe zum hinzu AVCaptureSession
, denn vorher hatten wir nur die Eingabe erstellt und nicht hinzugefügt. Schließlich startet diese Codezeile die Sitzung, die wir so lange mit dem Erstellen verbracht haben.
Wir haben das Modell bereits heruntergeladen. Der nächste Schritt besteht darin, es tatsächlich in unserer App zu verwenden. Beginnen wir damit, Bilder zu klassifizieren.
Zu Beginn müssen Sie Ihrer App die folgende Delegat-Methode hinzufügen:
func captureOutput (_ Ausgabe: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, von Verbindung: AVCaptureConnection) // Ihr Code geht hier hin
Diese Delegatmethode wird ausgelöst, wenn ein neuer Videorahmen geschrieben wird. In unserer App geschieht dies jedes Mal, wenn ein Bild über unseren Live-Video-Feed aufgenommen wird (die Geschwindigkeit hängt nur von der Hardware ab, auf der die App ausgeführt wird)..
Jetzt wird das Bild (ein Frame aus dem Live-Feed) in einen Pixelpuffer umgewandelt, der vom Modell erkannt werden kann. Damit können wir später eine erstellen VNCoreMLRequest
.
Fügen Sie die folgende zwei Codezeilen in die zuvor erstellte Delegatmethode ein:
guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer (sampleBuffer) else return guard let model = versuchen? VNCoreMLModel (für: MobileNet (). Model) else return
Zuerst erstellen wir einen Pixelpuffer (ein Format, das von Core ML akzeptiert wird) aus dem Argument, das von der Delegate-Methode übergeben wird, und weisen es dann einer aufgerufenen Variablen zu pixelBuffer
. Dann vergeben wir unsere MobileNet Modell zu einer Konstante aufgerufen Modell-
.
Beachten Sie, dass beide mit erstellt werden Wache lassen
Anweisungen, und die Funktion wird zurückkehren, wenn eine der beiden ist Null
Werte.
Nachdem die beiden vorherigen Codezeilen ausgeführt wurden, wissen wir mit Sicherheit, dass wir einen Pixelpuffer und ein Modell haben. Der nächste Schritt wäre das Erstellen einer VNCoreMLRequest
beide verwenden.
Fügen Sie direkt unter dem vorherigen Schritt die folgenden Codezeilen in die Delegat-Methode ein:
let request = VNCoreMLRequest (Modell: Modell) (Daten, Fehler) in // Ihr Code geht hier hin
Hier erstellen wir eine Konstante, die aufgerufen wird anfordern
und Zuweisen des Rückgabewerts der Methode VNCoreMLRequest
wenn unser Modell drin ist.
Wir sind fast fertig! Jetzt müssen wir nur noch unsere Ergebnisse abrufen (wie das Modell das Image für unser Image hält) und sie dem Benutzer anzeigen.
Fügen Sie die nächsten zwei Codezeilen in den Completion-Handler Ihrer Anfrage ein:
// Überprüft, ob die Daten im richtigen Format vorliegen, und weist sie Results Guard als Ergebnis zu. Ergebnis = Daten.Ergebnisse als? [VNClassificationObservation] else return // Weist firstObject guard das erste Ergebnis (falls vorhanden) zu. FirstObject = results.first else return
Wenn die Ergebnisse aus den Daten (aus dem Completion-Handler der Anforderung) als Array von verfügbar sind VNClassificationObservations
, Diese Codezeile erhält das erste Objekt aus dem zuvor erstellten Array. Es wird dann einer aufgerufenen Konstante zugewiesen firstObject
. Das erste Objekt in diesem Array ist das Objekt, für das die Bilderkennungs-Engine das größte Vertrauen hat.
Erinnern Sie sich noch daran, als wir die beiden Labels erstellt haben (Vertrauen und Objekt)? Wir werden sie jetzt verwenden, um anzuzeigen, was das Modell für das Bild hält.
Hängen Sie nach dem vorherigen Schritt die folgenden Codezeilen an:
if firstObject.confidence * 100> = 50 self.objectLabel.text = firstObject.identifier.capitalized self.confidenceLabel.text = String (firstObject.confidence * 100) + "%"
Das ob
Die Anweisung stellt sicher, dass der Algorithmus bei der Identifikation des Objekts mindestens 50% sicher ist. Dann setzen wir einfach die firstObject
wie der Text der objectLabel
weil wir wissen, dass das Vertrauensniveau hoch genug ist. Der Prozentsatz für die Sicherheit wird nur mit der Texteigenschaft von angezeigt confidenceLabel
. Schon seit firstObject.confidence
Wird als Dezimalzahl dargestellt, müssen wir mit 100 multiplizieren, um den Prozentsatz zu erhalten.
Das letzte, was zu tun ist, ist das Bild durch den Algorithmus zu verarbeiten, den wir gerade erstellt haben. Dazu müssen Sie die folgende Codezeile direkt vor dem Beenden von eingeben captureOutput (_: didOutput: von :)
Delegatmethode:
Versuchen? VNImageRequestHandler (cvPixelBuffer: pixelBuffer, Optionen: [:]). Perform ([request])
Die Konzepte, die Sie in diesem Tutorial gelernt haben, können auf viele Arten von Apps angewendet werden. Ich hoffe, es hat Ihnen Spaß gemacht, Bilder mit Ihrem Telefon zu klassifizieren. Obwohl es vielleicht noch nicht perfekt ist, können Sie Ihre eigenen Modelle in Zukunft trainieren, um genauer zu sein.
So sollte die App aussehen, wenn sie fertig ist:
Während Sie hier sind, lesen Sie einige unserer anderen Beiträge zum Maschinellen Lernen und zur Entwicklung von iOS-Apps!