手写汉字数字识别(构建数据集+CNN神经网络)
期末,P老师布置了一个大作业,自己构建数据集实现手写汉字数字的识别。太捞了,记录一下过程。大概花了一个下午加半个晚上,主要是做数据集花时间。
一、构建数据集——使用h5py
1.收集数据,这部分由我勤劳的室友们一起手写了800个汉字 一、二、三、四、五、六、七、八、九、十完成。这部分也没啥好说的,慢慢写呗。我们用了IPAD,然后截图,这样出来的图片质量比较好。
2.对图像进行处理。将图像转化为(64,64,3)的矩阵,对图像批量编号及分类。这里新建了一个py文件,代码如下。
import h5py
import os
import numpy as np
from PIL import Image
import tensorflow as tf
import matplotlib.pyplot as plt
import sklearn
from sklearn import preprocessing
import scipy
#未处理图片位置
orig_picture = r'C:\Users\10595\Desktop\dataset\image'
#已处理图片存储位置
gen_picturn = r'C:\Users\10595\Desktop\dataset\data'
#查询需要分类的类别以及总样本个数
classes = ["one","two","three","four","five","six","seven","eight","nine","ten"]
def get_traindata(orig_dir,gen_dir,classes):
i = 0
for index,name in enumerate(classes):
class_path = orig_dir + '\\' + name + '\\' #扫描原始图片
gen_train_path = gen_dir +'\\' + name #判断是否有文件夹
folder = os.path.exists(gen_train_path)
if not folder :
os.makedirs(gen_train_path)
print(gen_train_path,'new file')
else:
print('There is this flie')
#给图片加编号保存
for imagename_dir in os.listdir(class_path):
i += 1
origimage_path = class_path + imagename_dir
#统一格式
image_data = Image.open(origimage_path).convert('RGB')
image_data = image_data.resize((64,64))
image_data.save(gen_train_path + '\\' + name + str(i) + '.jpg' )
num_samples = i
print('picturn :%d' % num_samples)
if __name__ == '__main__':
get_traindata(orig_picture,gen_picturn,classes)
3.使用h5py将图像打包成数据集
import os
import numpy as np
from PIL import Image
import h5py
import scipy
import matplotlib.pyplot as plt
#搞了十个我也很困惑,不知道有什么简便方法
one = []
label_one = []
two = []
label_two = []
three = []
label_three = []
four = []
label_four = []
five = []
label_five = []
six = []
label_six = []
seven = []
label_seven = []
eight = []
label_eight = []
nine = []
label_nine = []
ten = []
label_ten = []
def get_files(file_dir):
for file in os.listdir(file_dir + '\\' + 'one'):
one.append(file_dir +'\\'+'one'+'\\'+ file)
label_one.append(0)
for file in os.listdir(file_dir + '\\' + 'two'):
two.append(file_dir +'\\'+'two'+'\\'+ file)
label_two.append(1)
for file in os.listdir(file_dir + '\\' + 'three'):
three.append(file_dir +'\\'+'three'+'\\'+ file)
label_three.append(2)
for file in os.listdir(file_dir + '\\' + 'four'):
four.append(file_dir +'\\'+'four'+'\\'+ file)
label_four.append(3)
for file in os.listdir(file_dir + '\\' + 'five'):
five.append(file_dir +'\\'+'five'+'\\'+ file)
label_five.append(4)
for file in os.listdir(file_dir + '\\' + 'six'):
six.append(file_dir +'\\'+'six'+'\\'+ file)
label_six.append(5)
for file in os.listdir(file_dir + '\\' + 'seven'):
seven.append(file_dir +'\\'+'seven'+'\\'+ file)
label_seven.append(6)
for file in os.listdir(file_dir + '\\' + 'eight'):
eight.append(file_dir +'\\'+'eight'+'\\'+ file)
label_eight.append(7)
for file in os.listdir(file_dir + '\\' + 'nine'):
nine.append(file_dir +'\\'+'nine'+'\\'+ file)
label_nine.append(8)
for file in os.listdir(file_dir + '\\' + 'ten'):
ten.append(file_dir +'\\'+'ten'+'\\'+ file)
label_ten.append(9)
#把所有数据集进行合并
image_list = np.hstack((one,two,three,four,five,six,seven,eight,nine,ten))
label_list = np.hstack((label_one,label_two,label_three,label_four,label_five,label_six,label_seven,label_eight,label_nine,label_ten))
#利用shuffle打乱顺序
temp = np.array([image_list, label_list])
temp = temp.transpose()
np.random.shuffle(temp)
#从打乱的temp中再取出list(img和lab)
image_list = list(temp[:, 0]