Maschinelles Lernen auf iOS mit CoreML und React-Native

Wenn Sie wie ich sind und schon immer davon geträumt haben, eine Anwendung zu entwickeln, die in der Lage ist, mit Ihrem iPhone einen Hotdog vom Dackel Ihres Nachbarn zu unterscheiden, ist dieses Tutorial genau das Richtige für Sie. Dazu verwenden wir React-Native und maschinelles Lernen. Lass uns gehen !
Lösungen für maschinelles Lernen sind seit langem über APIs in der Cloud verfügbar, aber sie erforderten eine Internetverbindung und konnten zeitaufwändig und teuer in der Verarbeitung sein.
Mit der Veröffentlichung von iOS 11 hat Apple Entwicklern seine Bibliothek für maschinelles Lernen, CoreML, zur Verfügung gestellt. Jetzt ist es nicht mehr notwendig, einen leistungsstarken Server zu haben, um Anfragen zu verarbeiten oder eine Drittanbieter-API aufzurufen. CoreML erledigt alles mit der Rechenleistung Ihres Smartphones.
Sind Sie neugierig, wie Sie es in Ihre Anwendungen integrieren können? Es ist einfacher als Sie vielleicht denken.
Nehmen wir als Beispiel die berühmte Parodie-Anwendung Nicht Hotdog, in der Serie entdeckt Silicon Valley, die dem Nutzer, wenn er sein Smartphone auf ein Objekt richtet, sofort mitteilt, ob es sich um einen Hotdog handelt oder nicht.
Kein Hotdog

Was Sie in diesem Teil lernen werden

  • Installieren Sie Ihre Umgebung
  • Daten sammeln
  • Erstellen Sie Ihr Bildklassifizierungsmodell mit Turi Create
  • Erkenne einen Hotdog mit der Kamera deines iPhones

Voraussetzungen

  • macOS 10.12+
  • oder Linux (mit glibc 2.12+)
  • oder Windows 10 (über WSL)

  • Python 2.7, 3.5 oder 3.6

  • eine x86_64-Architektur

  • Xcode 9

  • iOS 11 +

Was ist Turi Create?

Es ist ein Tool, das „die Entwicklung benutzerdefinierter Modelle für maschinelles Lernen vereinfacht“, die dann in Anwendungen verwendet werden können, die die CoreML-Bibliothek verwenden.
Turi Create basiert auf dem Deep-Learning-Framework Apaches MXNet
Turi Create bietet Entwicklern eine flexible Technologie, um Bilder zu klassifizieren, Objekte zu erkennen, Empfehlungssysteme zu entwerfen usw.
Das Tool ist extrem einfach zu bedienen, flexibel und schnell.

Seine Installation

Wie bei vielen Machine-Learning-Tools python ist die verwendete Sprache. Aber keine Sorge, der Code ist sehr einfach zu verstehen.
Es wird empfohlen, eine virtuelle Umgebung zu verwenden, virtualenv, Eingabe des Befehls

pip install virtualenv

Falls Sie pip, den Python-Paketmanager, nicht installiert haben, können Sie ihn mit Homebrew installieren , indem Sie den folgenden Befehl eingeben:

brew install pip

dann,

// Créer un environnement virtuel Python
cd ~
virtualenv venv
// Activer votre environnement virtuel
source ~/venv/bin/activate
// Installer Turi Create
pip install -U turicreate

Daten sammeln

Bevor wir ein Modell trainieren können, brauchen wir Daten.
Diese Daten sind auf der Website zu finden IMAGEnet Das ist eine sehr große Bilddatenbank mit über 14 Millionen Ergebnissen.
Für unser Projekt benötigen wir zwei Kategorien von Bildern: Hotdog und… Not Hotdog.
Hier ist der Link für die erste Kategorie: http://www.image-net.org/synset?wnid=n07697537.

Sie können alle Links auch über die öffentliche API über die Schaltfläche abrufen Herunterladen in der Registerkarte Downloads

http://www.image-net.org/api/text/imagenet.synset.geturls?wnid=n07697537

Verwenden von turicreate-easy-Skripten

Sie können auf dem Repository finden turicreate-einfache-Skripte eine Reihe von Skripten, die Ihnen das Leben erleichtern werden.
Also nach dem Klonen der Repos und Installieren der Abhängigkeiten aus dem Ordner download-image :

