关于人工智能:构建和部署字母识别系统

作者|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 np
import matplotlib.pyplot as plt
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import keras
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Activation
import os
import 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.server
import anvil.media
anvil.server.connect("paste your anvil uplink key here")
  1. 创立一个“model_run”函数来预测上传到网站中的图像。

    @anvil.server.callable
    def 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/

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理