Help us understand the problem. What is going on with this article?

Keras:VGG16、VGG19とかってなんだっけ??

More than 1 year has passed since last update.

新たなSSDモデルを作成して検出精度(val_lossとval_acc)と性能(fps)について知見を得たいと思います。
今回は、そもそもVGG16とかVGG19ってどんな性能なのか調査・検証しました。

VGGの名前の由来が気になって、ちょっとググってみました。

※今回これが一番価値ある知識かも

SONY Neural Network Console でミニ VGGnet を作るによれば、
「名前の由来は、VGGチームが作った、畳み込み13層+全結合層3層=16層のニューラルネットワークということで、VGG-16となっているそうです。」
だそうです(笑)

そして、オリジナルは以下のようです。
Visual Geometry Group
Department of Engineering Science, University of Oxford
因みに、VGG16は、Caffe-zooだと、まだcaffemodel: VGG_ILSVRC_16_layersと記載されているので、こちらがある意味正式名称でしょう。

そこで今回は、このモデル群をつかって、Cifar10の物体認識を実施して、その性能から新たな知見
・そもそも層の深さと物体認識精度
・そもそも性能の限界は??
というような知見を得るために手を動かそうと思います。

VGGシリーズのモデルって?

以下のような、アーキテクチャを持っています。
説明はいらないと思いますが、一番右がVGG19, 右から二番目がVGG16です。
VGG_model_configurations.jpg

性能は、以下のとおりです。
VGG_performance_singleTest.jpg

【参考】
ImageNet: VGGNet, ResNet, Inception, and Xception with Keras
By Adrian Rosebrock on March 20, 2017 in Deep Learning, Machine Learning, Tutorials
②原論文Very Deep Convolutional Networks for Large-Scale Image Recognition
Karen Simonyan, Andrew Zisserman
(Submitted on 4 Sep 2014 (v1), last revised 10 Apr 2015 (this version, v6))

モデルは、出力してみると以下のとおり、これは上記表のDのVGG16です。

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312
_________________________________________________________________
predictions (Dense)          (None, 1000)              4097000
=================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
_________________________________________________________________

例えば、単純な使い方コードは以下のとおり

from keras.preprocessing import image
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
import numpy as np

model = VGG16(weights='imagenet', include_top=True)

img_path = '1004.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

model.summary()

preds = model.predict(preprocess_input(x))
print(preds)  #学習済1000個のマトリクスで確率出力
results = decode_predictions(preds, top=5)[0]  #上位5個出力
for result in results:
    print(result)

以下の猫の画像を入力とすると、出力例は以下のとおりです。
('n02119789', 'kit_fox', 0.38026658)
('n02119022', 'red_fox', 0.2352507)
('n02124075', 'Egyptian_cat', 0.1030893)
('n02123159', 'tiger_cat', 0.09078445)
('n02123045', 'tabby', 0.057852905)
1004.jpg
【参考】
Keras_Documentation
因みに、上記のモデル使用例って、すべての使用例を読むとFineTuningなど全ての使い方がわかります。また、Keras-teamのVGG16のコード例は以下のとおり
keras / keras / applications / vgg16.py

なお、kit_foxってという人は以下のカテゴリを見てください。これが学習データ依存ってことです?!
1000 synsets for Task 2 (same as in ILSVRC2012)

Cifar10の物体認識精度の比較

ここでは、上記モデルをcifar10の物体認識に応用して、このファミリーのそれぞれについて、精度を算出してモデルの性能を比較しました。

前にも実施しましたが、今回は素直にVGGファミリとしてネットワークを作り比較しました。若干、上記の表と異なったモデルも実施したので、モデル名をABCからI,II,...に変更しました。以下の表ではIIIがVGG16、IVがVGG19に対応します。

0 I II III IV V VI
conv1-1
conv1-2
conv1-3      
conv2-1
conv2-2
conv2-3
conv3-1
conv3-2
conv3-3
conv3-4
conv4-1
conv4-2
conv4-3
conv4-4
conv5-1
conv5-2
conv5-3
conv5-4

結果

実は、上記モデルのままだと学習の収束性が悪いので、ここではBatchNormalizationとDropoutを挿入しています。
因みに、BatchNormalizationはVGGファミリーの発表時は発見前でモデルに含まれていませんでした。
【参考】初出論文
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
Sergey Ioffe, Christian Szegedy
(Submitted on 11 Feb 2015 (v1), last revised 2 Mar 2015 (this version, v3))

