iPhoneとAIでマスクしている人を判別する


現在コロナウィルスが猛威を奮っております。ITパワーで何かできないものでしょうか。

開発環境

  • XCode iOS Swift
  • Vision Framework
    iOSで顔の検出ができます。
  • CoreML Framework
    iOSで学習モデルを扱います。
  • Turi Create
    MACで学習モデルを作成します。

画像判別のまとめ

機械学習にはモデルが必要です。Inception v3という公開モデルには1000個のカテゴリーが入っています。マウスであったり、コンピューターキーボードであったり、PCモニターの前に座った人をバーバーと判別したりします。
結果は、全てのカテゴリーを足して100になるように出ます。ABCDEの5つある場合、A80、B10、C10、D0、E0、のように「強いて言えばどれか」という結果になります。
なので、特定のモノを判別させたければ、違うモノを判別する必要があります。

顔検出と顔判別は以前の記事にあります。
iPhoneで顔認識 - Qiita

学習モデルの作成

今回はマスクするしないの2つだけです。結果はMask80%、None20%のようになります。MaskフォルダとNoneフォルダに顔写真をいっぱい入れて、pythonを実行して学習モデルを作成します。

model.py
import turicreate as tc
import os

data = tc.image_analysis.load_images('train', with_path=True, recursive=True)
data['label'] = data['path'].apply(lambda path: os.path.basename(os.path.dirname(path)))
data.save('Chicken.sframe')

train_data, test_data = data.random_split(0.9)
model = tc.image_classifier.create(train_data, target='label', max_iterations=100)

predictions = model.predict(test_data)
metrics = model.evaluate(test_data)
print('metrics=' + str(metrics['accuracy']))

model.save('Chicken.model')
model.export_coreml('Chicken.mlmodel')

実験

  1. マスクは顔検出できず(ちっきしょー)
    元々のアプリは顔検出 → 画像切り抜き → 顔の判別です。使えなくて残念です。

  2. 全画面を判別するよう修正しました。
    日本人限定、女性限定、正面限定、白マスク限定(試行錯誤しました)
    一応下のサンプルはフリー素材使っています。

  3. 結果
    マスク判定が99なのがおかしいです。不明なものはすべてマスクになっている模様。作業の途中で悟りました。もっと他にいい方法があるはず。

ソース

動かすにはmodelを作成する必要があります。
https://github.com/koji4104/VisionCoreML

まとめ

iPhoneで画像の機械学習を行うアプリは、いろいろ作り直して今回で3つ目です。判別しやすい画像や、トレーニング画像の集め方など、少しづつコツが掴めたと思います。
今回あまりうまくいきませんでしたけど、仮にマスクの判別がうまくいったとして、それからどうするかも課題です。アプリ側で一般的なCMSと連携できる機能があればいいかなと思います。