Keras预训练的ImageNet模型实现分类操作


Posted in Python onJuly 07, 2020

本文主要介绍通过预训练的ImageNet模型实现图像分类,主要使用到的网络结构有:VGG16、InceptionV3、ResNet50、MobileNet。

代码:

import keras
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
 
# 加载模型
vgg_model = vgg16.VGG16(weights='imagenet')
inception_model = inception_v3.InceptionV3(weights='imagenet')
resnet_model = resnet50.ResNet50(weights='imagenet')
mobilenet_model = mobilenet.MobileNet(weights='imagenet')
 
# 导入所需的图像预处理模块
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.imagenet_utils import decode_predictions
import matplotlib.pyplot as plt
%matplotlib inline
 
filename= 'images/cat.jpg'
 
# 将图片输入到网络之前执行预处理
'''
1、加载图像,load_img
2、将图像从PIL格式转换为Numpy格式,image_to_array
3、将图像形成批次,Numpy的expand_dims
'''
# 以PIL格式加载图像
original = load_img(filename, target_size=(224, 224))
print('PIL image size', original.size)
plt.imshow(original)
plt.show()
 
# 将输入图像从PIL格式转换为Numpy格式
# In PIL-- 图像为(width, height, channel)
# In Numpy——图像为(height, width, channel)
numpy_image = img_to_array(original)
plt.imshow(np.uint8(numpy_image))
plt.show()
print('numpy array size', numpy_image.size)
 
# 将图像/图像转换为批量格式
# expand_dims将为特定轴上的数据添加额外的维度
# 网络的输入矩阵具有形式(批量大小,高度,宽度,通道)
# 因此,将额外的维度添加到轴0。
image_batch = np.expand_dims(numpy_image, axis=0)
print('image batch size', image_batch.shape)
plt.imshow(np.uint8(image_batch[0]))
 
# 使用各种网络进行预测
# 通过从批处理中的图像的每个通道中减去平均值来预处理输入。 
# 平均值是通过从ImageNet获得的所有图像的R,G,B像素的平均值获得的三个元素的阵列
# 获得每个类的发生概率
# 将概率转换为人类可读的标签
# VGG16 网络模型
# 对输入到VGG模型的图像进行预处理
processed_image = vgg16.preprocess_input(image_batch.copy())
 
# 获取预测得到的属于各个类别的概率
predictions = vgg_model.predict(processed_image)
# 输出预测值
# 将预测概率转换为类别标签
# 缺省情况下将得到最有可能的五种类别
label_vgg = decode_predictions(predictions)
label_vgg
 
# ResNet50网络模型
# 对输入到ResNet50模型的图像进行预处理
processed_image = resnet50.preprocess_input(image_batch.copy())
 
# 获取预测得到的属于各个类别的概率
predictions = resnet_model.predict(processed_image)
 
# 将概率转换为类标签
# 如果要查看前3个预测,可以使用top参数指定它
label_resnet = decode_predictions(predictions, top=3)
label_resnet
 
# MobileNet网络结构
# 对输入到MobileNet模型的图像进行预处理
processed_image = mobilenet.preprocess_input(image_batch.copy())
 
# 获取预测得到属于各个类别的概率
predictions = mobilenet_model.predict(processed_image)
 
# 将概率转换为类标签
label_mobilnet = decode_predictions(predictions)
label_mobilnet
 
# InceptionV3网络结构
# 初始网络的输入大小与其他网络不同。 它接受大小的输入(299,299)。
# 因此,根据它加载具有目标尺寸的图像。
# 加载图像为PIL格式
original = load_img(filename, target_size=(299, 299))
 
# 将PIL格式的图像转换为Numpy数组
numpy_image = img_to_array(original)
 
# 根据批量大小重塑数据
image_batch = np.expand_dims(numpy_image, axis=0)
 
# 将输入图像转换为InceptionV3所能接受的格式
processed_image = inception_v3.preprocess_input(image_batch.copy())
 
# 获取预测得到的属于各个类别的概率
predictions = inception_model.predict(processed_image)
 
# 将概率转换为类标签
label_inception = decode_predictions(predictions)
label_inception
 
import cv2
numpy_image = np.uint8(img_to_array(original)).copy()
numpy_image = cv2.resize(numpy_image,(900,900))
 
cv2.putText(numpy_image, "VGG16: {}, {:.2f}".format(label_vgg[0][0][1], label_vgg[0][0][2]) , (350, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.putText(numpy_image, "MobileNet: {}, {:.2f}".format(label_mobilenet[0][0][1], label_mobilenet[0][0][2]) , (350, 75), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.putText(numpy_image, "Inception: {}, {:.2f}".format(label_inception[0][0][1], label_inception[0][0][2]) , (350, 110), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.putText(numpy_image, "ResNet50: {}, {:.2f}".format(label_resnet[0][0][1], label_resnet[0][0][2]) , (350, 145), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
numpy_image = cv2.resize(numpy_image, (700,700))
cv2.imwrite("images/{}_output.jpg".format(filename.split('/')[-1].split('.')[0]),cv2.cvtColor(numpy_image, cv2.COLOR_RGB2BGR))
 
plt.figure(figsize=[10,10])
plt.imshow(numpy_image)
plt.axis('off')

训练数据:

Keras预训练的ImageNet模型实现分类操作

运行结果:

Keras预训练的ImageNet模型实现分类操作

以上这篇Keras预训练的ImageNet模型实现分类操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
Python+matplotlib实现填充螺旋实例
Jan 15 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
Feb 29 Python
python中sklearn的pipeline模块实例详解
May 21 Python
python如何快速生成时间戳
Jul 21 Python
Python图像处理二值化方法实例汇总
Jul 24 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 Python
基于Python实现对比Exce的工具
Apr 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
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 #Python
python db类用法说明
Jul 07 #Python
You might like
PHP 5.3.0 安装分析心得
2009/08/07 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php生成zip文件类实例
2015/04/07 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
jquery插件开发注意事项小结
2013/06/04 Javascript
使用js 设置url参数
2013/07/08 Javascript
JS动态添加与删除select中的Option对象(示例代码)
2013/12/20 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
在vue中获取token,并将token写进header的方法
2018/09/26 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python中__call__用法实例
2014/08/29 Python
Python中max函数用法实例分析
2015/07/17 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
用python读取xlsx文件
2020/12/17 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
2014年三八妇女节活动方案
2014/02/28 职场文书
小学开学典礼主持词
2014/03/19 职场文书
三方协议书范本
2014/04/22 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python