Pembelajaran Mesin pada iOS dengan CoreML dan React-Native

Jika anda seperti saya, dan anda sentiasa bermimpi untuk membangunkan aplikasi yang mampu membezakan hotdog daripada dachshund jiran anda menggunakan Iphone anda, tutorial ini adalah untuk anda. Untuk melakukan ini, kami akan menggunakan React-Native dan pembelajaran mesin. Mari pergi !
Penyelesaian Pembelajaran Mesin telah lama tersedia di awan melalui API, tetapi ia memerlukan sambungan internet dan boleh memakan masa dan mahal untuk diproses.
Dengan keluaran iOS 11, Apple telah menjadikan perpustakaan Pembelajaran Mesinnya, CoreML, tersedia kepada pembangun. Kini, tidak perlu lagi mempunyai pelayan yang berkuasa untuk memproses permintaan atau memanggil API pihak ketiga. CoreML menguruskan segala-galanya dengan kuasa pengkomputeran telefon pintar anda.
Adakah anda ingin tahu bagaimana untuk mengintegrasikannya ke dalam aplikasi anda? Ia lebih mudah daripada yang anda fikirkan.
Mari kita ambil sebagai contoh, aplikasi parodi yang terkenal Bukan Hotdog, ditemui dalam siri ini Lembah Silikon, yang, apabila pengguna menghalakan telefon pintar mereka pada objek, serta-merta memberitahu mereka sama ada pengguna sedang melihat hotdog atau tidak.
Bukan hot dog

Apa yang anda akan pelajari dalam bahagian ini

  • Pasang persekitaran anda
  • Mengumpul data
  • Cipta model klasifikasi imej anda dengan Turi Create
  • Kenali hotdog menggunakan kamera iPhone anda

Prasyarat

  • macOS 10.12+
  • atau Linux (dengan glibc 2.12+)
  • atau Windows 10 (melalui WSL)

  • Python 2.7, 3.5 atau 3.6

  • seni bina x86_64

  • Xcode 9

  • iOS11+

Apakah Turi Create?

Ia ialah alat yang "memudahkan pembangunan model pembelajaran mesin tersuai", yang kemudiannya boleh digunakan dalam aplikasi menggunakan perpustakaan CoreML.
Turi Create adalah berdasarkan rangka kerja Deep Learning MXNet milik Apache
Turi Create menyediakan pembangun teknologi yang fleksibel untuk mengklasifikasikan imej, mengesan objek, sistem pengesyoran reka bentuk, dsb.
Alat ini sangat mudah digunakan, fleksibel dan pantas.

Pemasangannya

Seperti banyak alat Pembelajaran Mesin, ular sawa ialah bahasa yang digunakan. Tetapi jangan risau, kod ini sangat mudah difahami.
Adalah disyorkan untuk menggunakan persekitaran maya, virtualenv, memasukkan arahan

pip install virtualenv

Jika anda tidak mempunyai pip, pengurus pakej Python, anda boleh memasangnya Homebrew dengan memasukkan arahan

brew install pip

kemudian,

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

Mengumpul data

Sebelum kita boleh melatih model, kita memerlukan data.
Data ini boleh didapati di laman web ImageNet yang merupakan pangkalan data imej yang sangat besar, dengan lebih 14 juta hasil.
Untuk projek kami, kami memerlukan dua kategori imej: Hotdog dan… Bukan Hotdog.
Berikut adalah pautan untuk kategori pertama: http://www.image-net.org/synset?wnid=n07697537.

Anda juga boleh mendapatkan semula semua pautan menggunakan API awam, melalui butang Muat Turun di tab Muat Turun

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

Menggunakan skrip mudah-turicreate

Anda boleh mencari di repositori skrip-mudah-turicreate satu set skrip yang akan menjadikan hidup anda lebih mudah.
Jadi selepas mengklon repo dan memasang kebergantungan folder download-image :

cd download-images
npm install

Anda boleh menjalankan arahan:

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

Dan dapatkan folder penuh dengan gambar hotdog.
Apa yang tinggal ialah melakukan perkara yang sama untuk Bukan Hotdog. Jadi pilih kategori yang paling anda suka dan kategorikannya sebagai bukan hotdog

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

Latih model

Apabila imej telah dimuat naik dan dikategorikan, yang tinggal hanyalah melatih model klasifikasi.
Untuk melakukan ini, anda boleh menggunakan skrip python yang disediakan dalam repositori yang dimuat turun sebelum ini

cd train-model
python train-model.py


Anda akan memperoleh fail selepas kira-kira sepuluh minit (atau lebih bergantung pada bilangan imej yang akan diproses). Classifier.mlmodel yang kini boleh kita gunakan.
gif ml

Buat projek React-Native

Pertama, anda perlu membuat projek React-Native baharu.
Buka terminal anda, navigasi ke folder projek anda dan masukkan arahan berikut:

react-native init notHotDog (ou tout autre nom)

Selepas beberapa minit, semuanya akan dipasang dan anda akan bersedia untuk meneruskan.

Pasang pustaka CoreML

Kami akan menggunakan perpustakaan react-native-core-ml-imej

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

Pergi ke projek anda, kemudian ke folder "ios" dan klik dua kali pada fail notHotDog.xcodeproj untuk membukanya dalam Xcode

Konfigurasikan projek

Secara lalai, projek React-Native dikonfigurasikan untuk menggunakan Objective-C terutamanya. Kedai buku react-native-core-ml-imej ditulis dalam Swift, adalah perlu untuk menukar beberapa parameter dalam projek
Pertama sekali, kita perlu menambah fail Swift pada projek itu


Nama tidak mengapa, ia tidak akan digunakan pula. Mesej kemudian muncul mencadangkan anda membuat "Pengepala Penjembatan Objektif-C": ini ialah fail yang digunakan untuk membuat pautan antara Swift dan fail pengepala Kelas Objektif-C

Akhirnya, perpustakaan yang ditulis dalam Swift 4.0, anda perlu menentukan versi Swift untuk digunakan (3.2 sebagai versi lalai).
Klik pada akar projek (bukanHotDog), pilih tab "Bina Tetapan", kemudian di bahagian paling bawah, tukar versi bahasa Swift untuk digunakan.

Import model CoreML ke dalam projek

Sebelum beralih ke bahagian pengaturcaraan, yang tinggal hanyalah mengimport model klasifikasi imej kami ke dalam projek notHotDog.
Seret dan lepas templat Classifier.mlmodel dan menamakan semula notHotDog.mlmodelc (tidak, itu bukan kesilapan menaip)

CoreML tidak berfungsi secara langsung dengan fail _.mlmodel, anda perlu menterjemahkannya kepada _.mlmodelc (c untuk disusun) terlebih dahulu, tetapi skrip Python kami telah mengurusnya. (lihat baris terakhir fail train_model.py)

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

Benarkan akses kamera

Dalam fail Info.plist, klik pada tambah kecil di sebelah kanan setiap entri dan tambah "Privasi - Perihalan Penggunaan Kamera" seperti yang ditunjukkan di bawah

Itu sahaja untuk persediaan! Ia kekal hanya untuk melaksanakan semua ini.
kod gif

Laksanakan kod

Perkara pertama yang perlu dilakukan ialah mengimport perpustakaan react-native-core-ml-imej dalam projek itu. Untuk contoh ini, semua kod akan berada dalam fail App.js

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

Seterusnya, gantikan keseluruhan kaedah render() dengan yang berikut:

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

Kaedah ini onKlasifikasi membolehkan kami menerima kemas kini apabila objek baharu telah diklasifikasikan. Ia mengembalikan data berikut:

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

Kita hanya perlu melaksanakan kaedah tersebut onKlasifikasi yang bertanggungjawab mencari klasifikasi terbaik.

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

Berdasarkan data sebelumnya, maka bestMatch akan menjadi

{
identifier: "hotdog",
confidence: 0.87
}

Berikut adalah kod penuh:

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

Apa yang anda perlu lakukan ialah menjalankan kod pada iPhone anda (kamera tidak akan berfungsi pada simulator).
Jika anda telah melakukan segala-galanya dengan betul, apl akan meminta kebenaran anda untuk mengakses kamera anda dan anda akan dapat memberitahu hotdog daripada dachshund jiran anda.
Terima kasih kerana membaca saya. Jika anda menyukai artikel itu, jangan teragak-agak untuk berkongsi di rangkaian sosial!
Artikel yang ditulis oleh Jeremiah Zarca.