keras和VGG-16一起使用

这一次,我尝试使用Kera的Deep Learning的图像应用中的典型模型VGG 16。 正如这个学习的VGG 16模型是做图像的各种有趣的实验的基础,我想正确理解如何处理它与keras。

测试源码:test_vgg16

VGG16的概述

VGG 16 * 1是2014年由ILSVRC(ImageNet Large Scale Visual Recognition Challenge)提出的由13个卷积层和3个完整层组成的总共16层的卷积神经网络。 与同时提出的GoogLeNet相比,它简单易懂,因为与仅有大量层的一般卷积神经网络没有很大的区别。 使用称为ImageNet的大型图像数据集进行训练的模型已经发布。

VGG 16的输出层有1000个单元,它是对1000个类别进行分类的神经网络。 1000类列表在1000个任务2的synsets中。 我想总结一下如何抓取这1000个类的图片。

Keras的VGG 16模型

在Keras中,VGG 16模型在keras.applications.vgg16模块中实现,这使得它易于使用。 由于这是一个带有ImageNet大图像集的学习模型,因此您不必自己收集图像和学习。

(注)Keras稍微老一点,有必要自己编写模型结构,下载.h5文件格式的重量(参考:Keras的VGG 16模型)不再需要在最新的1.2.0那里。 自动下载按照后端转换的权重文件。

请注意,许多文章是在keras.applications.vgg16被实现之前编写的,所以要小心。

 

from keras.applications.vgg16 import VGG16
model = VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None) keras.applications.vgg16 import VGG16
model = VGG16(include_top=True, weights='imagenet', input_tensor=None, input_shape=None)

VGG 16类有四个参数。

 

1、include_top指定是否在VGG 16的顶部包括或排除对1000个类别进行分类的完整分类层(FC)。 从这个时候开始,我想要做图像分类,把它和FC一起使用。 虽然我可以通过抛出FC和使用VGG 16作为特征提取器来做各种有趣的事情,但是我希望能够在下次尝试。

2、权重指定VGG 16的重量类型。 由于VGG 16只是一个模型结构,因此不一定要使用ImageNet来学习。 但是,目前仅提供了使用ImageNet学习的权重。 当设置为None时,它变成随机重量。 他是在这里用自己收集的形象学习的吗?

3、当你想自己输入一个图像到你的模型,但是这次不使用input_tensor。 稍后用VGG 16的fine-tuning微调。

4、input_shape指定输入图像的形状。 当include_top = True并被用作图像分类器时,它被固定在(224,224,3),所以None是可以的。 有点中途解决,但这似乎是ImageNet的标准尺寸。

让我们来研究一下加载的模型。

 

% print(model)
<keras.engine.training.Model at 0x2b05220aa978>print(model)
<keras.engine.training.Model at 0x2b05220aa978>

 

 

 

显然,VGG 16似乎是一个不同的类,而不是Keras中常见的Sequential模型。 您可以通过执行dir(模型)来看到,但要小心,因为在Sequential模型中用于堆叠图层的add()并不多。 例如,当向VGG 16添加新层时,有一点巧妙。 我想稍后再详细解释一下。

summary()您可以看到模型结构。

 

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

 

 

 

称重(#Param),我们看到共有16个。 在这个时候,因为include_top = True,所以可以看到添加了fc1,fc2的预测层。 另外,可以看出,最后的预测图层的形状是1000类(无,1000)的类。 没有意味着大小不固定,这里是指输入样本的数量(输入批次的数量)。

通用对象识别与VGG 16

因为我可以读取VGG 16模型,所以我们编写一个程序来输入和分类图像。 在这种情况下,要被分类的图像文件名称作为参数从命令行输入。 实际上,加载VGG 16需要一些时间,所以最好能在启动后立即输入文件名。

 

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

"""
ImageNetで学習済みのVGG16モデルを使って入力画像のクラスを予測する
"""

if len(sys.argv) != 2:
    print("usage: python test_vgg16.py [image file]")
    sys.exit(1)

filename = sys.argv[1]

# 学習済みのVGG16をロード
# 構造とともに学習済みの重みも読み込まれる
model = VGG16(weights='imagenet')
# model.summary()

# 引数で指定した画像ファイルを読み込む
# サイズはVGG16のデフォルトである224x224にリサイズされる
img = image.load_img(filename, target_size=(224, 224))

# 読み込んだPIL形式の画像をarrayに変換
x = image.img_to_array(img)

# 3次元テンソル(rows, cols, channels) を
# 4次元テンソル (samples, rows, cols, channels) に変換
# 入力画像は1枚なのでsamples=1でよい
x = np.expand_dims(x, axis=0)

# Top-5のクラスを予測する
# VGG16の1000クラスはdecode_predictions()で文字列に変換される
preds = model.predict(preprocess_input(x))
results = decode_predictions(preds, top=5)[0]
for result in results:
    print(result)
 keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
import sys

"""
ImageNetで学習済みのVGG16モデルを使って入力画像のクラスを予測する
"""

if len(sys.argv) != 2:
    print("usage: python test_vgg16.py [image file]")
    sys.exit(1)

filename = sys.argv[1]

# 学習済みのVGG16をロード
# 構造とともに学習済みの重みも読み込まれる
model = VGG16(weights='imagenet')
# model.summary()

# 引数で指定した画像ファイルを読み込む
# サイズはVGG16のデフォルトである224x224にリサイズされる
img = image.load_img(filename, target_size=(224, 224))

# 読み込んだPIL形式の画像をarrayに変換
x = image.img_to_array(img)

# 3次元テンソル(rows, cols, channels) を
# 4次元テンソル (samples, rows, cols, channels) に変換
# 入力画像は1枚なのでsamples=1でよい
x = np.expand_dims(x, axis=0)

# Top-5のクラスを予測する
# VGG16の1000クラスはdecode_predictions()で文字列に変換される
preds = model.predict(preprocess_input(x))
results = decode_predictions(preds, top=5)[0]
for result in results:
    print(result)

在这个时候,我只输入一张,而没有统一输入多个图像(事实上,可以以批量单位输入1000张并放在一起并预测)。

 

如果您使用keras.preprocessing.image模块,输入图像很方便。 可以通过调整load_img()指定的大小来加载图像。 此外,img_to_array()可以将PIL格式图像转换为NumPy数组格式。
由于用load_img()加载的图像是(行,列,通道)的3D张量,因此需要将样本转换为4D张量,并添加样本。
类预测是用predict()完成的。 VGG预处理16通过preprocess_input()输入预处理4D张量。 predict()的返回值是NN的输出,是1000个类别的概率值。 很难理解哪一个阶级就是这样。 当使用VGG 16的decode_predictions()时,类名将以概率值的降序输出。

通过输入从ImageNet爬取的适当图像来查看识别结果。 其实我不知道哪个VGG 16的训练数据。 所以请小心,因为我从ImageNet正确拾取的图像恰好包含在训练数据中。

之后为实验图片+图片;

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值