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

5次阅读

共计 5407 个字符,预计需要花费 14 分钟才能阅读完成。

作者 |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/

正文完
 0