Machine Learning op iOS mat CoreML a React-Native

Wann Dir wéi ech sidd, an Dir hutt ëmmer gedreemt eng Applikatioun z'entwéckelen déi fäeg ass en Hotdog vun Ärem Noper säin Dackel mat Ärem Iphone ze differenzéieren, dësen Tutorial ass fir Iech. Fir dëst ze maachen, benotze mir React-Native, a Maschinnléieren. Lass !
Machine Learning Léisunge si laang an der Wollek iwwer APIen verfügbar, awer si erfuerderen eng Internetverbindung a kéinten Zäitopwendeg an deier sinn fir ze veraarbecht.
Mat der Verëffentlechung vum iOS 11 huet Apple seng Machine Learning Bibliothéik, CoreML, fir Entwéckler zur Verfügung gestallt. Elo ass et net méi néideg e mächtege Server ze hunn fir Ufroen ze veraarbechten oder eng Drëtt Partei API ze ruffen. CoreML këmmert sech ëm alles mat der Rechenkraaft vun Ärem Smartphone.
Sidd Dir virwëtzeg wéi Dir et an Är Uwendungen integréiere kënnt? Et ass méi einfach wéi Dir denkt.
Loosst eis als Beispill déi berühmt Parodie-Applikatioun huelen Net Hotdog, an der Serie entdeckt Silicon Valley, déi, wann de Benotzer säi Smartphone op en Objet weist, him direkt seet, ob deen op en Hotdog kuckt oder net.
Net Hot Dog

Wat Dir an dësem Deel léiere wäert

  • Installéiert Är Ëmwelt
  • Sammelen Daten
  • Erstellt Äre Bildklassifizéierungsmodell mat Turi Create
  • Erkennt en Hotdog mat der Kamera vun Ärem iPhone

Viraussetzunge

  • macOS 10.12+
  • oder Linux (mat glibc 2.12+)
  • oder Windows 10 (iwwer WSL)

  • Python 2.7, 3.5 oder 3.6

  • eng x86_64 Architektur

  • Xcode 9

  • iOS 11 +

Wat ass Turi Create?

Et ass en Tool dat "d'Entwécklung vu personaliséierte Maschinnléiermodeller vereinfacht", déi dann an Uwendungen benotzt kënne mat der CoreML Bibliothéik.
Turi Create baséiert um Deep Learning Kader Apache's MXNet
Turi Create bitt Entwéckler flexibel Technologie fir Biller ze klassifizéieren, Objekter z'entdecken, Empfehlungssystemer ze designen, etc.
Den Tool ass extrem einfach ze benotzen, flexibel a séier.

Seng Installatioun

Wéi mat villen Machine Learning Tools, Python ass d'Sprooch déi benotzt gëtt. Awer maach der keng Suergen, de Code ass ganz einfach ze verstoen.
Et ass recommandéiert e virtuellt Ëmfeld ze benotzen, virtualenv, gitt de Kommando

pip install virtualenv

Wann Dir kee Pip hutt, de Python Package Manager, kënnt Dir et mat installéieren Homebrew andeems Dir de Kommando aginn

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

Sammelen Daten

Ier mer e Modell trainéiere kënnen, brauche mir Daten.
Dës Donnéeë kënnen op der Websäit fonnt ginn IMAGEnet dat ass eng ganz grouss Bilddatebank, mat iwwer 14 Millioune Resultater.
Fir eise Projet brauche mir zwou Kategorien vu Biller: Hotdog an ... Not Hotdog.
Hei ass de Link fir déi éischt Kategorie: http://www.image-net.org/synset?wnid=n07697537.

Dir kënnt och all d'Links mat der ëffentlecher API recuperéieren, iwwer de Knäppchen Download an der Tab erofgelueden

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

Benotzt turicreate-einfach Scripten

Dir kënnt am Repository fannen turicreate-einfach-Scripten eng Rei vu Scripten déi Äert Liewen méi einfach maachen.
Also nom Klonen vun der Repos an der Installatioun vun den Ordner Ofhängegkeeten download-image :

cd download-images
npm install

Dir kënnt de Kommando ausféieren:

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

A kritt en Dossier voller Biller vun Hotdogs.
Alles wat bleift ass datselwecht fir Not Hotdog ze maachen. Also wielt d'Kategorie(n) déi Dir am meeschte gär hutt a kategoriséiert se als net-Hotdog

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

Trainéiert de Modell

