【Swift】CoreMLModelを使って物体認識するアプリを作ってみた

こんにちは、のっくんです。

カメラに映った画像を機械学習を使って識別するiPhoneアプリを作ってみました。

アプリの機能としては以下の通り。

  1. カメラからプレビュー画像を取得する
  2. プレビュー画像に映っている物体をCoreMLモデルを使って推定する

やってみた感想としては、アプリはサクサク動くし、物体認識も正確なので流石はAppleだなぁという感じ。

シンプルで短いコードで実装できるので、デベロッパーに優しいと思います。

では早速みていきたいと思います。

カメラ画像をViewに表示する

アプリのViewにカメラ画像を表示します。

AVKitを使ってカメラ画像を取得してViewに表示しましょう。

カメラは実機でないと動かせませんが、info.plistで以下の許可を得るようにしないとエラーが発生しますのでご注意を。

フレームを1枚ずつ処理する

カメラに映ったフレーム画像を1枚1枚処理するにはどうすれば良いのでしょうか。

AVCaptureVideoDataOutputSampleBufferDelegateという名のとても長いプロトコルに批准することで各画像の処理ができるようになります。

この辺りの機能を用意してくれているのも流石はAppleですね。

以下のコードをviewDidLoadに追加します。

デリゲートを設定してフレームの処理を委任します。別のキューで処理するようにキューと名前を指定しています。

プロトコルに批准するとメソッドcaptureOutputを実装できるようになります。

sampleBufferがフレーム画像のことです。

上記のコードを実行するとフレームが取れるごとに時間が出力されるようになります。

機械学習

機械学習の処理を追加していきましょう。

機械学習にはCoreMLModelを使います。

CoreMLモデルはAppleが開発者のために提供しており、以下のサイトに置いてありますのでありがたく使わせてもらいます。

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

今回はResnet50を試してみます。

こんな感じでモデルをプロジェクトに追加します。

大まかな処理の流れとしては、以下の通り。

  1. フレーム画像をCVPixelBufferに変換する
  2. モデルを読み込む
  3. VNCoreMLRequestを呼ぶと、物体認識の結果が返ってくるので表示する

シンプルなコードでサクッと機械学習が使えてしまうところがSwiftの素晴らしいところですね。

今後のAppleのアップデートにも期待です。

ABOUTこの記事をかいた人

のっくん

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog