iOS(Core ML)への Edge のデプロイのチュートリアル

作業内容

このチュートリアルでは、エクスポートされたカスタム Core ML モデル(.mlmodel)をダウンロードし、モデルを使用して花の画像を識別する既製の iOS アプリを実行します。

アプリイメージの変更

目標

この入門用のエンドツーエンドのチュートリアルでは、コードを使用して次のことを行います。

  • トレーニング済みの Core ML モデルを iOS アプリで実行する。

概要

Core ML フレームワークでは、トレーニング済みの機械学習モデルを使用して入力データを分類できます。Vision フレームワークは、CoreML と連携して画像に分類モデルを適用し、画像を前処理して機械学習タスクをより簡単で信頼性の高いものにします。

始める前に

一般的な Edge モデルをダウンロードする

  1. トレーニング済みの Core ML モデルを含むフォルダをダウンロードします。このチュートリアルでは、このモデルを使用します。

  2. ダウンロードした zip ファイルを解凍します。

  3. チュートリアルを開始する前に、ルート プロジェクト ディレクトリに移動します。

    cd ClassifyingImagesWithVisionAndCoreML
    このディレクトリから次のコードサンプルをすべて実行します。

Edge モデルのトレーニングとエクスポート

続行する前に、次の変更を加えて Edge デバイスモデル クイックスタートを完了させます。

  • Google 提供の花のデータセットか、お客様自身のデータセットを使用します。
  • [モデルをトレーニングする] ステップで、Edge モデルのラジオボタンを選択します。
  • [モデルをエクスポートする] ステップで、Core ML モデルのエクスポートの手順に従います。

最終版の花の Core ML model.mlmodel ファイルを使用し、既存の iOS アプリのカスタマイズ版を実行します。

iOS アプリを設定する

デモ iOS アプリには次の追加ツールが必要です。

  1. Xcode
  2. Xcode コマンドライン ツール

Xcode をダウンロードする

以下のリンクを使用して、Xcode をお客様のマシンにダウンロードします。

Xcode コマンドライン ツールをインストールする

コマンドラインで次のコマンドを実行して、Xcode コマンドライン ツールをインストールします。

xcode-select --install

プロジェクトを開く

Xcode でプロジェクトを開きます。プロジェクトを開くには、コマンドラインか UI を使用します。プロジェクトをコマンドラインから開くには、次のコマンドを実行します。

open ./Vision+ML\ Example.xcodeproj

オリジナル アプリの実行

Simulator でアプリを起動して画像アノテーションを取得する手順は次のとおりです。

  1. アプリを起動するには、Xcode ウィンドウの左上隅にある再生ボタン xcode 再生アイコン を選択します。
  2. 予測画像をアプリに提供します。画像は次の 2 つの方法で指定できます。
    • デバイスのカメラで写真を撮影する
    • 写真を Simulator のウィンドウにドラッグ&ドロップしてデバイスの写真ライブラリに写真を追加する

アプリは、モデルがそれぞれに割り当てる信頼度の順に上位 2 つの分類カテゴリを表示します。

結果には、次のようなアノテーションが表示されます。

一般的なオリジナル アプリを使用した分類: 家具、果物、植物

カスタマイズしたアプリを実行する

オリジナルのアプリは、標準の MobileNet を使用して 1,000 個の一般的な ImageNet クラス(動物、果物、家具、植物など)のうちのいずれか 1 つに画像を分類する Core ML モデルを使用します。

カスタムの花の画像カテゴリで、再トレーニングされたモデルを使用するようにアプリを変更します。

  • デイジー
  • タンポポ
  • バラ
  • ヒマワリ
  • チューリップ

