記事

画像分類モデルの作成

画像を分類する機械学習モデルをトレーニングします。

概要

画像分類器は、画像を認識するようにトレーニングされた機械学習モデルです。画像分類器に画像を渡すと、画像分類器はその画像のラベルを返します。

画像分類器がキリンの画像から「Giraffe」というラベルを予測することを示す図。

画像分類器をトレーニングするには、すでにラベル付けされた画像サンプルを多数見せます。例えば、ゾウ、キリン、ライオンなどの様々な写真を見せることによって、サファリの動物を認識するようにトレーニングできます。

ラベル付きの画像コレクションを使ってCreate MLでモデルをトレーニングする方法を示す図。

データの準備

まず、分類器のトレーニングと評価に使用するデータを準備します。ラベルごとに用意した画像の約80%で、トレーニング用データセットを作成します。 残りの画像で、テスト用データセットを作成します。どの画像も、2つのセットの片方にだけ含まれるようにしてください。

次に、ディスク上のデータを整理して、MLImageClassifier.DataSource(英語)のいずれかのタイプと対応するようにします。そのための一つの方法として、Training DataというフォルダとTesting Dataというフォルダを作成します。各フォルダにサブフォルダを作成し、その名前としてラベルを使います。次に、各データセット用の適切なサブフォルダに画像を分類します。

「Training Data」フォルダにサブフォルダがあり、そこに含まれる画像の分類に対応するラベルがサブフォルダ名になっていることを示す図。例えば、チーターの画像はすべて、「Cheetah」というサブフォルダに入れます。

ラベルの文字列はどのようなものでもかまいませんが、意味のわかるものにしてください。例えば、すべてのチーターの画像にはCheetahというラベルを使います。特定の方法で画像ファイルに名前を付ける必要はなく、それらにメタデータを追加する必要もありません。必要なのは、適切なラベルを付けてフォルダに入れることだけです。

トレーニングセットでは、ラベルごとに10枚以上の画像を使ってください。画像は多い方がベターです。また、ラベルごとの画像数のバランスも考えてください。例えば、Cheetahの画像は10枚でElephantの画像が1000枚、というのは不適切です。

画像の形式は、Uniform Type Identifierがpublic.imageに適合すれば何でもかまいません。これには、JPEGやPNGなど、一般的な形式が含まれます。画像のサイズが同じである必要はなく、特定のサイズである必要もありません。ただし、299x299ピクセル以上の画像を使うことをおすすめします。可能な場合は、予測する画像を収集するのと同じような方法で収集された画像でトレーニングします。

多様な画像を提供してください。例えば、様々な角度から見た動物、様々な明るさで撮影された動物の画像を使います。あるラベルについて、同じような画像ばかりを使ってトレーニングされた分類器は、多様な画像セットを使ってトレーニングされた分類器と比較してパフォーマンスが低い傾向があります。

Playgroundでの画像分類器ビルダの表示

データを準備できたら、macOSターゲットの新しいXcode Playgroundを作成します。このPlaygroundを使ってMLImageClassifierBuilder(英語)インスタンスを作成し、ライブビューで表示します。

// Import CreateMLUI to train the image classifier in the UI.
// For other Create ML tasks, import CreateML instead.
import CreateMLUI 

let builder = MLImageClassifierBuilder()
builder.showInLiveView()

Xcodeでアシスタントエディタを表示し、Playgroundを実行します。これを行うと、ライブビューで画像分類器が表示されます。

Xcode Playgroundのスクリーンショット。アシスタントエディタに画像分類器ビルダが表示されています。

画像分類器のトレーニング

Finderからライブビュー上に示されている場所に、Training Dataフォルダをドラッグします。こうするとトレーニングプロセスが開始され、画像分類器に進捗状況が表示されます。

トレーニングプロセス中の画像分類器のスクリーンショット。進捗バーと、現在分析中の画像が表示されています。

トレーニングプロセスの一部として、画像分類器は自動的にトレーニングデータをトレーニング用セットとバリデーション用セットに分割します。どちらもトレーニングに関係しますが、その方法が異なります。分割はランダムに行われるため、モデルをトレーニングするたびに異なる結果になる場合があります。

トレーニングが終了すると、ライブビューにトレーニングとバリデーションの精度が表示されます。トレーニングされたモデルが、対応するセットからどれだけ正確に画像を分類したかが報告されます。モデルはこれらの画像でトレーニングされたので、通常はうまく画像を分類します。

