機械学習のフレームワークとして、実績あるGoogle製フレームワーク TensorFlow 及び、それをバックエンドとする Keras を利用しています。
これらのフレームワークを用いる事により、迅速な反復開発が可能となりました。
開発言語は機械学習の世界では標準的となっている、Python3を用いています。
ImageNetと呼ばれる極めて大規模な画像分類データセットで学習したVGG16(オックスフォード大学のVGG研究チームが開発した全16層のニューラルネットワーク)をベースに、転移学習を行いました。
転移学習とは、汎用的なタスク向けに訓練したモデルを、他のタスクに転用する手法の事を言います。
今回の場合はVGG16の全結合層を取り除き、新たに壁面仕上げ(11種類)の分類タスクに適した全結合層をつなげたモデルを構築しました。
ニューラルネットワークにおける各ニューロンを、訓練時に一定確率で無効化することで、汎化性能を高める手法をDropOutと呼びます。
DropOutによって、各ニューロンは訓練データセットの一部だけを使って訓練されている状態になるため、一種のアンサンブル学習(ランダムに復元抽出したデータセットで学習した複数の学習モデルを用いて、多数決でもって推論する手法)を行っている事になります。
機械学習における学習は、一般的に一つ一つのデータに対して逐一行う(オンライン学習)わけではなく、データを小さなバッチと呼ばれる単位に纏めて学習します。
このバッチに対して標準化(平均値と標準偏差が一定の値になるように変数変換する事)を行うのが、バッチ正則化と呼ばれる手法です。
標準化における平均値と標準偏差は、学習可能パラメータです。
この手法を用いる事で、訓練収束の高速化と、正則化効果(過学習の防止と汎化性能の向上)が見込まれます。
今回学習に用いたデータは5256枚で、一クラス当たり500枚程度と決して多い数ではありません。
画像の質もばらばらで、建物の全景写真もあれば、壁を近接撮影した写真もあります。
更に、壁の種類によっては50枚にも満たないものもあります。
このように、データ数自体が十分ではない場合によく使われる手法がデータ拡張です。
これは写真に対してランダムに機械的な加工を施すことで、疑似的にデータを増やす手法です。
今回の場合は以下のデータ拡張を行いました。
今回の学習に用いたデータは、クラスによっては少ないと50枚、多いと1000枚以上あるという、非常にバランスの悪いものです。
そのようなデータで普通に機械学習を行うと、単純にデータ量の多いクラスに推論が偏ってしまう、という問題が生じます。
そこで、各クラスにその枚数に反比例する重みづけを行うことで、そのような偏りを極力減らしました。
データの質を均質化することで、予測精度を向上させる処理のことです。
今回はベースモデルにVGG16を使っているため、VGG16と全く同じ前処理を用いました。基本的な前処理の手法としては、以下の様なものがあります。