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之??碌某?? target=
Sep 12 Python
跟老齐学Python之眼花缭乱的运算符
Sep 14 Python
在Python的Flask框架中使用日期和时间的教程
Apr 21 Python
python中string模块各属性以及函数的用法介绍
May 30 Python
利用Hyperic调用Python实现进程守护
Jan 02 Python
python2 与python3的print区别小结
Jan 16 Python
Django web框架使用url path name详解
Apr 29 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
Python 远程开关机的方法
Nov 18 Python
浅谈Python xlwings 读取Excel文件的正确姿势
Feb 26 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 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的curl实现get和post的代码
2008/08/23 PHP
php adodb分页实现代码
2009/03/19 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
Selenium控制浏览器常见操作示例
2018/08/13 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
Python 实现还原已撤回的微信消息
2019/06/18 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
幼儿园教师岗位职责
2014/03/17 职场文书
单位委托书
2014/10/15 职场文书
新员工入职欢迎词
2015/01/23 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android