图像识别技术解析:手写数字识别(二)

        在计算机视觉(CV)运用方面使用的主流技术之一是卷积网络(CNN),本文通过从一篇经典的论文构建一个卷积网络模型,然后使用手写数字识别的程序来对比测试模型预测能力并分析结果。

一、关于卷积网络

首先看一下这篇关于卷积网络的经典论文:

图像识别技术解析:手写数字识别(二)_第1张图片

在这篇论文中提到了LeNet-5的卷积神经网络的架构,在下面的架构图中,最左边是输入(这里举的例子是一个尺寸为32x32的英文字母A,依次通过卷积层,池化层,卷积层,池化层,最后通过全连接层输出预测结果)。

图像识别技术解析:手写数字识别(二)_第2张图片

卷积层的作用就是从输入中提取特征从而构建特征图,而Subsampling(亚采样)可以用来减少特征图的尺寸。接下来就是根据这样一个架构图构建一个卷积模型,用于手写数字识别程序来预测用户输入的数字是什么,并且和基于随机森林算法的模型的预测结果进行简单的对比分析。

二、训练数据准备

通过手写数字前端页面输入数字来生成模型训练需要的数据集,为了方便两种模型预测结果的对比分析,在前端输入时会尽量书写规范,以下就是新建数据集中数字“5”的图片打印出来的效果(原图片的分辨率为280x280,这里缩小为28x28的尺寸):

图像识别技术解析:手写数字识别(二)_第3张图片

按照数字0 – 9 通过前端页面手写输入的方式,合计生成了1200个左右的图片作为训练数据集(这里只是做demo演示用,所以数量不多):

三、使用卷积网络构建模型

根据上面论文中提到的LeNet-5的卷积神经网络的架构来构建模型,首先定义卷积层和池化层:

图像识别技术解析:手写数字识别(二)_第4张图片

其次定义3个全连接层:

定义正向传播过程:

图像识别技术解析:手写数字识别(二)_第5张图片

四、调用模型进行预测

继续使用前面构建的手写数字程序的前端,只是在后端把之前使用的随机森林算法构建的模型替换为使用卷积网络构建的模型,下面是加载模型的过程:

model.load_state_dict(state_dict=torch.load(f="../saved_models/model_epoch_4_train_0.99672_test_0.99671.mod", map_location="cpu"))

以下是方法predict()中调用模型进行预测的过程,可以进行批量预测:

图像识别技术解析:手写数字识别(二)_第6张图片

最后把预测结果返回给前端:

图像识别技术解析:手写数字识别(二)_第7张图片

为了能直观比较两个模型的预测效果,可以在后端的predict方法中同时调用卷积模型和随机森林模型。

把前端页面改造一下,便于同时输出两个模型的预测结果,测试过程如下:

首先输入数字“6”,看起还比较规范,但是从预测结果看,卷积模型准确结果正确,而随机森林模型则预测为“1”:

图像识别技术解析:手写数字识别(二)_第8张图片

再来看个例子,下面输入的数字“4”的位置有偏移(超出了画面设定的输入框),这时随机森林模型预测结果为“0”,而卷积模型则正确预测出了“4”:

图像识别技术解析:手写数字识别(二)_第9张图片

五、总结

从这个手写数字的小程序的测试可以看出机器学习算法的局限性,而基于深度学习的卷积网络算法更能适应复杂多变的环境,当然这里只是在小数据集上使用经典的LeNet进行的一个简单的对比测试而已。

你可能感兴趣的:(AI,cnn,计算机视觉,深度学习)