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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

53 Comments

  1. Serj1C

    Где взять Новый COMОбъект(«GFLAx.GFLAx«) ?

    Reply
  2. burlakov

    очень интересная разработка. есть аналогичная, но немного недоделанная по решению задач анализа и обобщения информации.

    Reply
  3. andrewks

    нужно учесть, что используемый обработкой компонент имеет лицензию

    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.

    т.е. использование в коммерческих компаниях не будет обладать лицензионной чистотой

    Reply
  4. AltF1

    Механизмы рейронных сетей необходимо включать в конфигурации 1С, где есть регл учет, чтобы понимать пользователей и их действия!

    Reply
  5. informa1555

    (3) andrewks, Да Вы правы.Но это решаемая проблема, есть другие компоненты, просто с этой было проще работать — там всего несколько строчек — пиксели в массив записываются и все.

    Reply
  6. informa1555

    (4) kiv82, Интересная мысль))

    Reply
  7. MarSeN

    Какая сеть используется? я так понял, что многослойный персептрон?

    Сколько на выходе нейронов?

    Если возможно, напишите краткие тех. характеристики сети. Меня давно интересует данный вопрос. Уже вторая статья подряд на инфостарте попадает в в зону моего интереса (после штудирования инфо в инете выходит статья на ИС :-))

    Reply
  8. MarSeN

    и еще вопрос в догонку…

    я так понимаю что GFLAx как раз-таки используется для «выделения» букв перед отправкой на входной слой нейронной сети.

    Reply
  9. informa1555

    (7) MarSeN, Используется однослойный перцептрон типа самоорганизующихся карт Кохонена но по своему алгоритму. Многослойные медленнее на этапе распознавания. Упор сделан на обучение и организацию карт чтобы при распознавании бысрее находился нужный вариант.

    Reply
  10. informa1555

    (8) MarSeN, GLAfx используется только для того чтобы пиксели в массив записать и все. Вся работа с изображением полностью на 1С ну и далее распознавание и обучение тоже.

    Reply
  11. MarSeN

    (10) informa1555,

    Спасибо.

    На выходе сколько нейронов?

    Reply
  12. informa1555

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

    Reply
  13. rasswet

    здОрово и любопытно! респект!

    Reply
  14. DAnry

    Великая и могучая 1С… Ну и, конечно, универсальная. Что еще не делали на 1С?

    Reply
  15. gruk

    Круть! +

    Reply
  16. AnryMc

    Особенно понравилось

    написано на языке 1С
    Reply
  17. CheBurator

    внушает!

    Reply
  18. SunShinne

    Простите за французский, но… реально ах-ре-неть- задумка крутая! Плюс однозначнейший! А для чего-нибудь еще нейросеть можно «натаскать»? Где можно почитать про «вот это все»?

    Reply
  19. informa1555

    (17) CheBurator, Спасибо!

    Reply
  20. informa1555

    (18) SunShinne, Спасибо за внимание. С помощью нейронных сетей можно распознавать вообще все — любое изображение, звук(распознавание речи), реализовать любую нечеткую логику — принятие решений например при изменяющих факторах окружающего мира и т.д. Это по сути ассоциативное мышление. У меня не совсем типичные сети(частный случай) — это самоорганизующаяся карта — вот она подходит больше для изображений — т.е. объектов с непрерывной структурой (грубо говоря каких то реальных точек которые в физическом объекте если он физический стоят вместе друг с другом).Что почитать сложный вопрос — я читал либо книжки советского периода либо англоязычные, у нас почему то про это забыли сейчас — хороших книг сейчас не выходит только лекции (например в электронном виде Интуит).

    Reply
  21. RailMen

    Плюсую. Напоминает мою ККР по дисциплине нейросетевые технологии, когда учился в магистратуре. Только писалась она на старом добром Delphi и без сторонних библиотек. Project не тяжело переписать под 1С, только пока не требовалось.

    Reply
  22. CheBurator

    (20) а можно пристегнуть к примерно такой задаче — нахождение похожих картинок?

    например: пришел товар (чехлы для телефонов). вопрос: есть ли у меня такой товар в базе? идентификации никакой нет, кроме внешнего вида.. делаем типа: фотографируем (весь товар фотографируется в примерно одинаковом ракурсе/размере), жмакаем кнопку — выдает список(картинки) похожих товаров..?

    Reply
  23. RailMen

    (22) CheBurator, можно сделать без какой-либо сторонней библиотеке с небольшими оговорками:

    1) все фото будут одного не большого разрешения, например, 400х600 (очень большое разрешение потребует некоторые усложнения мат модели персептрона);

    2) черные чехлы фоткать на белом фоне для большей контрастности, чтобы снизить полную ошибку нейросети.

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

    Применимо к вашей задачи, при поступлении очередного чехла для телефона ответ ситемы будет какой: «Возможно у нас есть похожие чехлы: (далее список с картинками с порядке убывания схожести):

    1) чехол №1 — картинка чехла №1 — ошибка сети при вычислении схожести чехла №1

    2) чехол №2 — картинка чехла №2 — ошибка сети при вычислении схожести чехла №2



    «

    Reply
  24. CheBurator

    1. да, так и есть, картинки небольшого формата, для визуального контроля в основном, но вполне разборчивые…

    2. это нормальное требование

    .

    остальное тоже нормально.

    .

    думаю такая программулинка будет представлять интерес. и не только для чехлов 😉

    .

    Reply
  25. MarSeN

    (12) informa1555,

    спасибо за ответ. увидел случайно, так как он не был «адресован» мне

    Reply
  26. HameleonA

    Интересное решение. Напомнило мне дипломный проект. На досуге посмотрю.

    Reply
  27. Makushimo

    (19) informa1555,

    поделитесь ссылкой, если не трудно. Очень интересна эта тема.

    Reply
  28. MarSeN

    Плохо, что «инновационные» статьи всегда проигрывают в плюсах.

    Reply
  29. informa1555

    (27) Makushimo, В качестве базы(тем более там разные подходы) что то из этого неплохо, Барский например: http://www.intuit.ru/studies/courses?service=0&option_id=17&service_path=1

    Reply
  30. Evil Beaver

    Круто, но не до конца уловил, а что, собственно, делает компонента GFLAx?

    Reply
  31. informa1555

    (30) Evil Beaver, Компонента просто считывает цвета пикселей картинки в двумерный массив- там буквально 5 строчек. Т.е. переводит картинку в матрицу. Средствами 1С вроде картинку не прочитать попиксельно. По крайней мере я не знаю как… А само распознавание и прочая сопутствующая работа с изображением на 1С сделана — уже с массивом точек.

    Reply
  32. Йожкин Кот

    А можно при помощи нейросетей сделать прогнозирование курса евро/доллара на несколько дней вперед? Потом привязать это все к какой-либо торговой платформе…

    Reply
  33. informa1555

    (32) Йожкин Кот, Думаю нет, там вроде традиционно теханализ используется, матстатистика там.

    Reply
  34. Zas1402

    (32) Нейросеть она больше угадывает чем прогнозирует.

    Reply
  35. Evil Beaver

    (28) MarSeN, я заплюсил. А проигрывают потому, что практической ценности меньше. Если поизгаляться, так и 3D графику можно сделать, обсчет матриц, там, и прочее. Но зачем?

    Reply
  36. EugenLiquor

    Хммм, не думал, что найду подобное решение. Довольно интересное решение, поподробнее ознакомлюсь!

    Reply
  37. artbear

    ОФФ. подписался.

    Reply
  38. 3762515

    Отличная вещь! Я так понимаю, можно взять стопку документов, например счет-фактура входящие, положить в сканер и 1с от сканирует, распознает и создаст такой же!

    Reply
  39. informa1555

    (39) 3762515, Да можно приспособить под печатный текст тем более что распознавание печатных букв гораздо проще чем рукописных и в данном примере реализовано распознавание ячеек, а в накладных, с/фактурах и т.д. как раз надо читать инфу из таблиц документа например колонка «Товар» — строка 1,2,3 и т.д. Как раз то, что мешает привинтить файнридер это то что связь таблиц и полей с реальными реквизитами должна обрабатываться на стороне 1С.Без такой связи толку от распознавания нет,а если делать на 1С как раз все доступно. Но «привинчивать» придется долго — это не тиражный продукт, а просто демка алгоритма.

    Reply
  40. 3762515

    Чего то не могу понять, что именно надо скачать отсюда: http://www.xnview.com/en/GFL/#downloads

    Ничего похожего на GFLAx там нет, поиска нет. Обработка ругается:

    {Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)
    GFLAx = Новый COMОбъект(«GFLAx.GFLAx»);
    по причине:
    Недопустимая строка с указанием класса
    
    Reply
  41. informa1555

    (41) 3762515, Вот ссылка на прямую скачку с их сайта http://download.xnview.com/GflSDK-win.zip

    Reply
  42. 3762515

    (42) informa1555, спасибо

    Reply
  43. protexprotex

    (33) informa1555, Ну неправда. Нейросети как раз для прогнозирования — самое то. Используют для этого специальную структуру сети — с обратными связями. И обучают до стабилизации ответа.

    Reply
  44. pvlunegov

    (14) DAnry,

    В 1с нет объектно-ориентированного подхода.

    Это огромный минус, который ведет к сложному коду.

    На любом объектно-ориентированном языке подобные задачи выглядят в коде изящнее и проще в понимании.

    Reply
  45. 3762515

    Не пойму, что нужно что бы оно заработало. Такая ошибка у меня:

    {Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)

    GFLAx = Новый COMОбъект(«GFLAx.GFLAx»);

    по причине:

    -2147221005(0x800401F3): Недопустимая строка с указанием класса
    Reply
  46. informa1555

    (46) 3762515, Не установлен GFLAx или не зарегистрирован. Зарегистрировать : Regsvr32 c:WINDOWSsystem32GflAx.dll

    Reply
  47. VLMedvedev

    А развитие есть ?

    Reply
  48. informa1555

    (48) VLMedvedev, Есть но в виде совсем другого собственного мат аппарата (еще меньше похожего на сети — больше на био) и не на 1С)) 1С хороша чтобы чето быстро наваять — увидеть воплощение идеи, не задумываясь над типизацией и т..д. но это несерьезно для развития.

    Reply
  49. VLMedvedev

    Как посмотреть ?

    Reply
  50. informa1555

    (50) VLMedvedev, Это не так просто к сожалению. Коммерческого решения пока нет. Мат аппарат я постоянно перерарбатываю и модули кластреризации, разпознавания и т.д. непрезентабельные хоть и рабочие))

    Reply
  51. Rico17

    Приглашаю в проект:

    https://infostart.ru/project/795704/

    Необходимо разработать движок для работы со смыслами.

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

    Система должна уметь составлять осмысленные предложения из набора слов, например:

    — пустыня, озеро, река.

    Можно добавлять любые слова, чтобы получилось предложение имеющее смысл.

    Например: В пустыне нет озера и реки.

    Reply
  52. izidakg

    Обновление данной разработки будет?

    Reply
  53. informa1555

    (53) На 1С нет — слишком тормозная. Я ее использовал чтобы поэкспериментировать с алгоритмами, нащупать решение, так как на 1С это делать проще всего — нет типизации и т.д. Сам я ML пишу на питоне (бек) + на java или c# фронты и прочую инфраструктуру.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *