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删除Java源文件中全部注释的实现方法
Aug 30 Python
python中验证码连通域分割的方法详解
Jun 04 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
Python输出指定字符串的方法
Feb 06 Python
使用Python第三方库pygame写个贪吃蛇小游戏
Mar 06 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
python解包概念及实例
Feb 17 Python
python某漫画app逆向
Mar 31 Python
详解Python中下划线的5种含义
Jul 15 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
php函数与传递参数实例分析
2014/11/15 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
四种参数传递的形式——URL,超链接,js,form表单
2015/07/24 Javascript
JavaScript多线程详解
2015/08/12 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
微信小程序授权获取用户详细信息openid的实例详解
2017/09/20 Javascript
import与export在node.js中的使用详解
2017/09/28 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
JS实现可用滑块滑动的缓动图代码
2019/09/01 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
Python 专题三 字符串的基础知识
2017/03/19 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
2014年教育工作总结
2014/11/26 职场文书
工程部部长岗位职责
2015/02/12 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
MySQL系列之三 基础篇
2021/07/02 MySQL
django中websocket的具体使用
2022/01/22 Python