python tensorflow学习之识别单张图片的实现的示例


Posted in Python onFebruary 09, 2018

假设我们已经安装好了tensorflow。

一般在安装好tensorflow后,都会跑它的demo,而最常见的demo就是手写数字识别的demo,也就是mnist数据集。

然而我们仅仅是跑了它的demo而已,可能很多人会有和我一样的想法,如果拿来一张数字图片,如何应用我们训练的网络模型来识别出来,下面我们就以mnist的demo来实现它。

1.训练模型

首先我们要训练好模型,并且把模型model.ckpt保存到指定文件夹

saver = tf.train.Saver()   
saver.save(sess, "model_data/model.ckpt")

将以上两行代码加入到训练的代码中,训练完成后保存模型即可,如果这部分有问题,你可以百度查阅资料,tensorflow怎么保存训练模型,在这里我们就不罗嗦了。

2.测试模型

我们训练好模型后,将它保存在了model_data文件夹中,你会发现文件夹中出现了4个文件

python tensorflow学习之识别单张图片的实现的示例

然后,我们就可以对这个模型进行测试了,将待检测图片放在images文件夹下,执行

# -*- coding:utf-8 -*-  
import cv2 
import tensorflow as tf 
import numpy as np 
from sys import path 
path.append('../..') 
from common import extract_mnist 
 
#初始化单个卷积核上的参数 
def weight_variable(shape): 
  initial = tf.truncated_normal(shape, stddev=0.1) 
  return tf.Variable(initial) 
 
#初始化单个卷积核上的偏置值 
def bias_variable(shape): 
  initial = tf.constant(0.1, shape=shape) 
  return tf.Variable(initial) 
 
#输入特征x,用卷积核W进行卷积运算,strides为卷积核移动步长, 
#padding表示是否需要补齐边缘像素使输出图像大小不变 
def conv2d(x, W): 
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 
 
#对x进行最大池化操作,ksize进行池化的范围, 
def max_pool_2x2(x): 
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],strides=[1, 2, 2, 1], padding='SAME') 
 
 
def main(): 
   
  #定义会话 
  sess = tf.InteractiveSession() 
   
  #声明输入图片数据,类别 
  x = tf.placeholder('float',[None,784]) 
  x_img = tf.reshape(x , [-1,28,28,1]) 
 
  W_conv1 = weight_variable([5, 5, 1, 32]) 
  b_conv1 = bias_variable([32]) 
  W_conv2 = weight_variable([5,5,32,64]) 
  b_conv2 = bias_variable([64]) 
  W_fc1 = weight_variable([7*7*64,1024]) 
  b_fc1 = bias_variable([1024]) 
  W_fc2 = weight_variable([1024,10]) 
  b_fc2 = bias_variable([10]) 
 
  saver = tf.train.Saver(write_version=tf.train.SaverDef.V1)  
  saver.restore(sess , 'model_data/model.ckpt') 
 
  #进行卷积操作,并添加relu激活函数 
  h_conv1 = tf.nn.relu(conv2d(x_img,W_conv1) + b_conv1) 
  #进行最大池化 
  h_pool1 = max_pool_2x2(h_conv1) 
 
  #同理第二层卷积层 
  h_conv2 = tf.nn.relu(conv2d(h_pool1,W_conv2) + b_conv2) 
  h_pool2 = max_pool_2x2(h_conv2) 
   
  #将卷积的产出展开 
  h_pool2_flat = tf.reshape(h_pool2,[-1,7*7*64]) 
  #神经网络计算,并添加relu激活函数 
  h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat,W_fc1) + b_fc1) 
 
  #输出层,使用softmax进行多分类 
  y_conv=tf.nn.softmax(tf.matmul(h_fc1, W_fc2) + b_fc2) 
 
  # mnist_data_set = extract_mnist.MnistDataSet('../../data/') 
  # x_img , y = mnist_data_set.next_train_batch(1) 
  im = cv2.imread('images/888.jpg',cv2.IMREAD_GRAYSCALE).astype(np.float32) 
  im = cv2.resize(im,(28,28),interpolation=cv2.INTER_CUBIC) 
  #图片预处理 
  #img_gray = cv2.cvtColor(im , cv2.COLOR_BGR2GRAY).astype(np.float32) 
  #数据从0~255转为-0.5~0.5 
  img_gray = (im - (255 / 2.0)) / 255 
  #cv2.imshow('out',img_gray) 
  #cv2.waitKey(0) 
  x_img = np.reshape(img_gray , [-1 , 784]) 
 
  print x_img 
  output = sess.run(y_conv , feed_dict = {x:x_img}) 
  print 'the y_con :  ', '\n',output 
  print 'the predict is : ', np.argmax(output) 
 
  #关闭会话 
  sess.close() 
 
if __name__ == '__main__': 
  main()

ok,贴一下效果图

python tensorflow学习之识别单张图片的实现的示例

输出:

python tensorflow学习之识别单张图片的实现的示例

最后再贴一个cifar10的,感觉我的输入数据有点问题,因为直接读cifar10的数据测试是没问题的,但是换成自己的图片做预处理后输入结果就有问题,(参考:cv2读入的数据是BGR顺序,PIL读入的数据是RGB顺序,cifar10的数据是RGB顺序),哪位童鞋能指出来记得留言告诉我

# -*- coding:utf-8 -*-   
from sys import path 
import numpy as np 
import tensorflow as tf 
import time 
import cv2 
from PIL import Image 
path.append('../..') 
from common import extract_cifar10 
from common import inspect_image 
 
 
#初始化单个卷积核上的参数 
def weight_variable(shape): 
  initial = tf.truncated_normal(shape, stddev=0.1) 
  return tf.Variable(initial) 
 
#初始化单个卷积核上的偏置值 
def bias_variable(shape): 
  initial = tf.constant(0.1, shape=shape) 
  return tf.Variable(initial) 
 
#卷积操作 
def conv2d(x, W): 
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 
 
 
 
def main(): 
  #定义会话 
  sess = tf.InteractiveSession() 
   
  #声明输入图片数据,类别 
  x = tf.placeholder('float',[None,32,32,3]) 
  y_ = tf.placeholder('float',[None,10]) 
 
  #第一层卷积层 
  W_conv1 = weight_variable([5, 5, 3, 64]) 
  b_conv1 = bias_variable([64]) 
  #进行卷积操作,并添加relu激活函数 
  conv1 = tf.nn.relu(conv2d(x,W_conv1) + b_conv1) 
  # pool1 
  pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],padding='SAME', name='pool1') 
  # norm1 
  norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,name='norm1') 
 
 
  #第二层卷积层 
  W_conv2 = weight_variable([5,5,64,64]) 
  b_conv2 = bias_variable([64]) 
  conv2 = tf.nn.relu(conv2d(norm1,W_conv2) + b_conv2) 
  # norm2 
  norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9.0, beta=0.75,name='norm2') 
  # pool2 
  pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1],strides=[1, 2, 2, 1], padding='SAME', name='pool2') 
 
  #全连接层 
  #权值参数 
  W_fc1 = weight_variable([8*8*64,384]) 
  #偏置值 
  b_fc1 = bias_variable([384]) 
  #将卷积的产出展开 
  pool2_flat = tf.reshape(pool2,[-1,8*8*64]) 
  #神经网络计算,并添加relu激活函数 
  fc1 = tf.nn.relu(tf.matmul(pool2_flat,W_fc1) + b_fc1) 
   
  #全连接第二层 
  #权值参数 
  W_fc2 = weight_variable([384,192]) 
  #偏置值 
  b_fc2 = bias_variable([192]) 
  #神经网络计算,并添加relu激活函数 
  fc2 = tf.nn.relu(tf.matmul(fc1,W_fc2) + b_fc2) 
 
 
  #输出层,使用softmax进行多分类 
  W_fc2 = weight_variable([192,10]) 
  b_fc2 = bias_variable([10]) 
  y_conv=tf.maximum(tf.nn.softmax(tf.matmul(fc2, W_fc2) + b_fc2),1e-30) 
 
  # 
  saver = tf.train.Saver() 
  saver.restore(sess , 'model_data/model.ckpt') 
  #input 
  im = Image.open('images/dog8.jpg') 
  im.show() 
  im = im.resize((32,32)) 
  # r , g , b = im.split() 
  # im = Image.merge("RGB" , (r,g,b)) 
  print im.size , im.mode 
 
  im = np.array(im).astype(np.float32) 
  im = np.reshape(im , [-1,32*32*3]) 
  im = (im - (255 / 2.0)) / 255 
  batch_xs = np.reshape(im , [-1,32,32,3]) 
  #print batch_xs 
  #获取cifar10数据 
  # cifar10_data_set = extract_cifar10.Cifar10DataSet('../../data/') 
  # batch_xs, batch_ys = cifar10_data_set.next_train_batch(1) 
  # print batch_ys 
  output = sess.run(y_conv , feed_dict={x:batch_xs}) 
  print output 
  print 'the out put is :' , np.argmax(output) 
  #关闭会话 
  sess.close() 
 
if __name__ == '__main__': 
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中的一些类型转换函数小结
Feb 10 Python
python中的对象拷贝示例 python引用传递
Jan 23 Python
python 文件操作api(文件操作函数)
Aug 28 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
教你用一行Python代码实现并行任务(附代码)
Feb 02 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
python tkinter组件使用详解
Sep 16 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python实现快速大文件比较代码解析
Sep 04 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
Python学习开发之图形用户界面详解
Aug 23 Python
python删除服务器文件代码示例
Feb 09 #Python
详解Python使用tensorflow入门指南
Feb 09 #Python
python编程测试电脑开启最大线程数实例代码
Feb 09 #Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 #Python
Python+PIL实现支付宝AR红包
Feb 09 #Python
Python 实现12306登录功能实例代码
Feb 09 #Python
Python多层装饰器用法实例分析
Feb 09 #Python
You might like
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
php daddslashes()和 saddslashes()有哪些区别分析
2012/10/26 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
php设计模式之委托模式
2016/02/13 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python 布尔操作实现代码
2013/03/23 Python
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
python实现守护进程、守护线程、守护非守护并行
2018/05/05 Python
python 实现让字典的value 成为列表
2019/12/16 Python
教师辞职报告范文
2014/01/20 职场文书
丑小鸭教学反思
2014/02/03 职场文书
小学教师培训感言
2014/02/11 职场文书
小学开学标语
2014/07/01 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android