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中的类与实例
Apr 27 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
pandas series序列转化为星期几的实例
Apr 11 Python
django将图片上传数据库后在前端显式的方法
May 25 Python
flask中过滤器的使用详解
Aug 01 Python
如何使用python把ppt转换成pdf
Jun 29 Python
Python高级特性 切片 迭代解析
Aug 23 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python 如何实现访问者模式
Jul 28 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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程序的方法小结
2012/02/23 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
vue.js实现单选框、复选框和下拉框示例
2017/07/18 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
使用Python处理BAM的方法
2018/09/28 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
python 读取.nii格式图像实例
2020/07/01 Python
python为什么要安装到c盘
2020/07/20 Python
分享29个基于Bootstrap的HTML5响应式网页设计模板
2015/11/19 HTML / CSS
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
医科大学毕业生自荐信
2014/02/03 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
从事会计工作年限证明
2015/06/23 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
Pytest中conftest.py的用法
2021/06/27 Python