結果は以下の通りで、やはり論文の通りIIIのVGG16とIVのVGG19が精度と学習時のtime/epochを見ると、一番よさそうです。しかし、IIの性能は精度があまり落ちずかつ学習速度が速いので、fpsを稼ぎたい物体検出ではより適切な可能性がありそうです。

0 I II III IV V VI
val_acc 0.6958 0.7544 0.8816 0.8949 0.8927 0.8656 0.8544
time/epoch 54s 80s 87s 112s 138s 148s 120s
params 6,058 11,368 11,553 16,862 22,172 22,357 17,047

まとめ

・今回はVGGファミリーの生い立ちを振り返った
・層の違いによる性能の比較を実施し、論文同様VGG16とVGG19が一番最適な層だという結論を得た
・物体検出では、総合的にはIIの全block2層のモデルがよさそうです。

・この結果を受けて、次回はII及びVGG19による物体検出の精度評価を実施し、VGG16と比較したい

コード(参考)

コードは以下の通りです。
SSD / VGG_family / cifar10_VGG_family.py

Layer (type)                 Output Shape              Param #
=================================================================
input_1 (InputLayer)         (None, 32, 32, 3)         0
_________________________________________________________________
conv1_1 (Conv2D)             (None, 32, 32, 64)        1792
_________________________________________________________________
conv1_2 (Conv2D)             (None, 32, 32, 64)        36928
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 64)        256
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 16, 16, 64)        0
_________________________________________________________________
dropout_1 (Dropout)          (None, 16, 16, 64)        0
_________________________________________________________________
conv2_1 (Conv2D)             (None, 16, 16, 128)       73856
_________________________________________________________________
conv2_2 (Conv2D)             (None, 16, 16, 128)       147584
_________________________________________________________________
batch_normalization_2 (Batch (None, 16, 16, 128)       512
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 8, 8, 128)         0
_________________________________________________________________
dropout_2 (Dropout)          (None, 8, 8, 128)         0
_________________________________________________________________
conv3_1 (Conv2D)             (None, 8, 8, 256)         295168
_________________________________________________________________
conv3_2 (Conv2D)             (None, 8, 8, 256)         590080
_________________________________________________________________
conv3_3 (Conv2D)             (None, 8, 8, 256)         590080
_________________________________________________________________
batch_normalization_3 (Batch (None, 8, 8, 256)         1024
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 4, 4, 256)         0
_________________________________________________________________
dropout_3 (Dropout)          (None, 4, 4, 256)         0
_________________________________________________________________
conv4_1 (Conv2D)             (None, 4, 4, 512)         1180160
_________________________________________________________________
conv4_2 (Conv2D)             (None, 4, 4, 512)         2359808
_________________________________________________________________
conv4_3 (Conv2D)             (None, 4, 4, 512)         2359808
_________________________________________________________________
batch_normalization_4 (Batch (None, 4, 4, 512)         2048
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 2, 2, 512)         0
_________________________________________________________________
dropout_4 (Dropout)          (None, 2, 2, 512)         0
_________________________________________________________________
conv5_1 (Conv2D)             (None, 2, 2, 512)         2359808
_________________________________________________________________
conv5_2 (Conv2D)             (None, 2, 2, 512)         2359808
_________________________________________________________________
conv5_3 (Conv2D)             (None, 2, 2, 512)         2359808
_________________________________________________________________
batch_normalization_5 (Batch (None, 2, 2, 512)         2048
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 1, 1, 512)         0
_________________________________________________________________
dropout_5 (Dropout)          (None, 1, 1, 512)         0
_________________________________________________________________
flatten_1 (Flatten)          (None, 512)               0
_________________________________________________________________
dense_1 (Dense)              (None, 4096)              2101248
_________________________________________________________________
activation_1 (Activation)    (None, 4096)              0
_________________________________________________________________
dropout_6 (Dropout)          (None, 4096)              0
_________________________________________________________________
dense_2 (Dense)              (None, 10)                40970
_________________________________________________________________
activation_2 (Activation)    (None, 10)                0
=================================================================
Total params: 16,862,794
Trainable params: 16,859,850
Non-trainable params: 2,944
_________________________________________________________________
MuAuan
2020年目標;いい記事を書く 記事350いいね1500フォロワー150 2019年の実績/目標 記事275/300いいね1035/1000フォロワー97/100 1/7/2019 記事219いいね784フォロワー76 2018年の実績/目標 記事140/200いいね423/500フォロワー48/50 7/8/2018 記事90いいね227フォロワー25
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした