作者|Sakshi Butala
编译|VK
起源|Towards Data Science
在本文中,我将向你展现如何应用卷积神经网络(CNNs)构建字母识别系统,并应用anvil.works部署。在本文的最初,你将可能创立下面所示零碎。
目录
- 卷积神经网络
- CNN施行
- Anvil集成
卷积神经网络
让咱们从了解什么是卷积神经网络开始。卷积神经网络(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个数据集,以训练和测试咱们的模型。你能够从上面链接的GitHub存储库下载数据集。
链接:https://github.com/sakshibuta...
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按钮,字母识别系统就齐全实现了。
你能够在我的GitHub存储库中找到源代码和数据集:https://github.com/sakshibuta...。
援用
- Convolutional Neural Network Tutorial: From Basic to Advanced - MissingLink.ai
- CS 230 - Convolutional Neural Networks Cheatsheet
- Keras documentation: Image data preprocessing
原文链接:https://towardsdatascience.co...
欢送关注磐创AI博客站:
http://panchuang.net/
sklearn机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/