Распознавание рукописного ввода с использованием нейронных сетей (написано на языке 1С).Light version.

Программирование - Практика программирования

91
Эта обработка - пример на 1С применения обучаемой нейросети для распознавания рукописного неслитного текста на любом языке и наборе символов. Решение написано для распознавания анкетных форм, когда буквы вписываются в квадратики, но может применяться и для других областей, например для распознавания печатного текста. Данная обработка - рабочая бета версия, своего рода SDK для встраивания в свои решения, предназначена для программистов а не для конечного пользователя.Честно скажу - с ней нужно повозиться. Сам алгоритм, который лег в основу - собственного изготовления, по смыслу похожий на обучаемые карты Кохонена, но и в корне отличный.И алгоритм и обработка в стадии активного развития. В эту версию не вошло самооптимизация после обучения сети. Можно делать оптимизацию вручную.

Почему возникла идея прикрутить распознавание к 1С? Потому что 1С обладает неоспоримым преимуществом - она обеспечивает лингвистическую поддержку на уровне реквизитов ИБ с их типами данных и значениями! Например требуется распознать в анкете поле "Сотрудник" - это уже ограничено значениями справочника "Сотрудники" а не всеми словами русского языка, а если учесть что можно отборать (т.к. это 1С мы можем делать что хотим) для конкретного документа только тех сотрудников, котрые в коммандировке - то и вовсе несколько строк получается. Таким образом даже если система неправильно распознает одну или даже несколько букв, всегда можно проверить проверочным словарем - отборанными сотрудниками, и автоматически же исправить, чтобы система обучилась и в следующий раз не повторяла эту ошибку.Это большое преимущество перед другими системами, которое может сделать распознавание вполне приемлемым. Кроме того код, написанный на 1С могут править все 1С программисты.

Работа с обработкой состоит из двух этапов:

1)Первичное обучение на закладке обучение. Требуется написать по 3 буквы собсвенным почерком и  сопоставить им символы с клавиатуры. Вприниципе этот этап можно было бы исключить, но так быстрее сеть входит в свое рабочее состояние.

2)Распознавание.  Можно использовать саму обработку просто чтобы посмотреть,но смысл конечно в том, чтобы встроить это в свою конфигурацию.

Области данных на обеих закладках нужны для того чтобы не обрабатывать весь документ, а указать примерно где какие реквизиты искать. Эти  области задаются в пикселях X1,Y1 - верхний левый угол;X2,Y2-правый нижний угол области. Для того чтобы из примерно определить можно открыть картинку в Paint-е или другом редакторе, который показывает пиксели - в левом, нижнем углу будут эти самые пиксели.

 

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

Затем идет распознавание и обучение сети. Почему я использую однослойную сеть? Потому что один слой обрабатывается на этапе распознавания быстрее чем n-слоев. И при этом, что самое важное сеть можно организовать соптимизировать так, что найдется некая карта у которой совпадение будет максимально "заточено" под входной результат, т.е. изначально с большей степенью вероятности будет попадание в 10-ку. Этим как раз и занимается алгоритм самооптимизации(нет в light version). На эту обработку тоже тратится процессорное время, но это происходит позже, в фоне а не на этапе распознавания.

В архиве приложены примеры образца для первичного обучения и для распознавания - эти примеры сеть распознает абсолютно точно. На них можно проверить как это работает.

 

Технические требования для работы:

1)Для работы необходимо скачать и установить GFLAx http://www.xnview.com/en/GFL/#downloads

2)В конфигурации должен быть справочник ХранилищеДополнительнойИнформации - т.е. как в любой типовой конфе.

Ограничения при работе с данным релизом:

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

2)Распознавание на черно и белое прописано в функции ПрочитатьМатрицу() для глубины цвета 24 - возможно потребуется поменять этот параметр для конкретных условий(более темная и светлая картинка) или другой глубины. Желательно(не обязательно) предварительное преобразования в B&W, так можно убедиться что черно-белая картинка впринципе читаема.  

3)Разрешение и скорость работы. Чем больше разрешение тем ниже скорость работы, но выше точность. В приложенном образце толщина букв примерно 4 символа распознавание максимально достоверное, но скорость не очень. Можно снижать до 2 - скорость резко возрастает.

 

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

91

Скачать файлы

Наименование Файл Версия Размер
РаспознаваниеРукописногоВводаЛайт.zip
.zip 146,92Kb
05.10.13
79
.zip 146,92Kb 79 Скачать

См. также

Комментарии
Сортировка: Древо
1. Serj1C 471 17.10.13 12:55 Сейчас в теме
Где взять Новый COMОбъект("GFLAx.GFLAx") ?
2. burlakov 72 17.10.13 14:29 Сейчас в теме
очень интересная разработка. есть аналогичная, но немного недоделанная по решению задач анализа и обобщения информации.
3. andrewks 1238 17.10.13 20:49 Сейчас в теме
нужно учесть, что используемый обработкой компонент имеет лицензию

GFL SDK is provided as FREEWARE (NO Adware, NO Spyware) for private or educational use (including non-profit organizations).
If you enjoy using GFL SDK, Don't hesitate to help the developer with a small donation.


т.е. использование в коммерческих компаниях не будет обладать лицензионной чистотой
5. informa1555 633 18.10.13 09:07 Сейчас в теме
(3) andrewks, Да Вы правы.Но это решаемая проблема, есть другие компоненты, просто с этой было проще работать - там всего несколько строчек - пиксели в массив записываются и все.
4. AltF1 18.10.13 08:20 Сейчас в теме
Механизмы рейронных сетей необходимо включать в конфигурации 1С, где есть регл учет, чтобы понимать пользователей и их действия!
theelectric; ElektronHM; SkyHunter; +3 Ответить
6. informa1555 633 18.10.13 09:09 Сейчас в теме
(4) kiv82, Интересная мысль))
7. MarSeN 965 19.10.13 12:00 Сейчас в теме
Какая сеть используется? я так понял, что многослойный персептрон?
Сколько на выходе нейронов?
Если возможно, напишите краткие тех. характеристики сети. Меня давно интересует данный вопрос. Уже вторая статья подряд на инфостарте попадает в в зону моего интереса (после штудирования инфо в инете выходит статья на ИС :-))
9. informa1555 633 19.10.13 12:30 Сейчас в теме
(7) MarSeN, Используется однослойный перцептрон типа самоорганизующихся карт Кохонена но по своему алгоритму. Многослойные медленнее на этапе распознавания. Упор сделан на обучение и организацию карт чтобы при распознавании бысрее находился нужный вариант.
8. MarSeN 965 19.10.13 12:02 Сейчас в теме
и еще вопрос в догонку...
я так понимаю что GFLAx как раз-таки используется для "выделения" букв перед отправкой на входной слой нейронной сети.
10. informa1555 633 19.10.13 12:33 Сейчас в теме
(8) MarSeN, GLAfx используется только для того чтобы пиксели в массив записать и все. Вся работа с изображением полностью на 1С ну и далее распознавание и обучение тоже.
11. MarSeN 965 21.10.13 23:48 Сейчас в теме
(10) informa1555,
Спасибо.
На выходе сколько нейронов?
12. informa1555 633 22.10.13 03:35 Сейчас в теме
Сколько обучите столько и будет. Идея заключается в том что на один значащий выход на одном слое может быть много нейронов. Например я цифру 7 могу писать с палочкой посередине и без, поэтому у меня накапливается опыт по обоим вариантам,но все они ведут в итоге к 7ке
25. MarSeN 965 28.10.13 00:35 Сейчас в теме
(12) informa1555,
спасибо за ответ. увидел случайно, так как он не был "адресован" мне
13. rasswet 82 23.10.13 10:02 Сейчас в теме
здОрово и любопытно! респект!
14. DAnry 7 23.10.13 13:30 Сейчас в теме
Великая и могучая 1С... Ну и, конечно, универсальная. Что еще не делали на 1С?
45. pvlunegov 124 16.06.15 17:54 Сейчас в теме
(14) DAnry,
В 1с нет объектно-ориентированного подхода.
Это огромный минус, который ведет к сложному коду.
На любом объектно-ориентированном языке подобные задачи выглядят в коде изящнее и проще в понимании.
15. gruk 3 24.10.13 05:20 Сейчас в теме
16. AnryMc 716 24.10.13 06:33 Сейчас в теме
Особенно понравилось
написано на языке 1С
17. CheBurator 3552 27.10.13 14:22 Сейчас в теме
20. informa1555 633 27.10.13 16:43 Сейчас в теме
22. CheBurator 3552 27.10.13 22:40 Сейчас в теме
(20) а можно пристегнуть к примерно такой задаче - нахождение похожих картинок?
например: пришел товар (чехлы для телефонов). вопрос: есть ли у меня такой товар в базе? идентификации никакой нет, кроме внешнего вида.. делаем типа: фотографируем (весь товар фотографируется в примерно одинаковом ракурсе/размере), жмакаем кнопку - выдает список(картинки) похожих товаров..?
23. RailMen 27.10.13 23:06 Сейчас в теме
(22) CheBurator, можно сделать без какой-либо сторонней библиотеке с небольшими оговорками:
1) все фото будут одного не большого разрешения, например, 400х600 (очень большое разрешение потребует некоторые усложнения мат модели персептрона);
2) черные чехлы фоткать на белом фоне для большей контрастности, чтобы снизить полную ошибку нейросети.

Ну и главное, надо понимать, что любая нейросеть не может являться инструментом для 100% принятия решения в какой-либо области, особенно в рег учете или точных расчетных задачах. Ее надо рассматривать как некий "советчик"/"помощник"/"консультант". Многое зависит от методов обучения сети, ее базы знаний и т.д.

Применимо к вашей задачи, при поступлении очередного чехла для телефона ответ ситемы будет какой: "Возможно у нас есть похожие чехлы: (далее список с картинками с порядке убывания схожести):
1) чехол №1 - картинка чехла №1 - ошибка сети при вычислении схожести чехла №1
2) чехол №2 - картинка чехла №2 - ошибка сети при вычислении схожести чехла №2
...
"
18. SunShinne 606 27.10.13 15:27 Сейчас в теме
Простите за французский, но... реально ах-ре-неть- задумка крутая! Плюс однозначнейший! А для чего-нибудь еще нейросеть можно "натаскать"? Где можно почитать про "вот это все"?
19. informa1555 633 27.10.13 16:43 Сейчас в теме
(18) SunShinne, Спасибо за внимание. С помощью нейронных сетей можно распознавать вообще все - любое изображение, звук(распознавание речи), реализовать любую нечеткую логику - принятие решений например при изменяющих факторах окружающего мира и т.д. Это по сути ассоциативное мышление. У меня не совсем типичные сети(частный случай) - это самоорганизующаяся карта - вот она подходит больше для изображений - т.е. объектов с непрерывной структурой (грубо говоря каких то реальных точек которые в физическом объекте если он физический стоят вместе друг с другом).Что почитать сложный вопрос - я читал либо книжки советского периода либо англоязычные, у нас почему то про это забыли сейчас - хороших книг сейчас не выходит только лекции (например в электронном виде Интуит).
27. Makushimo 152 29.10.13 15:21 Сейчас в теме
(19) informa1555,
поделитесь ссылкой, если не трудно. Очень интересна эта тема.
29. informa1555 633 30.10.13 03:46 Сейчас в теме
(27) Makushimo, В качестве базы(тем более там разные подходы) что то из этого неплохо, Барский например: http://www.intuit.ru/studies/courses?service=0&option_id=17&service_path=1
21. RailMen 27.10.13 20:26 Сейчас в теме
Плюсую. Напоминает мою ККР по дисциплине нейросетевые технологии, когда учился в магистратуре. Только писалась она на старом добром Delphi и без сторонних библиотек. Project не тяжело переписать под 1С, только пока не требовалось.
24. CheBurator 3552 27.10.13 23:21 Сейчас в теме
1. да, так и есть, картинки небольшого формата, для визуального контроля в основном, но вполне разборчивые...
2. это нормальное требование
.
остальное тоже нормально.
.
думаю такая программулинка будет представлять интерес. и не только для чехлов ;-)
.
26. HameleonA 111 28.10.13 09:17 Сейчас в теме
Интересное решение. Напомнило мне дипломный проект. На досуге посмотрю.
28. MarSeN 965 29.10.13 20:16 Сейчас в теме
Плохо, что "инновационные" статьи всегда проигрывают в плюсах.

