こんにちは。
最近周囲で何かと「AI」や「ディープラーニング」とかいう単語が話題になっていますが、iOSにおいてもついにiOS11からcoreMLという機械学習の仕組みが登場します。
そのcoreMLをいち早く使って画像認識を行ってみたので、その内容をご紹介したいと思います。

開発環境の準備

XcodeとiOS11の端末を、下記ページよりダウンロード、インストールします。

https://developer.apple.com/download/

サンプルプロジェクトの取得

下記サイトの「Image Classification with Vision and CoreML」よりサンプルプロジェクトをダウンロードします。

https://developer.apple.com/videos/play/wwdc2017/506/

これをビルドすると手書き文字を認識するアプリができあがります。
試すだけならこれだけでもいいのですが、なぜか私の場合はあまり認識してくれませんでした…
(字が汚すぎるんですかね…?)

画像認識用モデルの取得

実は既に学習済みのモデルがいくつか用意されています。
下記サイトより、VGG16をダウンロードして、プロジェクトにインポートしてください。
※ResNet50でも以下同じことができます

https://developer.apple.com/machine-learning/

コード一部改修

新たに追加したモデルで認識を行うため、ViewController.swiftの下記のコードを修正します。

classificationRequest内

let model = try VNCoreMLModel(for: VGG16().model) #モデル名を変更

imagePickerController内

let handler = VNImageRequestHandler(ciImage: inputImage) //変更
DispatchQueue.global(qos: .userInteractive).async {
    do {
        try handler.perform([self.classificationRequest]) //変更
    } catch {
        print(error)
    }
}

実行

ここまでやれば実際に画像認識を試すことができます。
試しにオフィスにあった観葉植物を認識させてみました。

「flowerpot(植木鉢)」と表示されているので、正しく認識されているようですね。

リアルタイムで認識

このままだと認識する画像を都度選択 or 撮影しないといけないので、リアルタイム認識するようにしてみました。

…が、認識の処理に時間がかかりすぎてまともに動くものにはなりませんでした。
以前TensorFlowで同じものを作った際にはスムーズに動いていたので、まだまだ色々と課題がありそうです。


↑リアルタイムを諦めて、「ボタンを押した時に写っていたものを認識する」という仕様にしてみましたが、これでもラグが大きすぎてまともに使えませんでした

まとめ

coreMLを少しだけ使ってみましたが、やはり標準機能というだけあって最初の導入は非常に簡単でした。
「機械学習に興味があるけどTensorFlowなどの導入はハードルが高い」などと感じている人にとってはいいかもです。

ただ、実際の動きに関してはTensorFlowの方が圧倒的に早いかな、という印象です。
もちろんcoreMLについて完全に理解しているわけではないので(むしろサンプルを少し触った程度なので)、使い方に問題がある可能性は大いにありますが。

何はともあれ、サンプルを動かすだけなら非常に簡単なので、皆さんも是非一度coreMLを触ってみてはいかがでしょうか。