Научная статья на тему 'СОЗДАНИЕ НЕЙРОННОЙ СЕТИ И ИНТЕРФЕЙСА ВЗАИМОДЕЙСТВИЯ ДЛЯ РАСПОЗНАВАНИЯ РУКОПИСНЫХ СИМВОЛОВ'

СОЗДАНИЕ НЕЙРОННОЙ СЕТИ И ИНТЕРФЕЙСА ВЗАИМОДЕЙСТВИЯ ДЛЯ РАСПОЗНАВАНИЯ РУКОПИСНЫХ СИМВОЛОВ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
445
21
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
НЕЙРОННЫЕ СЕТИ / ИСКУССТВЕННЫЙ НЕЙРОН / МАШИННОЕ ЗРЕНИЕ / РАСПОЗНАВАНИЕ СИМВОЛОВ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Маршалко Д.А.

Рассматривается задача разработки нейронной сети для распознавания написанных от руки цифр и букв русского и английского алфавита. Представлена краткая теория нейронных сетей, рассмотрен принцип работы искусственного нейрона, а также его структура. Разработан интерфейс, алгоритм и код программы и нейросети для распознавания символов записанных в отведенную для них область. В программе представлена возможность дообучения нейросети, а также переобучения ее на другие символы. Проведено тестирование программы.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Маршалко Д.А.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

CREATING A NEURAL NETWORK AND INTERFACE FOR HANDWRITING RECOGNITION

The task of developing a neural network for recognition of hand-written numbers and letters of the Russian and English alphabet is considered. A brief theory of neural networks is presented, the principle of operation of artificial neuron, as well as its structure are considered. An interface, algorithm and code of the program and neural network have been developed for recognition of characters recorded in the area reserved for them. The program presents the possibility of additional training of the neural network, as well as re-training of it to other symbols. The created program has been tested.

Текст научной работы на тему «СОЗДАНИЕ НЕЙРОННОЙ СЕТИ И ИНТЕРФЕЙСА ВЗАИМОДЕЙСТВИЯ ДЛЯ РАСПОЗНАВАНИЯ РУКОПИСНЫХ СИМВОЛОВ»

УДК 004.032

СОЗДАНИЕ НЕЙРОННОЙ СЕТИ И ИНТЕРФЕЙСА ВЗАИМОДЕЙСТВИЯ ДЛЯ РАСПОЗНАВАНИЯ РУКОПИСНЫХ СИМВОЛОВ

Д.А. Маршалко

ФГБОУ ВО «Брянский государственный университет имени академика И.Г. Петровского»

Рассматривается задача разработки нейронной сети для распознавания написанных от руки цифр и букв русского и английского алфавита. Представлена краткая теория нейронных сетей, рассмотрен принцип работы искусственного нейрона, а также его структура. Разработан интерфейс, алгоритм и код программы и нейросети для распознавания символов записанных в отведенную для них область. В программе представлена возможность дообучения нейросети, а также переобучения ее на другие символы. Проведено тестирование программы.

Ключевые слова: нейронные сети, искусственный нейрон, машинное зрение, распознавание символов.

В последние десятилетия в мире бурно развивается новая прикладная область математики, специализирующаяся на искусственных нейронных сетях (ИНС). В то время как на западе применение ИНС уже достаточно обширно, российских фирм, использующие ИНС в практических целях, немного. Термин «нейронный сети» сформировался к середине 50-х годов XX века. Основные результаты в этой области связаны с именами У. Маккалоха, Д. Хебба, Ф. Розенблатта, М. Минского, Дж. Хопфилда [2].

Искусственный нейрон (нейрон) является основой любой нейросети.

Искусственный нейрон - это математическая функция, задуманная как модель биологических нейронов. Каждый нейрон характеризуется своим текущим состоянием по аналогии с нервными клетками мозга, которые могут быть возбуждены и заторможены. Обычно каждый вход взвешивается отдельно, и сумма передается через нелинейную функцию, известную как функция активации [1].

Нейрон, имеет группу входов и выходов, которые соединены с другими нейронами нейросети [4].

