作者|Sakshi Butala
编译|VK
起源|Towards Data Science

在本文中,我将向你展现如何应用卷积神经网络(CNNs)构建字母识别系统,并应用anvil.works部署。在本文的最初,你将可能创立下面所示零碎。

目录

  • 卷积神经网络
  • CNN施行
  • Anvil集成

卷积神经网络

让咱们从了解什么是卷积神经网络开始。卷积神经网络(CNN)是一种广泛应用于图像识别和分类的神经网络。

cnn是多层感知器的正则化版本。多层感知器通常是指全连贯网络,即一层中的每个神经元都与下一层的所有神经元相连。

CNN由以上层组成:

卷积层:一个大小为3X3或5X5的“核”被传递到图像上,并计算原始像素值与内核中定义的权重的点积。而后,该矩阵通过一个激活函数“ReLu”,该函数将矩阵中的每个负值转换为零。

池化层:“池化矩阵”的大小有2X2或4X4,通过池化减小矩阵的大小,从而只突出图像的重要特色。

共有两种类型的池操作:

  1. 最大池是一种池类型,池化矩阵中存在的最大值被放入最终矩阵中。
  2. 均匀池(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。

这须要执行以下两个步骤:

  1. 导入Anvil上行链路(uplink)密钥:单击设置按钮,而后单击上行链路,单击启用上行链路密钥并复制密钥。

在Jupyter Notebook内粘贴以下内容:

import anvil.serverimport anvil.mediaanvil.server.connect("paste your anvil uplink key here")
  1. 创立一个“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...。

援用

  1. Convolutional Neural Network Tutorial: From Basic to Advanced - MissingLink.ai
  2. CS 230 - Convolutional Neural Networks Cheatsheet
  3. Keras documentation: Image data preprocessing

原文链接:https://towardsdatascience.co...

欢送关注磐创AI博客站:
http://panchuang.net/

sklearn机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/