python怎么构建和部署字母识别系统
本篇内容介绍了"python怎么构建和部署字母识别系统"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
卷积神经网络
让我们从理解什么是卷积神经网络开始。卷积神经网络(CNN)是一种广泛应用于图像识别和分类的神经网络。
cnn是多层感知器的正则化版本。多层感知器通常是指全连接网络,即一层中的每个神经元都与下一层的所有神经元相连。
CNN由以下层组成:
卷积层:一个大小为3X3或5X5的"核"被传递到图像上,并计算原始像素值与内核中定义的权重的点积。然后,该矩阵通过一个激活函数"ReLu",该函数将矩阵中的每个负值转换为零。
池化层:"池化矩阵"的大小有2X2或4X4,通过池化减小矩阵的大小,从而只突出图像的重要特征。
共有两种类型的池操作:
最大池是一种池类型,池化矩阵中存在的最大值被放入最终矩阵中。
平均池(Average Pooling)是一种池类型,其中计算池化矩阵中所有值的平均值并将其放入最终矩阵中。
注意:CNN架构中可以有多个卷积层和池层的组合,以提高其性能。
全连接层:最后的矩阵被展平成一维向量。然后将该向量输入神经网络。最后,输出层是附加到图像上的不同标签(例如字母a、b、c)的概率列表。最高概率的标签是分类器的输出。
CNN实现
让我们通过导入Jupyter Notebook中的库开始实现,如下所示:
import numpy as npimport matplotlib.pyplot as pltfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.preprocessing import imageimport kerasfrom keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activationimport osimport pickle
然后,让我们从a到z导入包含图像的2个数据集,以训练和测试我们的模型。
train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)test_datagen = ImageDataGenerator(rescale = 1./255)train_generator = train_datagen.flow_from_directory( directory = 'Training', target_size = (32,32), batch_size = 32, class_mode = 'categorical')test_generator = test_datagen.flow_from_directory( directory = 'Testing', target_size = (32,32), batch_size = 32, class_mode = 'categorical')
ImageDataGenerator生成一批张量图像数据,通过使用rescale进行缩放,将0-255范围内的RGB系数转换为0到1之间的目标值。
shear_range用于随机应用剪切变换。
zoom_range用于在图片内部随机缩放。
horizontal_flip用于水平随机翻转一半图像。
然后我们使用**.flow_from_directory**从目录中逐个导入图像,并对其应用ImageDataGenerator。
然后,我们将图像从原始大小转换为目标大小,并声明batch大小,它是指在一次迭代中使用的训练示例的数量。
然后我们将class_mode设置为category,这表示我们有多个类(a到z)可以预测。
接下来我们构建我们的CNN架构。
model = Sequential()model.add(Conv2D(32, (3, 3), input_shape = (32,32,3), activation = 'relu'))model.add(MaxPooling2D(pool_size = (2, 2)))model.add(Conv2D(32, (3, 3), activation = 'relu'))model.add(MaxPooling2D(pool_size = (2, 2)))model.add(Flatten())model.add(Dense(units = 128, activation = 'relu'))model.add(Dense(units = 26, activation = 'softmax'))model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])model.summary()
我们首先创建一个Sequential模型,它允许我们使用.add函数逐层定义CNN架构。
我们首先在输入图像上添加一个带有32个3X3大小的滤波器(核)的卷积层,并将其通过"relu"激活函数。
然后我们使用大小为2X2的池执行MaxPooling操作。
然后再次重复这些层以提高模型的性能。
最后,我们将得到的矩阵展平并通过一个由128个节点组成的全连接层。然后将其连接到由26个节点组成的输出层,每个节点代表一个字母表。我们使用softmax激活将分数转换成一个正态化的概率分布,并选择概率最高的节点作为输出。
一旦我们的CNN架构被定义,我们就使用adam优化器编译模型。
最后,我们对模型进行训练。
model.fit_generator(train_generator, steps_per_epoch = 16, epochs = 3, validation_data = test_generator, validation_steps = 16)
模型训练后的准确率为:93.42%
现在让我们来测试我们的模型。但是在我们这样做之前,我们需要定义一个函数,它给我们与结果相关联的字母表。
def get_result(result): if result[0][0] == 1: return('a') elif result[0][1] == 1: return ('b') elif result[0][2] == 1: return ('c') elif result[0][3] == 1: return ('d') elif result[0][4] == 1: return ('e') elif result[0][5] == 1: return ('f') elif result[0][6] == 1: return ('g') elif result[0][7] == 1: return ('h') elif result[0][8] == 1: return ('i') elif result[0][9] == 1: return ('j') elif result[0][10] == 1: return ('k') elif result[0][11] == 1: return ('l') elif result[0][12] == 1: return ('m') elif result[0][13] == 1: return ('n') elif result[0][14] == 1: return ('o') elif result[0][15] == 1: return ('p') elif result[0][16] == 1: return ('q') elif result[0][17] == 1: return ('r') elif result[0][18] == 1: return ('s') elif result[0][19] == 1: return ('t') elif result[0][20] == 1: return ('u') elif result[0][21] == 1: return ('v') elif result[0][22] == 1: return ('w') elif result[0][23] == 1: return ('x') elif result[0][24] == 1: return ('y') elif result[0][25] == 1: return ('z')
最后,让我们测试一下我们的模型:
filename = r'Testing\e\25.png'test_image = image.load_img(filename, target_size = (32,32))plt.imshow(test_image)test_image = image.img_to_array(test_image)test_image = np.expand_dims(test_image, axis = 0)result = model.predict(test_image)result = get_result(result)print ('Predicted Alphabet is: {}'.format(result))
该模型正确地预测了输入图像的字母,结果为"e"。
Anvil集成
Anvil是一个允许我们使用python构建全栈web应用程序的平台。它使我们更容易将机器学习模型从Jupyter Notebook转换成web应用程序。
让我们首先在anvil上创建一个帐户。完成后,用material design创建一个新的空白应用程序。
查看此链接,了解如何使用anvil的逐步教程:https://anvil.works/learn
右边的工具箱包含所有可以拖到网站上的组件。
所需组件:
2个标签(标题和子标题)
图像(显示输入图像)
FileLoader(上传输入图像)
突出显示按钮(用于预测结果)
标签(查看结果)
拖放这些组件并根据你的要求排列它们。
要添加标题和副标题,请在右侧的"属性"部分选择标签和,然后转到名为"文本"的选项,如下所示(以红色突出显示),然后键入标题/副标题。
完成用户界面后,进入上面所示的代码部分(以绿色突出显示)并创建一个新函数,如下所示
def primary_color_1_click(self, **event_args): file = self.file_loader_1.file self.image_1.source = file result = anvil.server.call('model_run',file) self.label_3.text = result pass
当我们按下"PREDICT"按钮时,将执行此函数。它将获取从文件加载程序上传的输入图像并将其传递到Jupyter Notebook的"model_run"函数。此函数将返回预测字母。
现在要做的就是把我们的anvil网站连接到Jupyter Notebook。
这需要执行以下两个步骤:
导入Anvil上行链路(uplink)密钥:单击设置按钮,然后单击上行链路,单击启用上行链路密钥并复制密钥。
在Jupyter Notebook内粘贴以下内容:
import anvil.serverimport anvil.mediaanvil.server.connect("paste your anvil uplink key here")
创建一个"model_run"函数来预测上传到网站中的图像。
@anvil.server.callabledef model_run(path): with anvil.media.TempFile(path) as filename: test_image = image.load_img(filename, target_size = (32,32)) test_image = image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis = 0) result = model.predict(test_image) result = get_result(result) return ('Predicted Alphabet is: {}'.format(result))
现在你可以回到anvil,点击run按钮,字母识别系统就完全完成了。
"python怎么构建和部署字母识别系统"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!