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 相关文章推荐
TensorFlow中权重的随机初始化的方法
Feb 11 Python
详解配置Django的Celery异步之路踩坑
Nov 25 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
python 三元运算符使用解析
Sep 16 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
python2.7使用scapy发送syn实例
May 05 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
快速了解Python开发环境Spyder
Jun 29 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 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语言构造器介绍
2013/07/08 PHP
简单的php中文转拼音的实现代码
2014/02/11 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
vue按需加载实例详解
2019/09/06 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
Django用户身份验证完成示例代码
2020/04/03 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
Python读写yaml文件
2022/03/20 Python