Odinas; informa1555; +2 Ответить
36. Evil Beaver 5190 07.03.14 17:43 Сейчас в теме
(28) MarSeN, я заплюсил. А проигрывают потому, что практической ценности меньше. Если поизгаляться, так и 3D графику можно сделать, обсчет матриц, там, и прочее. Но зачем?
30. Evil Beaver 5190 30.10.13 10:19 Сейчас в теме
Круто, но не до конца уловил, а что, собственно, делает компонента GFLAx?
31. informa1555 633 30.10.13 10:37 Сейчас в теме
(30) Evil Beaver, Компонента просто считывает цвета пикселей картинки в двумерный массив- там буквально 5 строчек. Т.е. переводит картинку в матрицу. Средствами 1С вроде картинку не прочитать попиксельно. По крайней мере я не знаю как... А само распознавание и прочая сопутствующая работа с изображением на 1С сделана - уже с массивом точек.
32. Йожкин Кот 1052 30.10.13 15:42 Сейчас в теме
А можно при помощи нейросетей сделать прогнозирование курса евро/доллара на несколько дней вперед? Потом привязать это все к какой-либо торговой платформе...
33. informa1555 633 30.10.13 17:23 Сейчас в теме
(32) Йожкин Кот, Думаю нет, там вроде традиционно теханализ используется, матстатистика там.
44. protexprotex 170 07.11.14 00:48 Сейчас в теме
(33) informa1555, Ну неправда. Нейросети как раз для прогнозирования - самое то. Используют для этого специальную структуру сети - с обратными связями. И обучают до стабилизации ответа.
35. Zas1402 24.12.13 18:18 Сейчас в теме
(32) Нейросеть она больше угадывает чем прогнозирует.
37. EugenLiquor 07.03.14 17:58 Сейчас в теме
Хммм, не думал, что найду подобное решение. Довольно интересное решение, поподробнее ознакомлюсь!
38. artbear 1054 12.03.14 16:36 Сейчас в теме
39. 3762515 13.03.14 11:42 Сейчас в теме
Отличная вещь! Я так понимаю, можно взять стопку документов, например счет-фактура входящие, положить в сканер и 1с от сканирует, распознает и создаст такой же!
40. informa1555 633 13.03.14 12:07 Сейчас в теме
(39) 3762515, Да можно приспособить под печатный текст тем более что распознавание печатных букв гораздо проще чем рукописных и в данном примере реализовано распознавание ячеек, а в накладных, с/фактурах и т.д. как раз надо читать инфу из таблиц документа например колонка "Товар" - строка 1,2,3 и т.д. Как раз то, что мешает привинтить файнридер это то что связь таблиц и полей с реальными реквизитами должна обрабатываться на стороне 1С.Без такой связи толку от распознавания нет,а если делать на 1С как раз все доступно. Но "привинчивать" придется долго - это не тиражный продукт, а просто демка алгоритма.
41. 3762515 13.03.14 16:19 Сейчас в теме
Чего то не могу понять, что именно надо скачать отсюда: http://www.xnview.com/en/GFL/#downloads
Ничего похожего на GFLAx там нет, поиска нет. Обработка ругается:
{Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)
 GFLAx = Новый COMОбъект("GFLAx.GFLAx");
по причине:
Недопустимая строка с указанием класса
42. informa1555 633 13.03.14 17:17 Сейчас в теме
(41) 3762515, Вот ссылка на прямую скачку с их сайта http://download.xnview.com/GflSDK-win.zip
43. 3762515 14.03.14 08:12 Сейчас в теме
46. 3762515 20.03.16 13:25 Сейчас в теме
Не пойму, что нужно что бы оно заработало. Такая ошибка у меня:
{Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)
GFLAx = Новый COMОбъект("GFLAx.GFLAx");
по причине:
-2147221005(0x800401F3): Недопустимая строка с указанием класса
47. informa1555 633 20.03.16 15:21 Сейчас в теме
(46) 3762515, Не установлен GFLAx или не зарегистрирован. Зарегистрировать : Regsvr32 c:\WINDOWS\system32\GflAx.dll
48. VLMedvedev 04.11.16 08:25 Сейчас в теме
49. informa1555 633 04.11.16 11:51 Сейчас в теме
(48) VLMedvedev, Есть но в виде совсем другого собственного мат аппарата (еще меньше похожего на сети - больше на био) и не на 1С)) 1С хороша чтобы чето быстро наваять - увидеть воплощение идеи, не задумываясь над типизацией и т..д. но это несерьезно для развития.
50. VLMedvedev 05.11.16 02:42 Сейчас в теме
51. informa1555 633 07.11.16 06:58 Сейчас в теме
(50) VLMedvedev, Это не так просто к сожалению. Коммерческого решения пока нет. Мат аппарат я постоянно перерарбатываю и модули кластреризации, разпознавания и т.д. непрезентабельные хоть и рабочие))
52. Rico17 29 12.03.18 20:39 Сейчас в теме
Приглашаю в проект:
https://infostart.ru/project/795704/
Необходимо разработать движок для работы со смыслами.
Вот простая задача для понимания направления работы:
Система должна уметь составлять осмысленные предложения из набора слов, например:
- пустыня, озеро, река.
Можно добавлять любые слова, чтобы получилось предложение имеющее смысл.
Например: В пустыне нет озера и реки.
Оставьте свое сообщение