Распознавание символов

Задача распознавания изображений является одной из наиболее массовых задач, успешно решаемых с помощью ИНС. Здесь возможны самые разные постановки проблемы, один из наиболее простых вариантов – распознавание фиксированного набора символов.

Пример 3.11. Распознавание букв. В системе MatLab предусмотрена специальная функция

>> [alphabet, targets] = prprob;

Эта функция возвращает две двоичные матрицы: в матрице alphabet (размером 35×26) каждый столбец кодирует одну букву, а матрица targets (размером 26×26) является диагональной и служит для идентификации столбца.

Каждому столбцу alphabet соответствует матрица 7×5, представляющая собой двоичное изображение буквы.

Следующая функция отображает все столбцы alphabet в виде букв (функцию требуется поместить в рабочий каталог MatLab):

function plotletters(alphabet)

fprintf('plotletters is plotting the first 25 letters\n');

[m,n]=size(alphabet);

if m~=35

error('plotletters needs columns 35 numbers long');

end

figure

MM=colormap(gray);

MM=MM(end:-1:1,:);

colormap(MM);

nn=min([n,25]);

for j=1:nn

subplot(5,5,j)

imagesc(reshape(alphabet(:,j),5,7)');

axis equal

axis off

end

Результат выполнения функции показан на рис. 3.12:

>> plotletters(alphabet);

Рисунок 3.12. Двоичное кодирование алфавита.

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

>> net = newff(minmax(alphabet),[10 26],{'logsig' 'logsig'},'traingdx');

>> P = alphabet; T = targets;

Зададим количество эпох и запустим процесс обучения:

>> net.trainParam.epochs = 1000;

>> [net,tr] = train(net,P,T);

Кривая обучения показана на рис. 3.13.

Рисунок 3.13. Изменение ошибки в процессе обучения

Для проверки качества работы обученной сети рассмотрим зашумленные изображения букв (рис. 3.14):

>> noisyP = alphabet+randn(size(alphabet)) * 0.2;

>> plotletters(noisyP);

С помощью следующей команды выполняется запуск сети для зашумленного входного множества:

>> A2 = sim(net,noisyP);

Матрица А2 здесь содержит различные числа в диапазоне [0, 1]. С помощью функции compet можно выделить в каждом столбце максимальный элемент, затем присвоить ему значение 1, а остальные элементы столбца обнулить:

Рисунок 3.14. Изображения букв в присутствии шума

>> for j=1:26

A3 = compet(A2(:,j));

answer(j) = find(compet(A3) == 1);

end

Затем можно визуально оценить ответы сети для зашумленных входных векторов с помощью команд:

>> NetLetters=alphabet(:,answer);

>> plotletters(NetLetters);

На рис. 3.15 показан окончательный результат распознавания.

Рисунок 3.15. Результат выполнения распознавания нейронной сетью

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


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



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