Общий вид нейрона представлен на рисунке 1. Каждому входу нейрона присваивается вес Wi, У) - сигнал, приходящий от нейрона) к нейрону к, sk - скалярное произведение вектора входных сигналов и вектора весов, /к - функция возбуждения, ук - выходной сигнал к.

к

W

0,

Рис. 1. Искусственный нейрон

В общих реализациях ИНС сигнал при связи между искусственными нейронами является вещественным числом, а выход каждого искусственного нейрона вычисляется некоторой нелинейной функцией y = f (5), зависящей от суммы его входов [5].

Разработку приложения следует начать с создания интерфейса, используя для этого встроенный в Visual Studio редактор форм.

Используя стандартную панель элементов данной среды разработки, расположим на форме объекты (button, panel, menu и др.) и с помощью панели свойств настроим их свойства (рис. 2). В итоге получится интерфейс, представленный в макетах.

Рис. 2. Интерфейс программы

Однако после запуска приложение на данном этапе не будет реагировать на действия пользователя. Для решения этой проблеммы требуется привязать к каждому обьекту события, которые будут выполняться при определенных действиях пользователя. Для кнопок нам потребуются события нажатия, а для области рисования - события нажатия, отжатия левой кнопки мыши и событие движения мыши.

События реализуются посредством создания процедур привязывания их к объектам и запуску их при определенных условиях (нажатия кнопки, щелчка мыши и т.д.). Так как количество объектов в программе велико, не будем рассмативать все процедуры, а сгруппируем их.

Процедуры данной группы будут отличатся только несколькими цифрами в индексах и различными названиями объектов, вызываемыми из ресурсов программы.

Каждому символу, который может распознавать нейросеть, соответствует один индекс: символам 0-9 соответствуют индексы от 0 до 9, буквам русского алфавита соответствуют индексы от 10 до 42, а буквам английского алфавита соответствуют индексы от 43 до 73.

Областью для рисования на форме является объект панель, для того чтобы рисовать на нем следует привязать к нему 3 события: нажатия, отжатия и движения мыши. Для этого создадим 3 процедуры в коде и с помощью дизайнера форм привяжем к панели данные процедуры в роли событий.

Функция нажатия срабатывает при нажатии левой кнопки мыши: при ее выполнении переменная сх1, определяющая нажата ли клавиша мыши при движении, переходит в состояние true, создается объект Pen черного цвета, и рисуется закрашенный эллипс в 6 пикселей (листинг 1).

Листинг 1

private void panel1_MouseDown(object sender, MouseEventArgs e) {cx1 = true,'Pen p = new Pen(Color.Black, 3);

g.DrawEllipse(p, e.X, e.Y, 1, 1); g1.DrawEllipse(p, e.X, e.Y, 1, 1); }

Функция движения мыши выполняет те же действия, что и предыдущая, при каждом движении мыши по панели, но с одним условием: переменная сх1 должна иметь значение true (листинг 2).

Листинг 2

private void panel1_MouseMove(object sender, MouseEventArgs e) {if (cx1 == true) { Pen p = new Pen(Color.Black, 3); g.DrawEllipse(p, e.X, e.Y, 1, 1); g1.DrawEllipse(p, e.X, e.Y, 1, 1); } }

Функция отжатия кнопки, расположенной на панели panel1, присваивает значение переменной cx1=false (листинг 3).

Листинг 3

private void panel1_MouseUp(object sender, MouseEventArgs e) {cx1 = false; }

Кнопке «Очистить» соответствует код, который обновляет панель и закрашивает ее белым цветом, стирая все нарисованное (листинг 4).

Листинг 4

private void button3_Click(object sender, EventArgs e) {panel1.Invalidate();panel1.Update();g.Clear(Color.White);}

Чтобы было с чем сравнивать нарисованные символы, обучим нейросеть. При нажатии кнопки «Обучить нейросеть», если label4 пуста, будет вызван диалог выбора папки с картинками, иначе начнется загрузка из определенной папки в поток teachThread с использованием структуры нейросети teacher. Код кнопки представлен в листинге 5.

Листинг 5

