Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример распознавания цифр. 1. Cоздаём картинки для обучения. 2. Загружаем картинки. 3. Обучающая выборка. 4. Обучаем нейронную сеть




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

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

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

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

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

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

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

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

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

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];

 

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

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

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

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

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

4. Обучаем нейронную сеть

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

Инициализация сети:

net = newff(learn_array(1: 900,: ), learn_array(901: 904,: ), 6);

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

Обучение:

net = train(net, learn_array(1: 900,: ), learn_array(901: 904,: ));

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

Вылезет окошечко обучения, в конце можно закрыть его.

Всё. Сеть обучена.

5. Проверяем сеть

Снова рисуем любую цифру из этих четырёх, сохраняем в виде такой же картинки 30х30.

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

test_image = imread('test.bmp');

Преобразуем к столбцу:

test_col = reshape(test_image, [], 1);

Распознаём:

result = sim(net, test_col)

здесь sim() - функция симуляции работы сети.

В результате получил:

и картинка была такой:

По результату видим, что максимальное значение - второе (0. 8599), что соответствует цифре два. Таким образом, можно сказать, что ИНС обучена корректно и работает как нужно. (заработала как нужно с третьего раза, печаль-беда)

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

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...