cedro-blog

Keras VGG16 学習済みモデルでサクッと遊んでみる

今回は、KerasVGG16学習済みモデルを使って、一般物体認識をやってみたいと思います。

こんにちは cedro です。

Keras には学習済みモデルがあり、これを使えば膨大な量のデータを収集し、長時間掛けて学習をすることなしに、大規模な学習済みモデルを動かせます

例えば、2014年の画像認識コンテスト ILSVR で2位になった、あの有名なVGG16学習済みモデルもあります。このモデルは、畳み込み13層+全結合層3層のニューラルネットワークに、1000カテゴリー224×224のカラー画像をなんと120万枚学習させた凄いもので、個人で一から学習させるのはまず不可能なものです。

こんなディープラーニング大規模な学習済みモデルが、誰でもインターネットから手に入れて使える時代になったわけです。なんて、素敵なことでしょう!

というわけで、今回は、KerasVGG16学習済みモデルを使って、一般物体認識をやってみたいと思います。

 

VGG16は何を学習しているのか

VGG16学習済みモデルは、一体どんなものを学習しているのでしょうか。これが分からないと物体認識させるためにどういう画像を用意したら適切なのかが分かりません。

実は、これについての情報がWebにはあまりなく、色々探した結果、Github でやっと見つけました。ILSVRC2012_class_name.csv というファイルがそれで、1000カテゴリーの名前が和訳付きでまとめられています。starpentagon さん、感謝です。

 

ファイルを参考に、Webから、Saint_Bernard(セントバーナード)、Cheetah(チータ)、Flamingo(フラミンゴ)、Grand_Piano(グランドピアノ)、Syringe(注射器)、Space_Shuttle(スペースシャトル)、Brassiere(ブラジャー)の7つをgoogleで画像検索しダウンロードして、data フォルダーに格納しました。セントバーナードからブラジャーまで、多彩でしょう?(笑)。

そして、認識結果と照合するために、00.jpg ~ 06.jpg にリネームしています。

なお、画像は、VGG16で認識するために正方形(224×224)にリサイズしますので、極端に長方形なものは避けるのが無難です。

 

プログラムを作成します

VGG16学習済みモデルをダウンロードして、data フォルダーに格納されている画像が何かを認識するプログラムです。

7行目で、学習済みモデルダウンロードします。引数については、
・include_top     :  True全結合層を含める、False(転移学習などで使う)で含めない。
・weights           :  ‘imagenet’ で学習した重みを読み込む、None だと読み込まない。
・input_shape   入力画像シェイプを指定(転移学習などで使う)。今回は、None

13行目から、画像をデータを読み込み前処理をします。data フォルダーから1つづつ画像を読み込み、224×224リサイズし、アペンド(付け加え)。その後、numpy配列に変換します。aryシェイプ は、( 7, 224, 224, 3 )となります。

21行目から、認識する部分です。preprocess_input () は VGG16モデルに合わせて前処理をするところ。そして、decode_prediction () は認識結果を表示するところで、top = 5 としておくと上位5位の予測結果を( WordNet ID, クラス名, 確率 )の形式で表示してくれます。

 

VGG16の構成を見てみます。畳み込み層(Conv2D)が13層全結合層(Dense)が3層あることが分かると思います。層は全部で 13+3=16層ありますので、VGG16って言うんですね。

 

認識してみます

認識させるだけですので、Macbook Airでも軽快に動きます。但し初回のみ、学習済みモデルダウンロードするので、少し時間がかかります(私のwifi 環境で3分くらい)。

認識結果は、例えば ( ‘ n02109525 ‘, ‘ Saint_Bernard ‘, 0.9999845 ) という形で表示されます。 ‘ n02109525 ‘ は WordNet ID という Imagenet 分類コード‘ Saint_Bernard ‘ クラス名0.9999845確率です。確率の高い順に、上位5つが表示されます。

さて結果ですが、全て99.9%以上の確率で認識が出来ています。ま、結果が良かったものを選んだという感はありますが(笑)。それにしても、セントバーナードからブラジャーまで1000カテゴリーを高い精度で認識するとは、VGG16恐るべしです。

もちろん、この世にある物体1000カテゴリーどころではないわけですが、既に1000カテゴリーをしっかり学習済みであれば、類似なものであれば新たに学習する場合でも少ないデータ早く学習ができるのです。これを転移学習あるいは、ファインチューニングと言うのですが、これについては次回のブログで。

では、また。