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 相关文章推荐
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
python迭代器与生成器详解
Mar 10 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
Django自定义用户认证示例详解
Mar 14 Python
PyQt5每天必学之创建窗口居中效果
Apr 19 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
python计算两个地址之间的距离方法
Jun 09 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
python输出数学符号实例
May 11 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
Python字符串常规操作小结
Apr 03 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 Session存储到Redis的方法
2013/11/04 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
Javascript堆排序算法详解
2014/12/03 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python图算法实例分析
2016/08/13 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
Python 下载及安装详细步骤
2019/11/04 Python
对python中list的五种查找方法说明
2020/07/13 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
什么是GWT的Module
2013/01/20 面试题
大学生实习思想汇报
2014/01/12 职场文书
中学运动会广播稿
2014/01/19 职场文书
初中生评语大全
2014/04/24 职场文书
班主任个人工作反思
2014/04/28 职场文书
2014年学生会部门工作总结
2014/11/07 职场文书
应急管理工作总结2015
2015/05/04 职场文书
运动会宣传稿50字
2015/07/23 职场文书
Navicat for MySQL的使用教程详解
2021/05/27 MySQL
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers