Введение
Каждый день разработчики усердно работают над машинами, чтобы сделать их более умными и интеллектуальными, используя методы машинного обучения и глубокого обучения, чтобы они могли выполнять задачи, аналогичные людям. С помощью этих методов можно уменьшить человеческие усилия в распознавании, обучении, прогнозировании и во многих других областях.
Способность компьютеров распознавать рукописные цифры человека известна как распознавание рукописных цифр из таких источников, как бумажные документы, изображения, сенсорные экраны и т. Д.
В этой статье вы узнаете, как разработать модель глубокого обучения для достижения высокой производительности в задаче распознавания рукописных цифр с использованием набора данных MNIST и создать приложение с графическим интерфейсом на основе Tkinter, где вы можете нарисовать цифры (как одиночные, так и множественные) и сразу распознать их, нарисовав ограничивающую рамку вокруг каждой цифры.
Заявление о проблеме
Человеку легко выполнить задачу точно, многократно выполняя ее и запоминая в следующий раз. Человеческий мозг может легко обрабатывать и анализировать изображения. Также узнавайте различные элементы, присутствующие на изображениях.
Проблема распознавания рукописных цифр в основном вызвана различиями в стиле письма каждого человека. Таким образом, машине нелегко распознавать рукописные цифры так, как это делают люди. Следовательно, надежное извлечение признаков очень важно для повышения производительности машин.
Набор данных MNIST
Набор данных MNIST (модифицированный национальный институт стандартов и технологий) - это большой набор данных, состоящий из рукописных цифр, который широко используется для обучения и тестирования в области машинного обучения и глубокого обучения.
Набор данных MNIST содержит 60 000 обучающих изображений и 10 000 тестовых изображений рукописных цифр от нуля до девяти (от 0 до 9). Итак, набор данных MNIST состоит из 10 различных классов. Каждое изображение представлено в виде матрицы 28 × 28, где каждая ячейка содержит значение пикселя в градациях серого.
Почему глубокое обучение?
Глубокое обучение - это класс машинного обучения, который использует несколько уровней для постепенного извлечения функций более высокого уровня из входных данных. Следовательно, глубокое обучение сокращает задачу разработки нового средства извлечения функций для каждой проблемы. Эта характеристика глубокого обучения - важный шаг впереди традиционного машинного обучения.
Большинство современных моделей глубокого обучения основаны на искусственных нейронных сетях, в частности, на сверточных нейронных сетях (CNN), которые мы будем использовать в этой статье.
Шаги по реализации приложения с графическим интерфейсом для распознавания рукописных цифр CNN:
- Импортируйте библиотеки и загрузите набор данных MNIST.
- Предварительная обработка и нормализация данных
- Создать модель
- Обучите модель
- Оцените модель
- Создайте графический интерфейс для предсказания цифр
Проект требует, чтобы вы имели базовые знания программирования Python, OpenCV, глубокого обучения с библиотекой Keras и библиотекой Tkinter для создания графического интерфейса.
1. Импортируйте библиотеки и загрузите набор данных MNIST
Во-первых, мы собираемся импортировать библиотеки, необходимые для обучения нашей модели.
Для загрузки набора данных библиотека глубокого обучения Keras предоставляет удобный метод загрузки набора данных MNIST. Таким образом, мы можем легко импортировать набор данных, вызвав функцию mnist.load_data ().
Лучше визуализировать набор данных перед его использованием. Здесь мы строим шесть образцов обучающего набора данных MNIST для визуализации.
2. Предварительная обработка и нормализация данных
Мы знаем, что все изображения (набор данных) представлены в виде матрицы 28 × 28, содержащей значения пикселей в градациях серого. В соответствии с этим размер обучающих данных равен (60000,28,28), но для модели CNN потребуется еще одно измерение, поэтому нам нужно обработать данные путем преобразования матрицы в форму (60000,28,28,1).
при использовании моделей нейронных сетей рекомендуется выполнить некоторое масштабирование входных значений, чтобы нормализовать значения пикселей в диапазоне от 0 до 1, разделив каждое значение на максимальное значение (Примечание: значения пикселей имеют шкалу серого от 0 до 255).
3. Создайте модель.
Теперь мы создадим модель CNN с двойным сверточным слоем того же размера 3 × 3, максимальным количеством слоев объединения и полностью связанными слоями. Слой исключения используется для деактивации некоторых нейронов для уменьшения переобучения. Наконец, выходной слой имеет 10 нейронов для 10 классов. Затем мы скомпилируем модель с оптимизатором ADAM.
4. Обучите модель.
Функция Keras model.fit () принимает данные обучения, данные проверки, эпохи и размер пакета для обучения модели. Обучение модели занимает некоторое время в зависимости от вашей рабочей среды (ЦП или ГП). После завершения мы сохраним модель в файле с именем «model.h5» для дальнейшего использования.
5. Оцените модель.
Чтобы оценить производительность нашей модели, у нас есть 10 000 тестовых изображений рукописных цифр. Набор данных MNIST хорошо сбалансирован, поэтому мы можем получить точность около 99% (т.е. ошибка CNN <1%).
6. Создайте графический интерфейс для предсказания цифр.
Наконец, пришло время создать приложение с графическим интерфейсом пользователя с использованием Tkinter. Мы создадим новый файл для построения графического интерфейса.
Пакет tkinter - это стандартный интерфейс Python для набора инструментов Tk GUI. Это самый быстрый и простой способ создания приложений с графическим интерфейсом. Он предоставляет множество общих элементов графического интерфейса, таких как кнопки, меню и различные типы полей ввода и областей отображения.
Есть два основных метода:
- Tk()
- mainloop ()
Tk () - это метод, который мы используем для создания главного окна приложения, а mainloop () - это метод в главном окне, который мы выполняем, когда хотим запустить наше приложение.
Начнем с импорта модулей, которые нам нужны для приложения.
Здесь мы загружаем сохраненную модель для распознавания рукописной цифры, предоставляя путь к модели.
В блоке кода мы создаем корневое окно, которое является главным окном нашего приложения с заголовком «Приложение GUI для распознавания рукописных цифр».
В tkinter встроены разные классы виджетов, но мы будем использовать некоторые из них для создания нашего приложения:
- Холст - виджет для рисования графики. Его можно использовать для создания пользовательских виджетов, чтобы мы могли рисовать в нем все, что захотим. В нашем приложении мы будем использовать виджет для рисования цифры (как одиночной, так и множественной).
- Кнопка обычно отображается непосредственно на действие пользователя. В нашем приложении мы используем две кнопки с именами «Распознать цифру» и «Очистить виджет». когда пользователь нажимает кнопку, он запускает назначенные функции.
Tkinter предоставляет мощный механизм, позволяющий вам иметь дело с событиями и связывать с ними обработчики, используя метод привязки, который мы можем найти в каждом классе виджетов. События однозначно идентифицируются именем последовательности в строковом формате.
В нашем приложении мы будем использовать события «‹Button-1›» и «‹B1-Motion›».
Событие «‹Button-1›» сигнализирует, что была нажата левая кнопка мыши, когда курсор мыши находится над виджетом.
«‹B1-Motion›» указывает, что мышь перемещалась при нажатой левой кнопке.
Теперь мы выполняем метод mainloop () в главном окне, чтобы запустить наше приложение. Этот метод будет повторяться бесконечно, ожидая событий от пользователя, пока пользователь не выйдет из программы.
В этом блоке кода мы используем три функции:
- clear_widget ()
- activate_event ()
- рисовать линии()
Функция clear_widget () используется для очистки холста. Обратите внимание, что элементы, добавленные на холст, сохраняются, пока вы их не удалите. В нашем приложении мы будем использовать метод delete (), чтобы очистить предыдущие нарисованные цифры на холсте, чтобы мы могли нарисовать новую.
События могут поступать из различных источников, включая нажатия клавиш и операции мыши пользователем. Для каждого виджета вы можете привязать функции и методы Python к событиям.
В нашем приложении мы используем метод bind виджета Canvas для привязки функции activate_event () к событию с именем ‹Button-1›, а внутри этой функции обратного вызова мы связываем другую функцию, которая draw_lines () к событию ‹B1-Motion›.
Примечание. Мышь перемещается, при этом кнопка мыши 1 удерживается нажатой, а текущая позиция указателя мыши указывается в членах x и y объекта события, переданного в функцию обратного вызова.
Функция draw_lines () используется для рисования линии на холсте.
Следующий блок содержит единственную функцию под названием Recognize_Digit (). Функция довольно большая, поэтому для лучшего понимания я разделю ее на части.
В этом разделе мы будем использовать модуль ImageGrab для копирования содержимого экрана или буфера обмена в память изображений PIL (Python Imaging Library). По сути, это снимок экрана.
После создания снимка экрана мы воспользуемся методом кадрирования, который принимает четыре координаты в качестве входных данных и возвращает прямоугольную область из изображения (которое в данном случае является снимком), а затем мы будем save изображение с указанным именем в формате png.
В нашем приложении мы будем использовать OpenCV (компьютерное зрение с открытым исходным кодом).
OpenCV-Python - это библиотека привязок Python, предназначенная для решения проблем компьютерного зрения.
В этом разделе мы будем использовать OpenCV, чтобы найти контуры изображения, которое мы сохранили ранее. Контуры можно объяснить просто как кривую, соединяющую все непрерывные точки (вдоль границы), имеющие одинаковый цвет или интенсивность. Это полезный инструмент для обнаружения и распознавания объектов.
Для большей точности лучше использовать двоичные изображения, поэтому перед поиском контуров примените порог.
Это последний и последний раздел функции Recognize_Digit (). В этом разделе мы создаем ограничивающие рамки для контуров и извлекаем рентабельность инвестиций. После извлечения интересующей области мы предварительно обработаем (изменим размер, форму и нормализуем) изображение для поддержки ввода нашей модели. Теперь пора выполнить метод model.predict (), чтобы распознать рукописную цифру и нарисовать ограничивающую рамку вокруг каждой цифры, присутствующей на изображении, с прогнозируемым значением и процентом.
Скриншоты проекта
Резюме
В этой статье мы успешно создали приложение с графическим интерфейсом для распознавания рукописных цифр на Python на основе глубокого обучения CNN.
Мы обучили сверточную нейронную сеть, которая очень эффективна (ошибка CNN
Ресурсы
- https://www.wikipedia.org/
- https://keras.io
- https://docs.python.org/3/library/tkinter.html
- https://opencv.org
- https://pillow.readthedocs.io/
- https://machinelearningmastery.com/
- https://data-flair.training/blogs