private void button1_Click(object sender, EventArgs e) { try { if (label4.Text == "")

{ using (var folder = new FolderBrowserDialog { Description = RU.Form1_button1_Click_Выберете_папку_с_картинками_для_обучения }){ if (folder.ShowDialog() == DialogResult.OK)

{ label4.Text = folder.SelectedPath; } } }

if (!String.IsNullOrEmpty(label4.Text) &&!String.IsNullOr-WhiteSpace(label4.Text))

{ teachThread=new Thread(() => teacher.Teach(

LoadImage(label4.Text, 3), (Int32)numericUpDown1.Value)); _teachThread.Start(); }}

catch (Exception ex) {MessageBox.Show(ex.ToString());}}

Картинки загружаются из стандартной директории или из указанной пользователем папки и переводятся в массивы данных с помощью процедуры, описанной в листинге 6.

Листинг 6

private ImageData[] LoadImage(String path, Int32 count){ var list = Directory.GetFiles(path, "*.jpg"); var images = new ImageData[list.GetLength(0)]; for (var s = 0; s < list.GetLength(0); s++) {images[s] = new ImageData { Data = ImageToArray(new Bitmap(list[s])),Class = Con-vert.ToInt32((Path.GetFileNameWithoutExtension(list[s]).Sub-string(0, count))) }; } return images; }

Нейросеть обучается посредством использования «учителя». При загрузке картинок нам известны как входные данные (картинки), так и соответствующие им выходные (листинг 7).

Листинг 7

public class Teacher : ITeacher

{ private readonly IPerceptron _perceptron public Teacher(IPerceptron perceptron) { _perceptron = perceptron; } public void Teach(ICollection<ImageData> images,Int32 n) {_perceptron.InitWeights(10); while (n—> 0) {foreach (var item in images)

{var y = GetOutVector(Convert.ToInt32(item.Class)); _perceptron.Teach(item.Data, y);}}}

private Int32[] GetOutVector(Int32 n) {var y = new Int32[_perceptron.GetNeuronCount]; if (_perceptron.GetNeuronCount > n) y[n] = 1,-return y;}}

Персептрон представим отдельным классом, в котором будет реализованы слои нейронов, указано их количество и обозначена реализация работы с ними.

В листинге 8 описана реализация персептрона данной нейросети.

Листинг 8

public class Perceptron : IPerceptron {readonly IList<INeuron> _neurons; // слой нейронов readonly Int32 _neuronCount; readonly Int32 _m; public Perceptron(Int32 neuronCount, Int32 m) { _neuronCount = neuronCount; _m = m; _neurons = new Neuron[neuronCount]; for (var j = 0; j < _neurons.Count; j++) {_neurons[j] = new Neuron(m); }}

public Int32[] Recognize(IList<Int32> x) { var y = new Int32[_neurons.Count]; for (var j = 0; j < _neurons.Count; j++)

{ y[j] = _neurons[j].Transfer(x); }return y;}

public void InitWeights(Int32 max) {foreach (var neuron in _neurons) {neuron.InitWeights(max); }}

public void Teach(IList<Int32> x, IList<Int32> y)

{const Int32 v = 1; var t = Recognize(x); while (!VectorE-qual(t, y)) {for (var j = 0; j < _neurons.Count; j++)

{var d = y[j] - t[j]; _neurons[j].ChangeWeights(v, d, x);}t = Recognize(x); } } private Boolean VectorEqual(IList<Int32> a, IList<Int32> b) {if (a.Count != b.Count) return false;

return !a.Where((t, i) => t != b[i]).Any();}

public Int32 GetNeuronCount {get { return _neuronCount;}}

public Int32 GetM {get { return _m; }}}

Нейрон представляет собой узлы нейронной сети, он имеет вес, который меняется в процессе обучения в зависимости от соответствия входных и выходных данных. За процесс создания первичных случайных весов синапсов отвечает процедура InitWeights, процесс изменения веса описан в процедуре ChangeWeights. IList<Int32> является массивом содержащим веса синапсов.

Реализация нейрона представлена в листинге 9.

Листинг 9

internal class Neuron : INeuron

