keras实现VGG16方式(预测一张图片)


Posted in Python onJuly 07, 2020

我就废话不多说了,大家还是直接看代码吧~

from keras.applications.vgg16 import VGG16#直接导入已经训练好的VGG16网络
from keras.preprocessing.image import load_img#load_image作用是载入图片
from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
 
model = VGG16()
image = load_img('D:\\photo\\dog.jpg',target_size=(224,224))#参数target_size用于设置目标的大小,如此一来无论载入的原图像大小如何,都会被标准化成统一的大小,这样做是为了向神经网络中方便地输入数据所需的。
image = img_to_array(image)#函数img_to_array会把图像中的像素数据转化成NumPy中的array,这样数据才可以被Keras所使用。
#神经网络接收一张或多张图像作为输入,也就是说,输入的array需要有4个维度: samples, rows, columns, and channels。由于我们仅有一个 sample(即一张image),我们需要对这个array进行reshape操作。
image = image.reshape((1,image.shape[0],image.shape[1],image.shape[2]))
image = preprocess_input(image)#对图像进行预处理
y = model.predict(image)#预测图像的类别
label = decode_predictions(y)#Keras提供了一个函数decode_predictions(),用以对已经得到的预测向量进行解读。该函数返回一个类别列表,以及类别中每个类别的预测概率,
label = label[0][0]
print('%s(%.2f%%)'%(label[1],label[2]*100))
# print(model.summary())
from keras.models import Sequential
from keras.layers.core import Flatten,Dense,Dropout
from keras.layers.convolutional import Convolution2D,MaxPooling2D,ZeroPadding2D
from keras.optimizers import SGD
import numpy as np
 
from keras.preprocessing import image
from keras.applications.imagenet_utils import preprocess_input, decode_predictions
import time
from keras import backend as K
K.set_image_dim_ordering('th')
def VGG_16(weights_path=None):
  model = Sequential()
 
  model.add(ZeroPadding2D((1, 1), input_shape=(3, 224, 224)))
  model.add(Convolution2D(64, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(64, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(128, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(128, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(256, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(ZeroPadding2D((1, 1)))
  model.add(Convolution2D(512, (3, 3), activation='relu'))
  model.add(MaxPooling2D((2, 2), strides=(2, 2)))
 
  model.add(Flatten())
  model.add(Dense(4096, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(4096, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(1000, activation='softmax'))
 
  if weights_path:
    model.load_weights(weights_path,by_name=True)
 
  return model
 
model = VGG_16(weights_path='F:\\Kaggle\\vgg16_weights.h5')
sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd, loss='categorical_crossentropy')
 
t0 = time.time()
img = image.load_img('D:\\photo\\dog.jpg', target_size=(224, 224))
x = image.img_to_array(img) # 三维(224,224,3)
x = np.expand_dims(x, axis=0) # 四维(1,224,224,3)#因为keras要求的维度是这样的,所以要增加一个维度
x = preprocess_input(x) # 预处理
print(x.shape)
y_pred = model.predict(x) # 预测概率
 
t1 = time.time()
 
print("测试图:", decode_predictions(y_pred)) # 输出五个最高概率(类名, 语义概念, 预测概率)
print("耗时:", str((t1 - t0) * 1000), "ms")

这是两种不同的方式,第一种是直接使用vgg16的参数,需要在运行时下载,第二种是我们已经下载好的权重,直接在参数中输入我们的路径即可。

补充知识:keras加经典网络的预训练模型(以VGG16为例)

我就废话不多说了,大家还是直接看代码吧~

# 使用VGG16模型
from keras.applications.vgg16 import VGG16
print('Start build VGG16 -------')
 
# 获取vgg16的卷积部分,如果要获取整个vgg16网络需要设置:include_top=True
model_vgg16_conv = VGG16(weights='imagenet', include_top=False)
model_vgg16_conv.summary()
 
# 创建自己的输入格式
# if K.image_data_format() == 'channels_first':
#  input_shape = (3, img_width, img_height)
# else:
#  input_shape = (img_width, img_height, 3)
 
input = Input(input_shape, name = 'image_input') # 注意,Keras有个层就是Input层
 
# 将vgg16模型原始输入转换成自己的输入
output_vgg16_conv = model_vgg16_conv(input)
 
# output_vgg16_conv是包含了vgg16的卷积层,下面我需要做二分类任务,所以需要添加自己的全连接层
x = Flatten(name='flatten')(output_vgg16_conv)
x = Dense(4096, activation='relu', name='fc1')(x)
x = Dense(512, activation='relu', name='fc2')(x)
x = Dense(128, activation='relu', name='fc3')(x)
x = Dense(1, activation='softmax', name='predictions')(x)
 
# 最终创建出自己的vgg16模型
my_model = Model(input=input, output=x)
 
# 下面的模型输出中,vgg16的层和参数不会显示出,但是这些参数在训练的时候会更改
print('\nThis is my vgg16 model for the task')
my_model.summary()

以上这篇keras实现VGG16方式(预测一张图片)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中__name__的使用实例
Apr 14 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
Python实现求数列和的方法示例
Jan 12 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Python读写zip压缩文件的方法
Aug 29 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
python2和python3在处理字符串上的区别详解
May 29 Python
django将数组传递给前台模板的方法
Aug 06 Python
详解如何减少python内存的消耗
Aug 09 Python
python批量处理文件或文件夹
Jul 28 Python
python中bytes和str类型的区别
Oct 21 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
通过实例解析Python RPC实现原理及方法
Jul 07 #Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 #Python
Scrapy模拟登录赶集网的实现代码
Jul 07 #Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 #Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 #Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 #Python
Django REST Swagger实现指定api参数
Jul 07 #Python
You might like
优化PHP代码的53条建议
2008/03/27 PHP
兼容性最强的PHP生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
jquery的颜色选择插件实例代码
2008/10/02 Javascript
csdn 博客的css样式 v3
2009/02/24 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
深入了解JavaScript代码覆盖
2019/06/13 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
浅谈python连续赋值可能引发的错误
2018/11/10 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
2020/09/18 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
中国最大的名表商城:万表网
2016/08/29 全球购物
C语言面试题
2013/05/19 面试题
大学新生欢迎词
2014/01/10 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
广播体操比赛口号
2014/06/10 职场文书
横空出世观后感
2015/06/09 职场文书