トレーニングの終了後に画像分類器の精度出力が表示されたスクリーンショット。

分類器のパフォーマンスの評価

次に、以前に見せたことがない画像でテストし、トレーニングしたモデルのパフォーマンスを評価します。このために、トレーニングの開始前に作成したテスト用のデータセットを使います。トレーニングデータの時に行ったように、Test Dataフォルダをライブビューにドラッグします。

トレーニング後の画像分類器がトレーニング用データを受け取るところを示したスクリーンショット。

モデルがすべての画像を処理し、それぞれについて予測を行います。このデータにはラベルが付いているので、モデルは自分の予測をチェックできます。そして、全体的な評価精度を最終的な評価指標としてUIに追加します。

テスト用データを処理した後の画像分類器を示すスクリーンショット。評価モデルの精度が表示されています。

評価のパフォーマンスが不十分な場合は、(画像の水増しを行うなどして)より多くのデータでもう一度トレーニングするか、ほかのトレーニング構成に変更する必要がある場合があります。より詳細なモデルの評価について、およびモデルのパフォーマンスを高める方法については、モデルの精度の向上を参照してください。

Core MLモデルの保存

モデルのパフォーマンスが十分になったら、Appで使えるように保存します。

分類器に意味のわかる名前を付けます。UIで名前を変更して、デフォルトのImageClassifierAnimalClassifierに変更します。作者や簡単な説明など、モデルについての情報を追加することもできます。詳細表示のための三角形をクリックすると、これらのメタデータ用フィールドが表示されるので、情報を入力します。

分類器の名前が動物分類器に変更され、メタデータが入力されているスクリーンショット。

「Save」をクリックします。モデルによってファイルが.mlmodel形式で書き出され、「Where」フィールドで指定したディレクトリに保存されます。

モデルのAppへの追加

次に、トレーニング済みのモデルを既存のCore ML対応Appに追加します。このモデルを使って、VisionとCore MLでの画像の分類(英語)のサンプルコードプロジェクトに付属のモデルを置き換えることができます。こうすると、サンプルAppは以前と同じように機能しますが、デベロッパが定義したラベルに従って動物が認識され、分類されます。

Xcodeでサンプルコードプロジェクトを開き、自分のモデルファイルをナビゲーションペインにドラッグします。モデルがプロジェクトの一部になると、Xcodeに、モデルのメタデータがその他の情報(モデルクラスなど)と共に表示されます。

画像分類器のサンプルコードプロジェクトに動物分類モデルが組み込まれたことを示すスクリーンショット。

コードで新しいモデルを使うには、1行を変更するだけです。プロジェクトに付属のMobileNetモデルは、ImageClassificationViewControllerクラス内の一箇所のみでインスタンス化されます。

let model = try VNCoreMLModel(for: MobileNet().model)

この1行を変更し、新しいモデルクラスを使うようにします。

let model = try VNCoreMLModel(for: AnimalClassifier().model)

どちらのモデルも入力に画像、出力にラベルを扱うので、これらのモデルは入れ替えることができます。入れ替えた後、サンプルAppは以前と同じように画像を分類しますが、あなたのモデルとそれに関連付けられたラベルを使う、という点が異なります。

画像分類器の構築プロセスの自動化

上のセクションで説明したように、MLImageClassifierBuilder(英語)インスタンスを使うと、わずかなコードで、機械学習の専門知識がなくても、有用な画像分類器をトレーニングすることができます。ただし、モデルのトレーニングプロセスをスクリプト化する必要がある場合は、代わりにMLImageClassifier(英語)インスタンスを使います。手順は基本的に同じです。データを準備し、モデルをトレーニングし、パフォーマンスを評価し、結果をCore MLモデルファイルに保存します。異なるのは、すべてをプログラムで行う、という点です。例えば、モデルのパフォーマンスを評価するためにテスト用データをライブビューにドラッグする代わりに、MLImageClassifier.DataSource(英語)インスタンスを初期化して、これを分類器のevaluation(on:)(英語)メソッドに提供します。

関連項目

画像分類

class MLImageClassifierBuilder(英語)

XcodeのPlayground UIです。これを使って、モデルが画像を分類するようにトレーニングします。

struct MLImageClassifier(英語)

プログラムで画像を分類するために訓練するモデル。