大規模画像認識のための非常に深いCNN

K. Simonyan and A. Zisserman: Very Deep Convolutional Networks for Large-Scale Image Recognition, 2014. https://arxiv.org/abs/1409.1556

3x3 という小さなconvolutionフィルタを使う Convolution Layer の深さを変更して、画像認識の精度がどのように変化をするかを測定し、 16層から19層で性能が大きく向上することを明らかにした論文。論文中で16層のモデルはD または VGG16 と呼ばれている。

ImageNet ILSVRC-2012 http://image-net.org/challenges/LSVRC/2012/ データセットは 1000 クラスに属する 224x224x3 フォーマットの画像(training 用 1300万, validation 用 50,000, test 用 100,000)を含む。 VGG16は validation用のデータに対して 7.5%, test用のデータに対して 7.4% のエラーという高い認識率を示した。

Caffe で実装されたモデルをtrainした重みを tf.Keras 用に変換したものは、次のようにして利用できる。

出力が1000次元ベクトルなので argmax で一番大きな値のインデックスを得ている。 285 は "Egyptian cat" を表している。 classの一覧は以下のURLにある。 https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a

tf.keras に組み込みの VGG16 net モジュールを使う

tf.keras は最初にモデルを使う時に、~/.keras/models/ にダウンロードする。 VGG16 以外にもいろいろある。

https://www.tensorflow.org/api_docs/python/tf/keras/applications

特徴を抽出するためにモデルを再利用する

特徴を抽出するために VGG16 やその他の DCNN を使うコードを示す。 特定の層を引っ張り出すために keras の Functional API を用いている。

DCNN (Deep Convolutional Neural Network) の途中のlayerを引っ張り出す理由は、そのネットワークが画像をカテゴリへとクラス分類する方法を学んでいるからである。低いlayerは色やエッジなどの低いレベルの特徴を認識し、高いlayerは低いlayerが出力した特徴を組み合わせて形やオブジェクトを認識している。 したがって、中間のlayerは画像から重要な特徴を引き出す能力を持っていて、他の分類をする場合にも役に立つと考えられる。

大規模にtrainingされたモデルを、別の分野に転移(transfer)して適用することができる。 training時間も短縮できる。 適用すべき分野のtrainingデータが少なくても大丈夫である。 既存のモデルを利用できれば、何が適切なモデルの形かを推測する必要がない。

Summary