iPhoneと機械学習で何か面白いものを作ろうと思い、今回はフライドチキンの分類を作りました。〇ンタッキーフライドチキンの部位は、キール(胸)、リブ(あばら)、ウイング(手羽)、サイ(腰)、ドラム(脚)の5つのカテゴリーに分けられます。この5つのうちどれかを分類します。
内容
機械学習の簡単な説明
機械学習には学習済みモデルが必要です。モデルに画像を与えると「強いて言えば何か」が結果として出力されます。モデルはいくつか公開されていて、InceptionV3(Google)、VGG16(Oxford大学)、ResNet50(Microsoft Research)などがあります。モデルというと想像できにくいですが、拡張子 .mlmodel の100MB程度のファイルです。
この公開モデルには1000個のカテゴリーが入っています。例えばマウスであったり、コンピューターキーボードであったり、PCモニターの前に座った人をバーバーと分類したりします。画像を与えると全てのカテゴリーを足して100になるように結果が出ます。Aが80点と出る時もあれば、A30点、B25点、C20点と微妙な時もあります。
今回やること
今回のフライドチキンは5つのカテゴリーです。なのでカメラで人をとらえても「リブ」などと表示されてしまいます。1回の分類ではどうしても誤差が出てしまうので、1秒間に2回分類して、結果をリアルタイムに更新するような仕様にしました。
開発環境
- XCode iOS Swift
- CoreML Framework
iOSの機械学習ライブラリ - Turi Create
学習モデルを作成します。Pythonで動かします。作ったモデルをiPhoneに送ります(TuriはAppleがを2016年に買収しました)
モデルの作成
手順
- Python と Turi Create をインストールします。
- トレーニング画像(チキンの画像)をいっぱい集めます。
- 画像をフォルダに分けます。
- ターミナルで python model.py を実行します。
- 結果、Chicken.mlmodel が作成されます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F253995%2F5046492b-584b-6301-87f0-4abb630640f0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=26f2bd0f64baad0cc9297498070934c5)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F253995%2Fe4209152-2838-799c-e198-257236eff9c3.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=30b61b99f141a3e3ffd194fe33cc810c)
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')
解説
trainフォルダの下にフォルダを作り、トレーニング画像であるチキンの画像を200枚くらい入れます(頑張りました)。モデルを作成すると「フォルダ名」がそのまま「分類名」になります。今回の例では、drum、keel、rib、thigh、wing の5つのフォルダを作り、それぞれに画像を入れます。実行してできた Chicken.mlmodel を XCode プロジェクトにコピーします。
アプリ
ソースはGithubに置きました。Inceptionv3モデルが入っています。自作したモデルを入れ替えて使ってください。
https://github.com/koji4104/ImageDetector
解説
上の例は、wing(手羽)とdrum(脚)です。このアプリでは毎回結果をプラスして、20をマイナスします。1秒間に2回処理をするので、何もなければ2.5秒でゼロになります。
まとめ
画像分類は可能性があると思います。素人では見分けがつかないものでも、分類できるようになります。今回のアプリではiPhone(iPad)を使うので、人が持ち運んで使うことができます。顔認証などは大手企業がやるでしょうから、私のような小さな会社は、特定の業界や施設に特化した画像分類をやれば、何かビジネスなるかもしれません。
画像分類の実験を何度かやって思うのですが、とにかく学習モデルを作るのが面倒です。前回は写真を必要なとこだけ手作業で切り取っていましたが、今回は写真を正方形で中心で撮って、加工なしで使っています。かなり作業は減りましたが、それでもフォルダに振り分けるのが面倒でした。撮ると同時にファイル名を付けるなど、まだまだ成長の要素があると思います。