Googleのクラウド・コンピューティング・サービス、Google Colaboratoryで動作する画像認識ソフトを作りましたので公開します。このソフトは「転移学習」「ファインチューニング」と呼ばれる技術を使って学習時間を大幅に短縮したものです。作成に当たってはいくつものWEBページを参考にしました。
VGG16はOxford大学のVisual Geometory Groupが開発した、非常に有名な画像向けニューラル・ネットです。2014年に開催されたILSVRC2014(Imagenet Large Scale Visual Recognition Challenge 2014)のClassification+localization部門において認識精度で12位を獲得しました。ILSVRC2014ではflickerから抽出された15万枚の画像が手作業によって1000クラス(種類)に分類されており、コンテストではこれらのクラスの認識精度と位置特定精度が競われました。
VGG16は構造の明快さ、規模の小ささ、入手の容易さといった理由から機械学習の入門題材として広く使われており、日本語の解説文書もネット上で多く見つかります。
このVGG16を利用して転移学習並びにファイン・チューニングによる物体認識訓練をおこなってみました。プログラムはGoogle Colaboration(以下Colab)を使い、Kerasフレームワークで動作します。
公開内容
VGG16による転移学習やファイン・チューニングに関しては日本語でも多くの情報がネット上に位公開されています。ですのでわざわざ私がそれに何かを付け加えることもないのですが、以下の理由でプログラムは公開することにしました。
- ほとんどのサンプルプログラムは研究者が理解のために書いたものか、それをコピーしたものであり、APIの使い方が必ずしも合理的ではない。これはフォロワーが学ぶときに障害になる。
- 多くのサンプルプログラムがKeras 1.xで書かれており、2.0で動かすとエラーが起きる。
- Colabでさくっと動くようにできていない。Colabで動けばハードウェア無しに勉強できる。
- 「17の花を分類するだけ」「犬と猫を区別するだけ」といったプログラムがほとんど。自分のデータセットで試してみるときの障壁が多い。
そういうわけで、以下のプログラムは「Colabでさくっと動く」「Keras 2.0に対応」「データセットに依存しない」といった特徴があります。
なお、いずれもGoogle Colaboration上でのプログラムですので動作には
- Google アカウント
- デスクトップ版Choromeブラウザ
が必要です。上のリンクをクリックするとColabのノートが開きますがそのままでは実行できません。ファイルメニューから自分のGoogle Driveにコピーを保存してそちらを実行してください。
実行結果
転移学習では、一旦VGG16の畳込み部として学習データから特徴量を抽出します。そしてこの特徴量をつかって繰り返しパーセプトロン(全結合層)の訓練を行います。このため、訓練時間は短く、GPUインスタンスで5分もあれば訓練がおわります。以下の学習曲線はVGGが公開している17 Floweresデータセットを使った学習の様子です。なお、データセットはKeras向きにディレクトリ構造を変えたものをGithubにプッシュして、そちらを毎回ダウンロードしています。
ファインチューニングでは畳込み層の一部も訓練するため、上の最適化技術がつかえません。GPUをつかって、同じデータセットで訓練に2時間ほど時間がかかりました。
認識精度の変化率をみると、ファインチューニングは最初はなかなか向上しないですね。訓練後のモデルを使って任意画像を認識する関数も作りました。以下の写真はGoogle検索で集めたものです。多分訓練データに含まれていません。
このアイリスの写真、「ワンピースを着た女性」に見えるのは私だけでしょうか。
参考
数え切れない程のサイトを参考にしましたが、そのうちでも重要ないくつかを紹介:
- VGG16のFine-tuningによる17種類の花の分類 – 人工知能に関する断創録 : VGG16を元にした転移学習やファインチューニングの勉強は、ここで紹介されているコードを読むことから始めました。
- VGG16におけるKerasの前処理でmeanを引くかどうか – エイバースの中の人 : Keras本はVGG16用に前処理プログラムを使うよう推奨していますが、トレーニング時にそれが必要かどうか実験した結果が紹介されています。
- Python: Keras/TensorFlow で GPU のメモリを必要な分だけ確保する – CUBE SUGAR CONTAINER : プログラムを書き始めた頃、GPUメモリが不足するエラーが多発しました。最終的にはAPIの使い方が悪かったのが原因とわかりましたが、ここで紹介されている設定を使うことで、複数の訓練プロセスを同時に走らせても大丈夫になりました。
- A thing you should know about Keras if you plan to train a deep learning model on a large dataset – Towards Data Science : Keras 2.0へのアップグレードで動かなくなった例題が多く頭を抱えましたが、最終的にはここに書いてある「ドキュメント化されていない情報」が大変参考になりました。
- ILSVRC2014 : コンテストWEBページ。VGG16は「1位をとった」「2位をとった」と紹介されることがおおいですが。それは間違いです。まず、1位、2位はおなじグループ(VGG)による違うネットワークです。そして、1位は物体検出ランキングのときの話です。VGG16は物体認識ランキングで12位でした。エラー率8.43%。なお、認識ランキング1位のGoogLeNetはエラー率6.66%。