Пример распознавания цифр

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

В таком представлении следующий кусок картинки размером 5х5 пикселей представляется для ИНС как вектор 1х25, где первые пять значений вектора - первая строка картинки, вторые 5 значений - вторая строка и т.д.

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

Cоздаём картинки для обучения

Возьмём, например, цифры 1, 2, 3, 4 и создадим по 5 примеров написания этих цифр. Открываем пеинт, изменяем размер на 30х30 пикселей (чем больше размер картинки - тем сложнее задача для ИНС и дольше время обучения, но обязательно нужно чтобы все картинки были одинакового размера) и рисуем разные цифры руками, сохраняем в bmp.

В моём случае обучающее множество картинок выглядит так:

Загружаем картинки

Функция загрузки картинки:

image_1 = imread('1_1.bmp');

Функция imread() загружает картинку в виде массива пикселей. Для чёрно-белых картинок пиксель со значением 1 = белый, со значением 0 - чёрный. 1_1.bmp - название картинки, которая лежит в той же папке, что и скрипт с кодом. ежели картинка в другом месте - нужно ещё указывать путь.

Преобразование массива с пикселями картинки в один столбец:

image_1_col = reshape(image_1,[],1);

Функция reshape() преобразует матрицу в первом аргументе в соответствии с числом строк во втором аргументе и числом столбцов в третьем. В данном случае указано только число столбцов.

После этой процедуры каждая картинка, являющаяся одним примером данных для ИНС будет представлена в виде столбца пикселей (900 пикселей, 30х30).

Здесь же добавляем к полученным примерам метку (target), в таком случае массив обучения и массив меток будут объединены, и это сократит код. Положим, что на выходе нейронной сети будет 4 нейрона, по одному на каждую распознаваемую цифру, и единица на одном из них будет сигнализировать о распознавании соответствующей цифры. Поэтому массив меток будет выглядеть как столбец из 4 значений.

image_target = [1;0;0;0];

для единицы,

image_target = [0;1;0;0];

для двойки и т.д.

Добавление меток к каждому столбцу:

image_1_col = [image_1_col; image_target];

 

Обучающая выборка

После повторения предыдущих шагов для всех картинок объединяем их в обучающую выборку - в о дин массив размерностью 904х25. 904 - потому что по 900 пикселей каждой картинки + 4 значения метки, 25 потому что 4 цифры по 5 примеров.

Код объединения будет выглядеть примерно так:

learn_array = [image_1_col, image_2_col,...];

И так для всех имеющихся картинок.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: