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实现把数字转换成中文
Jun 29 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
使用python调用zxing库生成二维码图片详解
Jan 10 Python
python放大图片和画方格实现算法
Mar 30 Python
浅谈django orm 优化
Aug 18 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python脚本开机自启的实现方法
Jun 28 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
Jul 11 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
Python深度学习之实现卷积神经网络
Jun 05 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
攻克CakePHP系列三 表单数据增删改
2008/10/22 PHP
PHP $_SERVER详解
2009/01/16 PHP
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
AngularJS语法详解
2015/01/23 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
vue.js从安装到搭建过程详解
2017/03/17 Javascript
Vue.js实现一个SPA登录页面的过程【推荐】
2017/04/29 Javascript
实时监控input框,实现输入框与下拉框联动的实例
2018/01/23 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
2018/08/24 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python中@property的理解和使用示例
2019/06/11 Python
Python 分享10个PyCharm技巧
2019/07/13 Python
python多线程同步之文件读写控制
2021/02/25 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
详解python logging日志传输
2020/07/01 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
本科生的职业生涯规划范文
2014/01/09 职场文书
党员公开承诺书
2014/03/25 职场文书
小学清明节活动总结
2014/07/04 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2016年元旦致辞
2015/08/01 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
TV动画《间谍过家家》公开PV
2022/03/20 日漫