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 相关文章推荐
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
深入解析Python中的urllib2模块
Nov 13 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
深入理解Python爬虫代理池服务
Feb 28 Python
Python日志无延迟实时写入的示例
Jul 11 Python
docker django无法访问redis容器的解决方法
Aug 21 Python
wxPython实现画图板
Aug 27 Python
Python如何实现FTP功能
May 28 Python
详解python的变量缓存机制
Jan 24 Python
在python中实现导入一个需要传参的模块
May 12 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
pytorch中[..., 0]的用法说明
May 20 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 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
php计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
js验证表单大全
2006/11/25 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
Bootstrap创建可折叠的组件
2016/02/23 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
python中p-value的实现方式
2019/12/16 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
TCP/IP的分层模型
2013/10/27 面试题
烹调加工管理制度
2014/02/04 职场文书
环境工程专业自荐信
2014/03/03 职场文书
洗发水广告词
2014/03/13 职场文书
升职演讲稿范文
2014/05/23 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
亲情作文之母爱
2019/09/25 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python