*VGG とは
2014年,画像認識のコンペティション(ILSVRC)のクラス分類の部門で特に高評価を得たネットワークです[1].ネットワークを発表した研究グループ名が名前の由来だと思われます.
{{small:Visual Geometry Group, Department of Engineering Science, University of Oxford}}
{{small:[1]VGG : [link:https://arxiv.org/pdf/1409.1556.pdf] }}
{{small:[2]ILSVRC : [link:http://www.image-net.org/challenges/LSVRC/] }}
畳み込み層と全結合層を連結しシンプルに層を増やしたネットワーク構造で,使い勝手がよく,その後の研究でもこの構造をベースにした研究が良く見られます.層数については「16 weight layers」 等のいくつかのバリエーションがあります(図1,図2).
図1の表で,例えば「conv3-64」のように記載ありますが,「3x3のフィルタを64種類(チャンネル)」という意味です.2014年以前の研究では,比較的サイズの大きいフィルタが利用されることが多かったのですが,VGGではフィルタのサイズを小さく,そして層を深くする方向を考えた構造になっています.
[img:qc1d]
{{small:図1 ネットワーク構造のバリエーション 出典[1]}}
[img:y1kl]
{{small:図2 VGG16のネットワーク構造}}
*サンプルコード
VGG16のネットワークを使ったクラス識別のサンプルコードです.
{{small:コード全文:[link:https://github.com/sanko-shoko/simplesp_py/tree/master/vgg] }}
ライブラリはKerasを利用しています.KerasではVGG16(16層)とVGG19(19層)のクラスが準備されています.
詳しくは,下記のドキュメントを参照ください.
{{small:Keras VGG Document:[link:https://keras.io/ja/applications/] }}
**①モデル取得
{#
import numpy as np
import cv2
from keras.preprocessing import image
import keras.applications.vgg16 as vgg16
# 「ImageNet」データセットを利用して学習したモデルを取得
model = vgg16.VGG16(weights='imagenet', input_shape=(224, 224, 3))
model.summary()
#}
{/
_________________________________________________________________
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
_________________________________________________________________
/}
**②ー1 画像読み込みと推定
{#
# 画像ファイルのパス
path = ""
# 既定のサイズ(今回は224x224)にリサイズして読み込み
img = image.load_img(path, target_size=(224, 224))
# PIL形式 - > numpy.ndarray
X = image.img_to_array(img)
# (width, height, ch) -> (batch, rwidth, height, ch)
X = np.expand_dims(X, axis=0)
# 前処理(平均値を引くなど)
X = vgg16.preprocess_input(X)
# 推定
Y = model.predict(X)
# 上位推定結果を表示
list= vgg16.decode_predictions(Y, top=4)[0]
for v in list:
print(v)
#}
**②ー2 USBカメラを使った推定
{#
cap = cv2.VideoCapture(0)
if cap.isOpened() is False:
raise("could not find USB camera")
cv2.namedWindow("img")
key = 0
# 27 = 'ESC' key
while key != 27:
ret, img = cap.read()
if ret == False:
continue
rgb = cv2.resize(cv2.cvtColor(img, cv2.COLOR_BGR2RGB), (224, 224))
cv2.imshow("img", img)
key = cv2.waitKey(1)
# uint8 - > float32
X = rgb.astype(np.float32)
# (width, height, ch) -> (batch, rwidth, height, ch)
X = np.expand_dims(X, axis=0)
# 前処理(平均値を引くなど)
X = vgg16.preprocess_input(X)
# 推定
Y = model.predict(X)
# 上位推定結果を表示
list= vgg16.decode_predictions(Y, top=4)[0]
for v in list:
print(v)
cv2.destroyAllWindows()
#}
>> ご意見・ご質問など お気軽にご連絡ください.info