Keras进行人民币面额识别(二)

TinyMind人民币面值&冠字号编码识别挑战赛

    • 数据准备
    • 环境的准备
    • 完整代码
    • 代码解析
    • 输出结果

本篇是进行神经网络的训练

数据准备

上一篇文章进行了数据的分类,获得的数据如下:
Keras进行人民币面额识别(二)_第1张图片

环境的准备

进行神经网络训练,需要的环境还是比较多的,建议下载Anaconda
网上有很多环境配置
推荐一种,步骤比较多,不是一键式安装,中间肯定会出现各种奇奇怪怪的问题,有问题找百度
https://blog.csdn.net/qq_32728345/article/details/81570504

完整代码

里边有大量的注释,就算看不懂也应该会改

from keras import layers
from keras import models
#设置文件目录

#训练集
trainDir ='H:/face_value_check/train_data/'

#验证集
valDir = 'H:/face_value_check/val_data/'

#创建模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3)))
#卷积层,输出空间的维数为32,也可以说是输出特征图的深度为32,提取信息的窗口大小(3,3),卷积核的大小也为(3,3)
#激活函数relu,输入图片大小(150,150,3)
model.add(layers.MaxPooling2D((2, 2)))
#池化层,窗口大小为(2,2),缩小特征图的尺寸
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
#扁平层,将多维的输入转化为一维的输出
model.add(layers.Dropout(rate=0.5))
#这个层是可以删掉的,主要用来防止过拟合,放着也没事
model.add(layers.Dense(512, activation='relu'))
#全连接层,将提取的特征组合,得出结果
model.add(layers.Dense(9, activation='softmax'))
#因为要得出九个结果所以最后要输出九个数

#设置损失函数,优化器,模型在训练和测试时的性能指标
from keras import optimizers

model.compile(loss='categorical_crossentropy',#因为是多标签分类,所以使用categorical_crossentropy
  optimizer=optimizers.RMSprop(lr=1e-4),#这里可以设置学习率
  metrics=['acc'])

#配置图片生成器
from keras.preprocessing.image import ImageDataGenerator
#将图片像素缩小为[0,1]之间的浮点数

#本次人民币面值特征比较明显,而且会摆的整整齐齐的让你识别,数据也比较多,所以不用数据增强
train_datagen = ImageDataGenerator(
    rescale=1./255)
    # rotation_range=40,#图像随机旋转的最大角度
    # width_shift_range=0.2,#图片在水平位置上偏移的最大百分比值
    # height_shift_range=0.2,#数值位置上
    # shear_range=0.2,#随机错位切换的角度
    # zoom_range=0.2,#图片随机缩放的范围
    # horizontal_flip=True)#随机将一半的图片进行水平翻转

#验证集的数据不能增强
val_datagen = ImageDataGenerator(rescale=1./255)

#创建图片生成器
train_generator = train_datagen.flow_from_directory(
 trainDir,#图片地址
 target_size=(150, 150),#将图片调整为(150,150)大小
 batch_size=20,#设置批量数据的大小为20
 class_mode='categorical')#设置返回标签的类型
val_generator = val_datagen.flow_from_directory(
 valDir,
 target_size=(150, 150),
 batch_size=20,
 class_mode='categorical')

#拟合模型
history = model.fit_generator(
  train_generator,
  steps_per_epoch=100,#迭代进入下一轮次需要抽取的批次
  epochs=30,#数据迭代的轮数
  validation_data=val_generator,
  validation_steps=50)#验证集用于评估的批次

#保存模型
model.save('face_value.h5')


#画出结果
import matplotlib.pyplot as plt

#history.history中就只有这四个值,分别是准确度,验证集准确度,损失,验证集损失
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)

#画两个图,分别是正确率和损失
#正确率
plt.figure(1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.savefig('acc1.png')
plt.show()
#验证损失
plt.figure(2)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.savefig('loss1.png')
plt.show()

代码解析

代码不难,只是比较多而已,模型是常用的卷积神经网络模型,内容主要如下:
Keras进行人民币面额识别(二)_第2张图片

输出结果

正确率:
Keras进行人民币面额识别(二)_第3张图片
损失:
Keras进行人民币面额识别(二)_第4张图片
在我看来,这个结果还是不错的,正确率已经非常接近100%了,我很满意,就没有再训练了,如果再次提高正确率,就把学习率弄小点,然后训练批次弄多点

你可能感兴趣的:(计算机视觉,python)