『iOS11』新搭載の「Core ML」を駆使してMNISTの手書き数字認識を試してみた

『iOS11』新搭載の「Core ML」を駆使してMNISTの手書き数字認識を試してみた

今回もありましたね~、Apple社主催カンファレンス「WWDC2017(※注釈)」
※World Wide Developer Conference:Apple社が毎年開催するデベロッパー向けイベント

新製品の「HomePod」を始め、新型ハードウェアもいくつか発表されました。
そして新OS『iOS11』も併せて発表されていましたね。ただ、昨年のiOS10発表時よりも幾分テンション低めかな~? なんて思っていました。
<bitWave関連記事『iOS10新搭載のStickerPackでiMessage専用のスタンプを作ってみた』>

しかし、実際に触ってみると「おぉ〜、めっちゃテンションあがる〜!」みたいな新機能が続々登場。ここで記事化しておかない手はないですね!
さていくつかピックアップしましょう。

『iOS11』ならこんなことができる!

・普通のカメラアプリでQRコードの読み取りが可能に
カメラでQRを読み取ると通知のように上から表示されます。これはすばらしい!!
・Safariでカメラやマイクにアクセスすることが可能に
Safariで鬼門となっていた、WebRTC関連。『iOS11』ではJSからカメラやマイクにアクセスできるようになり、Webの活用幅がグンと増えました。私みたいなアプリ開発者はただひたすら怯えて暮らすのみですね……。
・「CoreNFC」が登場
とうとうiPhone(7以上が対象)がNFCリーダーとなりうる可能性を秘めることになりました。ただし、読み取りのみらしい……。
・ライブラリ「Vision」導入により顔認識強化
新たなライブラリの導入により、顔認識情報をより詳細に取得することができるようになりました。今までは輪郭くらいのみでしたね。
・ライブラリ「ARKit」登場
なかなか高機能なARアプリ向けライブラリのようですね。
・iPhone上でスクリーンレコーディングが可能に
使い方次第では面白いことができそう!

これだけでも十分に楽しそうなのですが、riceman的にはさらに関心度の強い機能があるんですね……

大本命『Core ML』が機械学習が変わる!

本記事タイトルにもある『Core ML』の登場です。

現行OSのiOS10までは、機械学習をさせたモデルをプロジェクトに取り込むのは大変な苦労がありました。
(と言っても、ネット上で把握していただけで、実際に試してはおりませんでしたが……)

以前、手書きの文字認識を試していたことがあったのですが、この時はTensorflowで学習したモデルをサーバに設置して、そこに都度都度通信を送り予測するという方法を採っていました。
つまり自分が画面上で何かを描き、そして置いていた指を離す度に、その都度描いた文字を数値データにして、サーバに問い合わせしていたということです。聞いただけでも、かなり非効率な感じですよね。
<bitWave関連記事『TensorflowとiOS10のカスタムキーボードで手書き文字認識キーボードを作る』>

しかし、今回から導入される『Core ML』により、「keras」や「Caffe」等のMachine Learningライブラリで学習させたモデルを簡単にアプリに取り込むことができるというものです。
詳しくは以下を参照くださいね。
<参照:Apple Developer『Machine Learning』(英語サイト)>
<参照:Apple Developer Documentation『Converting Trained Models to Core ML』(英語サイト)>

従来の機械学習は、一般的に以下のようなステップを踏むことになります。
ステップ①:学習させる
ステップ②:学習させたモデルに対して、何かを与えて結果を返す
しかし、『Core ML』を用いることで、ステップ①を他に任せ、ステップ②だけを実践しようというものなんですね。

実際に『Core ML』を駆使して手書き文字を認識させてみた

しかし、撮影した写真内の顔を認識して仕分けするといった機能はあるものの、あまりiPhone上で学習させたいってものってそんなにないですよねぇ。

先ほどご紹介した「Apple Developer」サイトではいくつかの画像認識モデル用サンプルが用意されていましたが、それをそのまま用いたのではツマンナイ。
そこで新人開発員・中村くんの協力の元、MINISTのデータを元に数字の認識を行うアプリデモを作って見ました!
※あいにく『Core ML』自体がBeta版であるため、開発工程のスクリーンショットは公開できません。最後に完成品アニメーションを公開しているので、今回はそれでご勘弁を!

作業手順概要

手順①:「mlmodel」という拡張子の学習データを用意する
実施するためにAppleが作成したPythonのライブラリを使用します。
この使い方の説明は以下サイトをご参照ください。
<参照:Python Package Index『coremltools 0.3.0』(英語サイト)>
※今回どのように実践したかは、中村くん後日記事化してくれる……ハズ

手順②:これをBeta版「XCode」に対してドラッグ&ドロップで追加する

手順③:「手順①」で用意した「mlmodel」を使用したいクラスのトップに「import CoreML」と追加する

手順④:手書きをできるViewを用意する

★これより下はもっと簡単なやり方があったかもしれないけど……★
手順⑤:手書きできるエリアのViewを画像にする

手順⑥:28×28のMNISTと同じデータになるようにリサイズする

手順⑦:リサイズした画像データを1pxずつ読み取って、数値データにする

★これより「mnist model」に渡す作業になります★
手順⑧:「MLMultiArray」で784次元データを作成

手順⑨:「手順⑧」の中身空っぽデータに「手順⑦」で作成した数値データを入れていく
ちなみに今回はこんな感じでした。

手順⑩:「手順⑨」で作ったデータを元に「mnistInput」インスタンスを作成する

手順⑪:「手順⑩」のデータで予測を行う

手順⑫:予測されたデータが10次元の「one hot vector」データ([0,1,0,0,0,0,0,0,0,0,0]みたいなの)になっているので、一番高い数値を調べる
今回の場合、左から順に0123456789という感じだったので、上のデータの場合は手書きした数値の予想は「1だ!」という感じになりますね。

手順⑬:「手順⑫」のデータを画面上に表示する

今回の作業手順で気になったこと・苦労ポイント

まず「MLMultiArray」の扱い方が分からなかったですね。実を言うと、今でもこのやり方でいいのか確信がもてません。
特にこの太字の部分ですね。。。
let mlarray = try! MLMultiArray(shape: [784], dataType: MLMultiArrayDataType.int32)

そして完成品がコチラ!


なかなかの精度と言えるのではないでしょうか!
(私が精度が出るように描いているのもありますが……)

今回『Core ML』を使ってみて感じたのは、めちゃくちゃ便利だし、簡単に取り込めるといった印象を受けました。
ただし、引き続き「keras」などで学習をするフェーズもこなせるようにならないといけませんね。

今回のミッションにあたって参考にしたサイトも併せてご紹介いたします。
<参照:『iOS 11: Machine Learning for everyone』(英語サイト)>
こちらのサイト、英語ですがなかなか踏み込んで書いてあります。
今回私は触れておりませんでしたが、新ライブラリ「Vision」との組み合わせについても紹介されており、色々試してみたくなりますね。
一旦「Vision」で顔パーツを取り出した後、自分の学習モデルにいれて顔認証……とか。

正式リリース前に夢広がる『iOS11』新機能でした!

コメント