要做一个OCR票据识别,虽然有许多现成的接口,但是作为小白,打算先从MINIST入门,逐步深入,记录下一步步过程。
一、在pycharm中导入TensorFlow
1、Anaconda的下载与安装
下载链接:Anaconda下载
安装好以后在开始菜单栏选择Anaconda prompt,由于anaconda下载的是最新的版本,附带下载的python也是3.6,但是目前windows下TensorFlow只支持python3.5,所以要修改一下python的环境,在Anaconda prompt里运行
conda create -n tensorflow python=3.5
再次查看python版本,更换为3.5
2、TensorFlow及其相关包的安装
在Anaconda prompt中开启TensorFlow:
activate tensorflow
安装cpu版本:
pip install --upgrade --ignore-installed tensorflow
安装ipython和Spyder:进入anaconda navigator中找到这两个包并下载
测试:在Anaconda prompt中开启TensorFlow,进入python,输入下面代码
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
3、在pycharm中导入TensorFlow
创建工程test,选择File->settings->Project:test->Project InterPreter,在一串路径后选择Add,然后再Base interpreter中选择TensorFlow的解释器,如下图
再在IDE中输入上面的测试代码,运行
以上部分参考文档:Windows下用Anaconda安装TensorFlow,并在pycharm中使用
二、MNIST数据集处理
1、可视化
mnist官方文档对数据集有介绍:mnist数据集
把它以字节流的存储方式转为图片模式,首先是一张图片的测试:
import numpy as np
import struct
import matplotlib.pyplot as plt
filename = 'train-images.idx3-ubyte'
binfile = open(filename, 'rb')
buf = binfile.read()
index = 0
magic, numImages, numRows, numColumns = struct.unpack_from('>IIII', buf, index)
index += struct.calcsize('>IIII')
im = struct.unpack_from('>784B', buf, index)
index += struct.calcsize('>784B')
im = np.array(im)
im = im.reshape(28, 28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.imshow(im, cmap='gray')
plt.show()
运行之后可以看到784维的向量reshape成28*28的图片
以上参考文档:python读取mnist
现在要读取多个图片并保存,加上一层循环,目前先读取30张
import numpy as np
import struct
import matplotlib.pyplot as plt
#以二进制方式读取文件
filename = './Dataset/train-images.idx3-ubyte'
binfile = open(filename, 'rb')
buf = binfile.read()
index = 0
magic, numImages, numRows, numColumns = struct.unpack_from('>IIII', buf, index)
index += struct.calcsize('>IIII')
#'>IIII'是说使用大端法读取4个unsinged int32
for i in range(30): # 读取前30张图片
im = struct.unpack_from('>784B', buf, index)
index += struct.calcsize('>784B')
im = np.array(im)
im = im.reshape(28, 28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.axis('off')
plt.imshow(im, cmap='gray')
plt.savefig("./Dataset/train-images/test" + str(i) + ".png")
plt.close()
binfile.close()
在对应的文件夹下可以看到图片,如下所示
另一种读取图片的方式
import gzip
import numpy
import matplotlib.pyplot as plt
filepath = r"E:\python_Project\MNIST\Program\Dataset\train-images-idx3-ubyte.gz"
def _read32(bytestream):
dt = numpy.dtype(numpy.uint32).newbyteorder('>')
return numpy.frombuffer(bytestream.read(4), dtype=dt)[0]
def imagine_arr(filepath):
with open(filepath, 'rb') as f:
with gzip.GzipFile(fileobj=f) as bytestream:
magic = _read32(bytestream)
if magic != 2051:
raise ValueError('Invalid magic number %d in MNIST image file: %s' % (magic, f.name))
_read32(bytestream) # 几张图片
rows = _read32(bytestream)
cols = _read32(bytestream)
img_num = 64 #同时展示的图片数目
buf = bytestream.read(rows * cols * img_num)
data = numpy.frombuffer(buf, dtype=numpy.ubyte)
return data.reshape(img_num, rows, cols, 1)
im_data = imagine_arr(filepath)
fig, axes = plt.subplots(8, 8)
for l, ax in enumerate(axes.flat):
ax.imshow(im_data[l].reshape(28, 28), cmap='gray')
ax.set_xticks([])