もちもちうnchi大学

こんにちは〜

iOS CoreML(機械学習)でカメラを使ったアプリをつくったよ・o・

iOS11で追加された「Core ML」を試すためにこんなアプリを作ってみました

 

iPhoneのインカメラから画像を取得して、手が認識できた時に止まるだけの簡単なストップウォッチ的アプリです

ヒトデみたいな形ならなんでも反応する傾向があります

記録としてアプリ制作の流れを簡単に紹介しますー

用意した環境

Macbook Pro 2015 13インチの2コアの普通のやつ

iPhone7

Xcode 9.3

Anaconda2

Tensorflow 1.1.0

Keras 2.0.4

制作の流れ

UIを考える

アプリの見た目だけつくる

機械学習のモデルをつくる

つくったモデルをアプリに組み込む

 

 UIデザイン

いつも通りAdobe XDでささっと作る

一日くらいでできる

f:id:momomoromo:20180511002429p:plain

実際に出来たものとちょっと見た目は違う

アプリの見た目をつくる

特に特殊なことはしていないので省略

以前ストーリーボードでつくって痛い目にあったので全部コードで書いた

機械学習のモデルをつくる

注意 iOSで使うモデルを学習させる時はKerasのバージョンに注意

バージョンを確認せずに作ったモデルだと、CoreMLToolsで変換することが出来ないです

何も考えずWindowsPCのGPUをフル稼働させて作ったモデルがゴミになりました

対応しているバージョンはこちらを参照

github.com

KerasのバージョンにあったTensorflowも用意するといいと思います。(そんなに試してないのでどうかは不明)

トレーニングデータの用意

今回は手と部屋と人の3つに分けることにしました

用意した画像データは75×75のjpgをそれぞれ400枚くらいです(Pythonのプログラムでリサイズするのでサイズは適当でいいです)

正直少ないと思うのでもっと用意したほうがいいと思います

トレーニングさせてみる

トレーニングデータが少ないのでVGG16の転移学習を行いました

詳しいやりかたは調べてみましょう!

「VGG16 fine tuning」とか調べるといっぱい出てきます

今回トレーニングさせたのは畳み込み層の一番下と全結合層です

MacbookのCPUで計算したので無茶苦茶遅かったです...

なぜGPUを積んだWindowsを使わなかったかと言うと、環境を用意するのがめんどくさかっただけ

iOS用のモデルに変換する

CoreMLToolsを使ってモデルをh5からmlmodelへと変換します

import coremltools

model_path = h5ファイルのパス
coreml_model = coremltools.converters.keras.convert(
model_path,
input_names='image',
image_input_names='image',
class_labels='./class_labels.txt',
is_bgr=True,
image_scale=1.0/255
)

coreml_model.save(保存するファイルのパス)

こんな感じで一発変換できて楽です

class_labelsはあらかじめテキストファイルを用意してますが、配列でも書けたと思います

mlmodelができたらおっけー

iOSのアプリに機械学習モデルを組み込む 

画像判定の手順

1.iPhoneのフロントカメラから画像を読み込む

2.判定!

画像を読み込む

iPhoneのフロントカメラを使ってリアルタイムに画像を読み込むにはこちらを参考にしました。AVFoundationを使えば結構簡単に取り込めますね

動画から抜き出す感じです

dev.classmethod.jp

 取り込むカメラをフロントカメラにするにはこんな感じでAVCaptureDeviceを用意したらいいです

let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: AVMediaType.video, position: .front)

CoreMLの判定はCVPixelBufferを使うので、CVPixelBufferとして取り込めばおっけー

このあたりの手順はまた今度まとめます!

CoreMLで画像を判定してもらう

あらかじめモデルのクラスを呼び出す

今回はhand_room_peopleというださい名前のモデルです。

let model = hand_room_people()

model.prediction(image: CVPixelBuffer)を使えば結果を返してもらえます

この関数はXcodeにmlmodelを読み込んだ時に自動的に生成されるので見てみるといいです

f:id:momomoromo:20180511014614p:plain

自動でClassを作ってくれる

矢印をクリックしたら中身が見えます

 

まとめ

こんなのができた

f:id:momomoromo:20180511015103p:plainf:id:momomoromo:20180511015118p:plain

 

Githubにでも公開してもいいのですが、コードの関数名がものすごくダサかったりして恥ずかしいのでそれはまた今度!

 

おわり〜・o・