Wann d'Biller eropgelueden a kategoriséiert sinn, bleift just de Klassifikatiounsmodell ze trainéieren.
Fir dëst ze maachen, kënnt Dir de Python Skript benotzen, deen am virdru erofgeluede Repository verfügbar ass

cd train-model
python train-model.py


Dir kritt no ongeféier zéng Minutten (oder méi ofhängeg vun der Unzuel vun de Biller déi veraarbecht ginn) eng Datei Classifier.mlmodel déi mir elo kënne benotzen.
giff ml

Erstellt e React-Native Projet

Als éischt musst Dir en neie React-Native Projet erstellen.
Öffnen Ären Terminal, navigéiert an Äre Projeten Dossier a gitt de folgende Kommando:

react-native init notHotDog (ou tout autre nom)

No e puer Minutten gëtt alles installéiert an Dir sidd prett fir weiderzekommen.

Installéiert d'CoreML Bibliothéik

Mir wäerten d'Bibliothéik benotzen reagéieren-native-core-ml-image

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

Gitt op Äre Projet, dann an den "ios" Dossier an duebel klickt op d'notHotDog.xcodeproj Datei fir se an Xcode opzemaachen

Konfiguréieren de Projet

Par défaut sinn React-Native Projete konfiguréiert fir haaptsächlech Objective-C ze benotzen. D'Buchgeschäft reagéieren-native-core-ml-image am Swift geschriwwe ginn, wäert et néideg sinn e puer Parameteren am Projet z'änneren
Als éischt musse mir eng Swift-Datei zum Projet addéieren


Den Numm ass egal, et gëtt souwisou net benotzt. E Message erschéngt dann deen suggeréiert datt Dir en "Objective-C Bridging Header" erstellt: dëst ass de Fichier benotzt fir de Link tëscht Swift an den Headerdateien vun den Objective-C Klassen ze maachen

Endlech, d'Bibliothéik déi am Swift 4.0 geschriwwe gëtt, musst Dir d'Versioun vu Swift spezifizéieren fir ze benotzen (3.2 ass d'Standardversioun).
Klickt op d'Wuerzel vum Projet (notHotDog), wielt de Tab "Build Settings", dann ganz ënnen, ännert d'Versioun vun der Swift Sprooch fir ze benotzen.

Import de CoreML Modell an de Projet

Ier Dir weider op de Programméierungsdeel weidergeet, bleift just eise Bildklassifizéierungsmodell an den notHotDog Projet z'importéieren.
Drag and drop Schabloun Classifier.mlmodel an ëmbenennen et notHotDog.mlmodelc (nee, dat ass keen Tippfeeler)

CoreML funktionnéiert net direkt mat _.mlmodel Dateien, Dir musst se als éischt op _.mlmodelc (c fir kompiléiert) iwwersetzen, awer eist Python Skript huet dat scho gesuergt. (kuckt déi lescht Zeil vun der Datei train_model.py)

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

Erlaabt Kamera Zougang

An der Info.plist Datei, klickt op de klenge Plus riets vun all Entrée a füügt "Privatsphär - Camera Usage Description" wéi hei ënnendrënner.

Dat ass et fir de Setup! Et bleift nëmmen all dëst ëmzesetzen.
gif Code

Ëmsetzen de Code

Déi éischt Saach ze maachen ass d'Bibliothéik z'importéieren reagéieren-native-core-ml-image am Projet. Fir dëst Beispill wäert de ganze Code an der Datei sinn App.js

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

Als nächst ersetzt déi ganz Render () Method mat de folgenden:

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

D 'Method op Klassifikatioun erlaabt eis Updates ze kréien wann en neien Objet klasséiert gouf. Et gëtt déi folgend Donnéeën zréck:

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

Mir mussen just d'Method ëmsetzen op Klassifikatioun deen responsabel ass fir déi bescht Klassifikatioun ze fannen.

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

Baséierend op virdrun Donnéeën, da wäert bestMatch sinn

{
identifier: "hotdog",
confidence: 0.87
}

Hei ass de komplette 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 wat Dir maache musst ass de Code op Ärem iPhone auszeféieren (d'Kamera funktionnéiert net um Simulator).
Wann Dir alles richteg gemaach hutt, freet d'App Iech d'Erlaabnis fir op Är Kamera ze kommen an Dir wäert fäeg sinn engem Hotdog vum Dachshund vun Ärem Noper ze soen.
Merci fir mech ze liesen. Wann Dir den Artikel gefall hutt, zéckt net en op de sozialen Netzwierker ze deelen!
Artikel geschriwwen vum Jeremiah Zarca.