{ private readonly IList<Int32> _w; // веса синапсов private const Int32 S = 50; // порог internal Neuron(Int32 m) { _w = new Int32[m]; }

public Int32 Transfer(IList<Int32> x) { return Activator(Adder(x)); }

public void InitWeights(Int32 n) { var rand = new Random();

for (var i = 0; i < _w.Count; i++) { _w[i] = rand.Next(n); } }

public void ChangeWeights(Int32 v, Int32 d,IList<Int32> x) { for (var i = 0; i < _w.Count; i++) { _w[i] += v * d * x[i]; } }

private int Adder(IEnumerable<Int32> x) { return x.Select((t, i) => t*_w[i]).Sum();} private Int32 Activator(Int32 nec) { return nec >= S ? 1 : 0; } }

После того как в поле для рисования пользователь нарисует символ и нажмет кнопку готово, будет выполнена процедура из листинга 10. В ходе выполнения процедуры, будет проверен режим работы (обучение буквам, обучение цифрам, проверка знаний), а символ, нарисованный пользователем, будет отправлен на распознавание в персептрон.

После распознавания нейросеть выдаст индекс распознанного символа. Затем, сравнивая индекс распознанного символа и индекс искомый, выдается сообщение о правильности нарисованного символа.

Листинг 10

private void button2_Click(object sender, EventArgs e) {Size size = new Size(64, 64);// Bitmap newBitmap = new Bitmap(bmp, size); try

{var output = _perceptron.Recognize(ImageToArray(newBitmap)); for (var i = 0; i < output.GetLength(0); i++) if (output[i] != 0)

label2.Text = Convert.ToString( i); } catch (Exception ex) {MessageBox.Show(ex.ToString());} if (Convert.ToInt32(label2.Text) < 0) { label5.Text = "Ошибка распознавания"; } else if (Convert.ToInt32(label2.Text) < 10) {label5.Text = "Результат: " + Convert.ToInt32(label2.Text); else {if (Convert.ToInt32(label2.Text) < 43) {char symb;

symb = Convert.ToChar(192+Convert.ToInt32(label2.Text)-10); label5.Text = "Результат: " + symb; } else { char symb; symb = Convert.ToChar(65 + Convert.ToInt32(label2.Text) - 42);

label5.Text = "Результат: " + symb;} } }

Так как, процесс обучения занимает длительное время, следует после обучения записать данные нейросети в базу данных и загружать при запуске. Код представлен в листинге 11.

Листинг 11

private void saveDataBasesToolStripMenuItem_Click(object sender, EventArgs e){ try {

using (var save = new SaveFileDialog { Title = Resources.Form1_saveDataBasesToolStripMenu-Item_Click_Выберете_базу_данных, Filter = "База Данных|*.IIDB" }) { if (save.ShowDialog() == DialogResult.OK) { using (var str = File.Create(save.FileName)) { var bf = new BinaryFormatter(); bf.Serialize(str, new SaveStructure

{ Perceptron = _perceptron, ImageHeight = _imageHeight, ImageWidth=_imageWidth, NeuronCount = _neuronCount});}}}} catch (Exception ex) {MessageBox.Show(ex.ToString());} private void loadDataBasesToolStripMenuItem_Click(object sender, EventArgs e) { try

{ using (var open = new OpenFileDialog { Title = Re-sources.Form1_saveDataBasesToolStripMenu-

Item_Click_Выберете_базу_данных, Filter = "База Данных|*.IIDB" }) { if (open.ShowDialog() == DialogResult.OK) { using (var str = File.OpenRead(open.FileName)) { var bf = new BinaryFormatter(); var temp = (SaveStructure)bf.Deserialize(str); _perceptron = temp.Perceptron; _teacher = new Teacher(_perceptron); _imageHeight = temp.ImageHeight; _imageWidth = temp.ImageWidth; _neuronCount = temp.NeuronCount; } } } }

catch (Exception ex) {MessageBox.Show(ex.ToString());}}

Для ускорения процесса следует догрузить уже готовую базу при старте программы. Для этого добавим код загрузки базы в процедуру запускающуюся при старте формы. Реализация данного процесса представлена в листинге 12.

Листинг 12

private void Form1_Load(object sender, EventArgs e)

{ using (var str = File.OpenRead("base.IIDB")){ var bf = new BinaryFormatter();

var temp = (SaveStructure)bf.Deserialize(str); _perceptron = temp.Perceptron; _teacher = new Teacher(_perceptron); _imageHeight = temp.ImageHeight; _imageWidth = temp.ImageWidth; _neuronCount = temp.NeuronCount; }}

Создав графический интерфейс и привязав к нему процедуры, описанные выше, стоит запустить процесс обучения нейросети, после которого программу следует протестировать перед применением.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Для проверки работы программы и нейронной сети нарисуем любой символ в отведённое для этого поле и нажмём готово.

Рис. 3. Тестирование приложения

Проведя проверку работы программы (рис. 3), заметим, что нейронная сеть правильно распознает символы при должном уровне ее обучения.

При некоторой доработке данное приложение может хорошо себя показать в кабинетах логопедов, при домашнем персональном обучении, а также в школах. В последующем можно расширить функционал путём улучшения интерфейса и повышения точности распознавания символов.

Список литературы

1. Барский А.Б. Логические нейронные сети. - М.: БИНОМ., 2012. - 352 с.

2. Галушкин А.И. Нейронные сети: основы теории. - М.: РиС, 2015. - 496 с.

3. Гелиг А.Х., Матвеев А.С. Введение в математическую теорию обучаемых распознающих систем и нейронных сетей. - М.: Изд. СПбГУ, 2017. - 224 с.

4. Каллан Р. Нейронные сети. Краткий справочник, М.: ИД «Вильямс», 2017. - 288с.

5. Минский М., Пейперт С. Персептроны. - М.: Мир, 2015. - 262 с.

6. Редько В.Г. Эволюция, нейронные сети, интеллект: Модели и концепции эволюционной кибернетики. - М: РГГУ, 2017. - 224 с.

7. Редько В.Г. Подходы к моделированию мышления. - СПб: Ленанд, 2016. - 392 с.

Сведения об авторах

Маршалко Дмитрий Александрович - магистрант кафедры информатики и прикладной математики, направление «Прикладная математика и информатика», направленность «Интернет-технологии», ФГБОУ ВО «Брянский государственный университет им. академика И.Г. Петровского», e-mail: dima.marshalko@yandex.ru.

CREATING A NEURAL NETWORK AND INTERFACE FOR HANDWRITING RECOGNITION

DA. Marshalko

Bryansk State University after Academician I.G. Petrovsky

The task of developing a neural network for recognition of hand-written numbers and letters of the Russian and English alphabet is considered. A brief theory of neural networks is presented, the principle of operation of artifitial neuron, as well as its structure are considered. An interface, algorithm and code of the program and neural network have been developed for recognition of characters recorded in the area reserved for them. The program presents the possibility of additional training of the neural network, as well as re-training of it to other symbols. The created program has been tested.

Keywords: neural networks, artificial neuron, machine vision, character recognition.

References

1. Barsky A.B. Logical neural networks. - M.: BINOM., 2012. - 352 p.

2. Galushkin A.I. Neural Networks: Foundations of Theory. - M.: RiS, 2015. - 496 p.

3. Gelig A.H., Matveev A.S. An introduction to the mathematical theory of trainee recognition systems and neural networks. - StP.: Publishing House of StPSU, 2017. - 224 p.

4. Callan R. Neural Networks. Short reference book. - M.: Williams I. 2017. - 288 p.

5. Minsky M., Peipert S. Perseptrons. M.: World, 2015. - 262 p.

6. Redko V.G. Evolution, neural networks, intelligence: Models and concepts of evolutionary cybernetics. - M: WGSU, 2017. - 224 p.

7. Redko V.G. Approaches to Thinking Modeling. - StP: Lenand, 2016. - 392 p.

About author

Marshalko D.A. - Student, Bryansk State University after Academician I.G. Petrovsky, e-mail: dima.marshalko@yandex.ru.

i Надоели баннеры? Вы всегда можете отключить рекламу.