侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   175

假设我们已经安装好了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个文件

然后,我们就可以对这个模型进行测试了,将待检测图片放在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,贴一下效果图

输出:

最后再贴一个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删除服务器文件代码示例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客