项目介绍

图像识别在各行各业都得到了广泛地应用。医学影像、智能交通等领域伴随着图像识别技术的发展,出现在人们眼前。图像识别技术的应用场景之一,手写体数字识别技术,也一直在不断地发展前进。传统数字识别技术,依靠人工参与数字特征提取,识别的精度较低、速度慢。如果进一步优化手写体数字识别的精度和速度,那么工作效率就会得到极大地改善。使用深度学习技术提取图像特征不需要人工参与,而且具有更快的识别速度与更高的精度。本文使用深度学习技术,识别图像中的四则运算内容并加以判断批改,减轻了教师、家长批改作业的负担。

项目内容

制作数据集

本项目基于MNIST数据集,同时又扩充了“+、-、x、/、=”这五种识别对象的数据。在数据扩充时,可采用keras.preprocessing.image中的ImageDataGenerator模块进行数据集的扩充。

def ImageGenerate(soucrce_path,new_path,pre_name,num):
    datagen = ImageDataGenerator(rotation_range=20,
                                width_shift_range=0.2,
                                height_shift_range=0.2,
                                shear_range=0.2,
                                zoom_range=0.2,
                                horizontal_flip=True,
                                fill_mode='nearest')
    img = load_img(soucrce_path)
    x = img_to_array(img)
    x = x.reshape(((1,)+x.shape))
    i=0 
    for batch in datagen.flow(x, batch_size=1,save_to_dir=new_path, save_prefix=pre_name, save_format='png'):
        i += 1
        if i>num:
            break

数据预处理

此过程主要包括图像灰度化、反相二值化、图像定位与分割、归一化处理等。


定义模型

定义卷积神经网络模型。

def model_conv():
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(15, activation='softmax'))
    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])
    return model

训练模型

经过五次迭代训练后,识别正确率为99.67%。

搭建系统

系统通过Django开发框架搭建web系统。


项目总结

  • 后续系统可采用Keras.js或者Tensorflow.js进行数据处理与模型搭建,客户端不需要再将图像传入服务端,而是在客户端直接进行图像识别处理与结果显示,减轻了服务端的压力,同时也加快了整个四则运算图像系统自动批改的速度。
  • 在数据预处理阶段,可采用更好的方法进行图像的定位与分割,提高识别准确率。