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字典操作简明总结
Apr 13 Python
Python中表示字符串的三种方法
Sep 06 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
详解python中的线程与线程池
May 10 Python
安装好Pycharm后如何配置Python解释器简易教程
Jun 28 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
Python bytes string相互转换过程解析
Mar 05 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Keras之自定义损失(loss)函数用法说明
Jun 10 Python
keras.layer.input()用法说明
Jun 16 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
Jul 27 Python
python APScheduler执行定时任务介绍
Apr 19 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
把77A收信机改造成收音机
2021/03/02 无线电
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
php数字游戏 计算24算法
2012/06/10 PHP
10 个经典PHP函数
2013/10/17 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
PHP中header用法小结
2016/05/23 PHP
js操纵跨frame的三级联动select下拉选项实例介绍
2013/05/19 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
JS实现隐藏同级元素后只显示JS文件内容的方法
2016/09/04 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
详解webpack编译速度提升之DllPlugin
2019/02/05 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
python读取中文txt文本的方法
2018/04/12 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
python中p-value的实现方式
2019/12/16 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
大学三年的自我评价
2013/12/25 职场文书
对公司合理化的建议书
2014/03/12 职场文书
初中班主任评语大全
2014/04/24 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
美术社团活动总结
2014/06/27 职场文书
党课培训心得体会
2014/09/02 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
Hive常用日期格式转换语法
2022/06/25 数据库