ASCII倶楽部

このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング 第90回

CoreMLの機械学習モデルを活用

写真に写っているモノを認識するプログラム

2018年06月06日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 このところ数回は、視覚系の機械学習の成果を手軽に利用可能にするVisionフレームワークを使って、人の顔、文字、バーコードなどを認識するプログラムを書いてきました。Visionにデフォルトで備わっている認識機能は、簡単に利用できるというメリットは大きいものの、それだけではできることが限られています。

 視覚系の認識でも、Visionにできないことは、CoreMLのモデルを直接読み込んで実現することができます。アップルの機械学習に関する開発者向けサイトには、すぐに利用可能なCoreMLのモデル(.mlmodel)が何種類か用意されています。

アップルが提供しているサンプルのCoreMLモデルは、開発者向けのサイトに何種類か公開されています。今回は、それらの中でサイズが最も小さい「SqueezeNet」を試してみることにしました

 今のところ、それらの機能は2種類だけです。1つは「木、動物、食べ物、乗り物、人々など、1000のカテゴリセットから画像に存在する主なオブジェクトを検出します」というもの、もう1つは「空港のターミナル、寝室、森林、海岸など、205のカテゴリから画像のシーンを検出します」というものです。いずれも視覚系の認識機能です。今回は、前者の「1000のカテゴリの中からオブジェクトを認識する」機能のうち、モデルのサイズが最小の「SqueezeNet」を使ってみることにしました。約5MBと、カメラで撮影した1枚の画像ファイルほどのデータ量しかありませんが、それにしては優れた認識力を発揮してくれます。なお、アップルのサイトの日本語は曖昧ですが「主なオブジェクト」というのは「dominant object」のことなので、写真に写っている物体の中の支配的なもの、つまり最も目立つものが何であるかを認識するという意味です。

 これらのCoreMLモデルは、この連載でCoreMLとして最初に取り上げたMarsHabitatPricerと同様に、そのままプログラムから利用することもできます。しかし、それだけでは入力と出力の処理がちょっと面倒です。そこで、視覚系のCoreMLモデルを、Visionフレームワークを通して利用することでより簡単に扱う方法も用意されています。いわばCoreMLモデルをVisionに組み込むことで、Visionの認識機能を拡張できるのです。今回は、そこまでを試してみましょう。

CoreMLモデルをクラスとして記述する

 以前にも述べましたが、CoreMLモデルを利用するには通常はXcodeを使ってモデルをリソースとしてプロジェクトに追加します。Xcodeの場合には、それだけでそのモデルに関するSwiftのクラスをプログラムのほかの部分から利用できるようになります。残念ながら、Swift Playgroundsには同様の機能はないので、利用するモデルのクラスをソースコードとして記述する必要があります。とはいえ、それもインターフェース部分だけなので、それほど大きなコードではありません。

 まずはモデルに対する入力を定義するSqueezeNetInputです。

Swift PlaygroundsでCoreMLのモデルを利用するには、モデルをSwiftクラスとして定義するソースコードを記述する必要があります。これはモデルへの入力を扱うSqueezeNetInputクラスです

 この部分は、Xcodeで確認できるモデルのクラスのソースコードをコメントを除いてほぼそのままコピーしたものです。プログラムの先頭では、CoreMLだけをインポートしているように見えますが、あとでUIImageを使うために実際にはUIKitもインポートしています。

 次にモデルの出力を定義するSqueezeNetOutputの初期化メソッド(init)を除く前半部分です。

このクラスはモデルからの出力を扱うSqueezeNetOutputです。この後に初期化用のメソッドが続きます

 この部分もXcodeで確認できるモデルのソースコードからコメントを除いただけのものです。このモデルを使って得られる結果のタイプを確認することができます。

 続いてSqueezeNetOutputの残りの部分とモデル本体のSqueezeNetクラスの前半、初期化部分です。

前の図の続きのSqueezeNetOutputの初期化用のメソッドと、モデル本体を表すクラスSqueezeNetの前半部分です

 この部分は、未コンパイルのモデルファイル(.mlmodel)を読み込み、クラスの初期化メソッド内でコンパイルできるように書き換えています。これにより、アップルのサイトからダウンロードしたモデルファイル「SqueezeNet.mlmodel」を、そのままプレイグラウンドに読み込んで利用できます。ファイルは、あらかじめiCloud経由でプレイグラウンドのリソースとして追加しておく必要があります。

 モデルに関するクラスの最後は、SqueezeNetの後半、実際に認識を実行するpredictionメソッドの部分です。

さらに続きのSqueezeNetの後半部分です。これでCoreMLモデルSqueezeNetの定義は完了です

 ここもXcodeで確認できるソースコードからコメントを除いただけのものです。

カテゴリートップへ

この連載の記事

ASCII倶楽部の新着記事

会員専用動画の紹介も!