モデルファイルをプロジェクトに追加する

  1. Edge デバイスモデルのクイックスタートを完了することで取得できる、カスタムした花のモデル(エクスポートされた Core ML model.mlmodel)をダウンロードします。Core ML モデルからエクスポートされた model.mlmodel ファイルと dict.txt ファイルは、指定した Google Cloud Storage の場所に保存されます。

  2. カスタムモデルの名前を AutoML.mlmodel に変更します。

  3. 既存のモデル(MobileNet.mlmodel)をプロジェクトから削除します。

  4. Vision+ML Example フォルダにあるプロジェクトにカスタムモデルを追加します。

    カスタムモデルを Xcode 画像にドラッグする

  5. ImageClassificationViewController で 30 行目を変更します。削除:

    let model = try VNCoreMLModel(for: MobileNet().model)

    この行を次のように置き換えます。

    let model = try VNCoreMLModel(for: AutoML().model)

カスタムモデル アプリを実行する

Simulator でアプリを再起動するには、Xcode ウィンドウの左上隅にある再生ボタン xcode 再生アイコン を選択します。

修正をテストするには、flower_photos/ ディレクトリから画像ファイルを追加し、予測を取得します。

結果は次のようになります。

アプリイメージの変更

デフォルトの画像は花ではありません。

モデルを試すには、以前にダウンロードしたトレーニング データ画像を追加するか、Google 検索から画像をダウンロードして予測に使用します。

仕組み

これでアプリケーションを実行できました。CoreML と Vision Framework 固有のコードを確認します。

Core ML モデルで Vision を設定する

Core ML は、ML モデルに簡単にアクセスできる Swift クラスを自動的に生成します。

このサンプルでは、Core ML は MobileNetmodel から MobileNet クラスを自動的に生成します。

  • 次のコードでモデル インスタンスを取得します。

    let model = try VNCoreMLModel(for: MobileNet().model)
  • 上記のモデルと完了ハンドラを使用して Vision リクエストを作成します。完了ハンドラは、モデルからの予測レスポンスを処理します。

  • メインスレッドで UI を更新する必要があります:

    let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in
    DispatchQueue.main.async {
    guard let results = request.results else {
    self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)"
    return
    }
    

このプロジェクトの Core ML モデルで指定されているように、results は常に VNClassificationObservation にあります。

let classifications = results as! [VNClassificationObservation]
})

Vision リクエストの完了ハンドラにより、リクエストが成功したかどうかが示されます。成功した場合、results プロパティには ML モデルによって識別される可能性のある分類を記述する VNClassificationObservation オブジェクトが含められます。

  1. ML モデルでは、入力画像を固定のアスペクト比で処理しますが、入力画像のアスペクト比はさまざまであるため、画像が収まるように拡大縮小やトリミングする必要があります。最適化するには、リクエストの imageCropAndScaleOption プロパティを設定して、モデルのトレーニング時に使用した画像レイアウトに合わせます。

    request.imageCropAndScaleOption = .centerCrop
  2. 次のコードを使用して、入力画像で VisionRequestHandler を作成します。

    let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
  3. リクエスト オブジェクトを渡してハンドラの perform 関数を呼び出します。

    do {
    try handler.perform([self.classificationRequest])
    } catch {

    このハンドラは一般的な画像処理エラーをキャッチします。classificationRequest の完了ハンドラ processClassifications(_:error:) は、そのリクエストの処理に固有のエラーをキャッチします。

    print("Failed to perform classification.\n\(error.localizedDescription)")
    }

次のステップ

これで、AutoML Vision Edge からエクスポートされた Core ML モデルを使用した iOS 花の分類アプリのチュートリアルが完了しました。トレーニング済みの Core ML モデルを使用して一般的な画像分類アプリを修正し、花のカスタム サンプル アノテーションを取得しました。Core ML 固有のコードを調べて、基礎となる機能を理解しました。

コア ML モデルと AutoML Vision Edge については、以下のリソースを参照してください。

  • CoreML の詳細については、公式ドキュメントとコード リポジトリをご覧ください。
  • カメラ バージョンのデモアプリを使用して、モデルの量子化バージョンを使用します。同じ機能を、小型かつ効率的なパッケージで利用できます。
  • 音声ホットワード検出ツールやスマート リプライのデバイス バージョンなど、他の TFLite 対応モデルをお試しください。