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的Django框架中为代码添加注释的方法
Jul 16 Python
Python使用openpyxl读写excel文件的方法
Jun 30 Python
Python tkinter label 更新方法
Oct 11 Python
Django 实现图片上传和显示过程详解
Jul 18 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
django fernet fields字段加密实践详解
Aug 12 Python
python修改文件内容的3种方法详解
Nov 15 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
Dec 22 Python
python实现多进程按序号批量修改文件名的方法示例
Dec 30 Python
Python列表切片常用操作实例解析
Mar 10 Python
python 对xml解析的示例
Feb 27 Python
python 中[0]*2与0*2的区别说明
May 10 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
全国FM电台频率大全 - 10 江苏省
2020/03/11 无线电
2019十大人气国漫
2020/03/13 国漫
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
PHP+MySQL之Insert Into数据插入用法分析
2015/09/27 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
Python中的pack和unpack的使用
2018/03/12 Python
在Python运行时动态查看进程内部信息的方法
2019/02/22 Python
python图像处理入门(一)
2019/04/04 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
土建工程师岗位职责
2014/06/10 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
建筑安全生产责任书
2014/07/22 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
教师见习报告范文
2014/11/03 职场文书
成本会计岗位职责
2015/02/03 职场文书
2015年化验室工作总结
2015/04/23 职场文书
党小组意见范文
2015/06/08 职场文书
OpenCV 图像梯度的实现方法
2021/07/25 Python
CSS实现切角+边框+投影+内容背景色渐变效果
2021/11/01 HTML / CSS
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js