Автор|Сакши Бутала Компилировать|ВКонтакте Источник | К науке о данных
В этой статье я покажу вам, как создать систему распознавания букв с помощью сверточных нейронных сетей (CNN) и развернуть ее с помощью anvil.works. К концу этой статьи вы сможете создать систему, показанную выше.
содержание
-
Сверточная нейронная сеть
-
реализация CNN
-
Интеграция наковальни
Сверточная нейронная сеть
Давайте начнем с понимания того, что такое сверточная нейронная сеть. Сверточная нейронная сеть (CNN) — тип нейронной сети, широко используемый для распознавания и классификации изображений.
cnn — это регуляризованная версия многослойного персептрона. Многослойные персептроны обычно относятся к полносвязным сетям, т. е. каждый нейрон в одном слое связан со всеми нейронами в следующем слое.
CNN состоит из следующих слоев:
сверточный слой: на изображение передается «ядро» размером 3X3 или 5X5, и вычисляется скалярное произведение необработанных значений пикселей с весами, определенными в ядре. Затем эта матрица проходит через функцию активации «ReLu», которая преобразует каждое отрицательное значение в матрице в ноль.
объединяющий слой: Размер "объединяющей матрицы" 2X2 или 4X4.Размер матрицы уменьшается при объединении, так что выделяются только важные особенности изображения.
Существует два типа операций с пулом:
- максимальный пулэто тип объединения, при котором максимальное значение, присутствующее в матрице объединения, помещается в окончательную матрицу.
- средний пул(Среднее объединение) - это тип объединения, в котором среднее значение всех значений в объединенной матрице рассчитывается и помещается в конечную матрицу.
Примечание. В архитектуре 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
Затем давайте импортируем 2 набора данных, содержащих изображения от a до z, чтобы обучить и протестировать нашу модель. Вы можете загрузить набор данных из репозитория GitHub, ссылка на который приведена ниже.
Ссылка на сайт:GitHub.com/saakashbutaline…
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Сгенерируйте пакет данных тензорного изображения, масштабируйте с помощью масштабирования, чтобы преобразовать коэффициенты RGB в диапазоне 0–255 в целевые значения от 0 до 1.
shear_rangeИспользуется для случайного применения сдвиговых преобразований.
zoom_rangeИспользуется для случайного масштабирования внутри изображения.
horizontal_flipИспользуется для случайного отражения половины изображения по горизонтали.
Затем мы импортируем изображения по одному из каталога с помощью **.flow_from_directory** и применяем к нему ImageDataGenerator.
Затем мы конвертируем изображения из исходного размера в целевой размер и объявляем размер пакета, который представляет собой количество обучающих примеров, используемых в одной итерации.
Тогда мы будемclass_modeУстановите категорию, что означает, что у нас есть несколько классов (от 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модель, которая позволяет нам определять архитектуру CNN слой за слоем, используя функцию .add.
Сначала мы добавляем сверточный слой с 32 фильтрами (ядрами) размером 3X3 на входное изображение и пропускаем его через функцию активации «relu».
Затем мы выполняем операцию Maxpooling с пулом размера 2x2.
Затем эти слои повторяются для улучшения производительности модели.
Наконец, мы сглаживаем полученную матрицу и пропускаем ее через полносвязный слой, состоящий из 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 — это платформа, которая позволяет нам создавать полноценные веб-приложения с использованием Python. Это упрощает преобразование моделей машинного обучения из Jupyter Notebooks в веб-приложения.
Давайте сначала создадим учетную запись на наковальне. После этого создайте новое пустое приложение с дизайном материалов.
По этой ссылке вы найдете пошаговое руководство по использованию наковальни: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». Он возьмет входное изображение, загруженное из загрузчика файлов, и передаст его функции «model_run» Jupyter Notebook. Эта функция вернет предсказанную букву.
Все, что нам нужно сделать сейчас, это подключить наш веб-сайт наковальни к Jupyter Notebook.
Для этого необходимо выполнить следующие два шага:
- Импорт ключей восходящих каналов Anvil: нажмите кнопку «Настройки», затем «Входящие ссылки», нажмите «Включить ключи восходящих каналов» и скопируйте ключ.
Вставьте в блокнот Jupyter следующее:
import anvil.server
import anvil.media
anvil.server.connect("paste your anvil uplink key here")
-
Создайте функцию «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))
Теперь вы можете вернуться к наковальне, нажать кнопку запуска, и система распознавания букв полностью готова.
Вы можете найти исходный код и набор данных в моем репозитории GitHub:GitHub.com/saakashbutaline…
Цитировать
- Convolutional Neural Network Tutorial: From Basic to Advanced - MissingLink.ai
- CS 230 - Convolutional Neural Networks Cheatsheet
- Keras documentation: Image data preprocessing
Оригинальная ссылка:к data science.com/building - нажмите…
Добро пожаловать на сайт блога Panchuang AI:panchuang.net/
sklearn машинное обучение китайские официальные документы:sklearn123.com/
Добро пожаловать на станцию сводки ресурсов блога Panchuang:docs.panchuang.net/