Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Цифровой контур изображения
Форумы портала PHP.SU » Разное » Прочее » Цифровой контур изображения

Страниц (1): [1]
 

1. dcc0 - 18 Февраля, 2021 - 01:27:39 - перейти к сообщению
Интересовался когда-то Аски артом.
Решил попробовать поиграть с конвертацией контуров изображения в цифры.
Вот, что получилось: класс.

Умеет только формат png. И только чёрно-белые изображения.
И желательно не очень большие.
Умеет транспонировать.
Можно посмотреть здесь.
http://comb[dot]org[dot]ru/t.php

Открыл для себя, как мне кажется, мощный инструмент - imagecolorat, фактически позволяет создавать фильтры.

update:
Класс для сети Хопфилда - это к сообщениям ниже.
2. dcc0 - 18 Февраля, 2021 - 16:14:21 - перейти к сообщению
Дополнение:
Мне удалось использовать изображения в виде цифровых контуров для работы с сетью
Хопфилда.
Сеть удачно сопоставила и распознала, нарисованные от руки две похожие буквы.

Получилось так:
1) Получил цифровые образы двух букв п, нарисованных от руки в Pinta (это аналог Gimp).

2) Одну букву сохранил в качестве одного из четырёх образцов для сети Хопфилда.
(матрица формируется из 4-х образцов, 1 - образ буквы, 3 - имеют случайный набор)
3) Вторую отправил на вход. И чудо случилось.

Сеть сопоставила два разных изображения одной буквы и признала их идентичными. Ура!

Можно протестировать (правда, - этой целый квест):
Тут



Можно задать свои изображения:
Для преобразования png в контур: нужно задать изображения в формате png (24х18). Буквы должны иметь строго чёрный цвет (индекс 0).
Для сети формат должен быть: 1,-1 (биполярная кодировка). Формирование матрицы
осуществляется на лету.

Исходник
3. Vladimir Kheifets - 18 Февраля, 2021 - 17:40:58 - перейти к сообщению
dcc0 пишет:
Мне удалось использовать изображения в виде цифровых контуров для работы с сетью Хопфилда

Добрый день!
Спасибо за информацию.
Интересно, будет ли распозновать на картике искажённые символы или строки из нескольких символов?
4. dcc0 - 18 Февраля, 2021 - 18:05:33 - перейти к сообщению
Vladimir Kheifets пишет:
ать на картике искажённые символы или строки из нескольких символов?

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

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

Если задавать в качестве образцов целые слова, то можно распознавать и наборы символов.
5. Vladimir Kheifets - 18 Февраля, 2021 - 19:27:30 - перейти к сообщению
dcc0 пишет:
В принципе в моём примере п - это и есть искажённый символ. Оба символа "п" нарисованы от руки, поэтому отличаются друг от друга. Это и можно считать искажением.
Т.е. в моём примере так и получилось, одну букву "п" сеть помнит, другую я задаю для сопоставления. И сеть отвечает, что буквы идентичны, хотя их контуры чуть-чуть отличаются по понятным причинам.
Как я понял из урока о нейронной сети Хопфилда, она как раз предназначена для распознавания подпочернных образцов.
Если задавать в качестве образцов целые слова, то можно распознавать и наборы символов.

Интересно, а если задать в качестве образцов, например, все символы латинского алфавита. Удасться распознать captcha?
6. dcc0 - 18 Февраля, 2021 - 20:59:28 - перейти к сообщению
Vladimir Kheifets, если написать сеть именно под этот класс символов, то, вероятно, будет работать (но надо проверять).
Может быть, для такой задачи лучше не переводить в контур изображения, а переводить
в бинарный вид в чистом виде. Но даже для изображений среднего размера - это очень большая матрица.


Однако странностей пока много с самой сетью.
Непонятно, какая у сети ёмкость. И ошибки распознавания, конечно, есть.
Тестирую. Смотрю, что происходит.
Пока вопросов больше, чем ответов.


(Добавление)
Из интересного: буква "п", набранную вручную по контуру в блокноте, распознана
как "п" рукописное:

"п" набранная
Спойлер (Отобразить)



"п" нарисованная
Спойлер (Отобразить)


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


Update:
Обернул в класс
P.S. Наконец-то я оценил силу ООП (когда можно сократить код при последующем обращении к методу)
7. dcc0 - 23 Февраля, 2021 - 05:04:49 - перейти к сообщению
Ещё немного о результатах тестирования.
И далее о + и -.
Сформировал матрицу из трёх образцов.
(+) Все три образца, заданные в качестве искомых векторов, были распознаны.
Изображения 30х30, т.е. 900 нейронов.
(-) Если задать изображение, которого нет среди образцов, т.е. по идее будет выброшен ближайший похожий образ, но это не всегда так, поэтому -.
Иными словами: есть в этой схеме ложные срабатывания, с человеческой точки зрения.
Пример: русская "м" может быть распознана как латинская "v". Хотя этому есть объяснение. Вариант хуже: точка с запятой может быть распознана как "а".

Нашёл формулу для ёмкости сети в Вики. Если всё верно понял, то на 900 нейронов возможно добиться устойчивого распознавания только 3-х образцов. Формула в разделе ограничения сети[dot]

Пока вот так.

 

Powered by ExBB FM 1.0 RC1