cd download-images
npm install

Sie können den Befehl ausführen:

node imagenet-downloader.js http://www.image-net.org/api/text/imagenet.synset.geturls?wnid=n07697537 hotdog

Und hol dir einen Ordner voller Bilder von Hotdogs.
Alles, was bleibt, ist, dasselbe für Not Hotdog zu tun. Wählen Sie also die Kategorie(n), die Ihnen am besten gefällt, und kategorisieren Sie sie als Nicht-Hotdog

node imagenet-downloader.js http://image-net.org/api/text/imagenet.synset.geturls?wnid=n00021939 not-hotdog

Trainieren Sie das Modell

Sind die Bilder hochgeladen und kategorisiert, muss nur noch das Klassifikationsmodell trainiert werden.
Dazu können Sie das Python-Skript verwenden, das im zuvor heruntergeladenen Repository verfügbar gemacht wurde

cd train-model
python train-model.py


Sie erhalten nach zehn Minuten (oder mehr, je nach Anzahl der zu verarbeitenden Bilder) eine Datei Classifier.mlmodel die wir jetzt verwenden können.
gif ml

Erstellen Sie ein React-Native-Projekt

Zuerst müssen Sie ein neues React-Native-Projekt erstellen.
Öffnen Sie Ihr Terminal, navigieren Sie zu Ihrem Projektordner und geben Sie den folgenden Befehl ein:

react-native init notHotDog (ou tout autre nom)

Nach ein paar Minuten ist alles installiert und Sie können fortfahren.

Installieren Sie die CoreML-Bibliothek

Wir werden die react-native-core-ml-image- Bibliothek verwenden .

npm install --save react-native-core-ml-image
react-native link

Gehen Sie zu Ihrem Projekt, dann zum Ordner „ios“ und doppelklicken Sie auf die Datei notHotDog.xcodeproj, um sie in Xcode zu öffnen

Projekt konfigurieren

Standardmäßig sind React-Native-Projekte so konfiguriert, dass sie hauptsächlich Objective-C verwenden. Der Bücherladen reagieren-native-core-ml-image Da es in Swift geschrieben ist, müssen einige Parameter im Projekt geändert werden
Zunächst müssen wir dem Projekt eine Swift-Datei hinzufügen


Der Name spielt keine Rolle, er wird sowieso nicht verwendet. Daraufhin erscheint eine Meldung, die Ihnen vorschlägt, einen „Objective-C Bridging Header“ zu erstellen: Dies ist die Datei, die verwendet wird, um die Verbindung zwischen Swift und den Header-Dateien der Objective-C-Klassen herzustellen

Da die Bibliothek schließlich in Swift 4.0 geschrieben ist, müssen Sie die zu verwendende Swift-Version angeben (3.2 ist die Standardversion).
Klicken Sie auf das Stammverzeichnis des Projekts (notHotDog), wählen Sie die Registerkarte „Build Settings“ und ändern Sie dann ganz unten die zu verwendende Version der Swift-Sprache.

Importieren Sie das CoreML-Modell in das Projekt

Bevor wir zum Programmierteil übergehen, müssen wir nur noch unser Bildklassifizierungsmodell in das notHotDog-Projekt importieren.
Vorlage per Drag-and-Drop Classifier.mlmodel und umbenennen notHotDog.mlmodelc (nein, das ist kein Tippfehler)

CoreML funktioniert nicht direkt mit _.mlmodel-Dateien, Sie müssen sie zuerst in _.mlmodelc (c für kompiliert) übersetzen, aber unser Python-Skript hat sich bereits darum gekümmert. (siehe letzte Zeile der Datei train_model.py)

# Export for use in Core ML
model.export_coreml('Classifier.mlmodel')

Zugriff auf die Kamera erlauben

Klicken Sie in der Datei „Info.plist“ auf das kleine Plus rechts neben jedem Eintrag und fügen Sie „Datenschutz – Beschreibung der Kameranutzung“ hinzu, wie unten gezeigt

Das war's für die Einrichtung! Es bleibt nur, all dies umzusetzen.
GIF-Code

Implementieren Sie den Code

Als erstes müssen Sie die Bibliothek importieren reagieren-native-core-ml-image im Projekt. In diesem Beispiel befindet sich der gesamte Code in der Datei App.js

import CoreMLImage from 'react-native-core-ml-image'

Ersetzen Sie als Nächstes die gesamte Methode render() durch Folgendes:

render() {
    let classification = null;
    if (this.state.bestMatch) {
      if (this.state.bestMatch.identifier && this.state.bestMatch.identifier === "hotdog") {
        classification = "Hotdog";
      } else {
        classification = "Not hotdog";
      }
    }
    return (
      <View style={styles.container}>
          <CoreMLImage modelFile="notHotDog" onClassification={(evt) => this.onClassification(evt)}>
              <View style={styles.container}>
                <Text style={styles.info}>{classification}</Text>
              </View>
          </CoreMLImage>
      </View>
    );
  }

Die Methode `onClassification` ermöglicht es uns, Aktualisierungen zu erhalten, wenn ein neues Objekt klassifiziert wurde. Sie gibt die folgenden Daten zurück:

[
{
identifier: "hotdog",
confidence: 0.87
},
{
identifier: "not-hotdog",
confidence: 0.4
}
]

Jetzt müssen wir nur noch die Methode onClassification implementieren , die sich um die Ermittlung der besten Klassifizierung kümmert.

const BEST_MATCH_THRESHOLD = 0.5;
/** */
onClassification(classifications) {
    let bestMatch = null;
    if (classifications && classifications.length) {
      classifications.map(classification => {
        if (!bestMatch || classification.confidence > bestMatch.confidence) {
          bestMatch = classification;
        }
      });
      if (bestMatch.confidence >= BEST_MATCH_THRESHOLD) {
        this.setState({
          bestMatch: bestMatch
        });
      }
      else {
        this.setState({
          bestMatch: null
        });
      }
    }
    else {
      this.setState({
        bestMatch: null
      });
    }
  }

Basierend auf früheren Daten wird dann bestMatch sein

{
identifier: "hotdog",
confidence: 0.87
}

Hier ist der vollständige Code:

import React, { Component } from "react";
import { Platform, StyleSheet, Text, View } from "react-native";
import idx from "idx";
const BEST_MATCH_THRESHOLD = 0.5;
import CoreMLImage from "react-native-core-ml-image";
export default class App extends Component<{}> {
  constructor() {
    super();
    this.state = {
      bestMatch: null
    };
  }
  onClassification(classifications) {
    let bestMatch = null;
    if (classifications && classifications.length) {
      classifications.map(classification => {
        if (!bestMatch || classification.confidence > bestMatch.confidence) {
          bestMatch = classification;
        }
      });
      if (bestMatch.confidence >= BEST_MATCH_THRESHOLD) {
        this.setState({
          bestMatch: bestMatch
        });
      } else {
        this.setState({
          bestMatch: null
        });
      }
    } else {
      this.setState({
        bestMatch: null
      });
    }
  }
  classify() {
    if (idx(this.state, _ => _.bestMatch.identifier)) {
      if (this.state.bestMatch.identifier === "hotdog") {
        return "Hotdog";
      } else {
        return "Not hotdog";
      }
    }
  }
  render() {
    return (
      <View style={styles.container}>
        <CoreMLImage
          modelFile="notHotDog"
          onClassification={evt => this.onClassification(evt)}
        >
          <View style={styles.container}>
            <Text style={styles.info}>{classify()}</Text>
          </View>
        </CoreMLImage>
      </View>
    );
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: "center",
    alignItems: "center",
    backgroundColor: "transparent"
  },
  info: {
    fontSize: 20,
    color: "#ffffff",
    textAlign: "center",
    fontWeight: "900",
    margin: 10
  }
});

Alles, was Sie tun müssen, ist, den Code auf Ihrem iPhone auszuführen (die Kamera funktioniert nicht auf dem Simulator).
Wenn Sie alles richtig gemacht haben, fragt Sie die App nach der Erlaubnis, auf Ihre Kamera zuzugreifen, und Sie können einen Hotdog vom Dackel Ihres Nachbarn unterscheiden.
Danke, dass du mich gelesen hast. Wenn Ihnen der Artikel gefallen hat, zögern Sie nicht, ihn in sozialen Netzwerken zu teilen!
Artikel geschrieben von Jeremia Zarka.