Распознавание лиц (off-line). Демонстрационная база.




Принцип обмена данными из 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='\

43 Comments

  1. Rustig

    (0) видео приложить можете? интересно посмотреть.

    Reply
  2. agent00mouse

    Конфигурацию попилить это конечно хорошо. но дайте лучше исходники ВК. А мы уж под 64 бита и под себя оптимизируем. За реализацию идеи +1.

    Reply
  3. Rustig

    (0)

    Инструкции в документации к платформе

    это как понять?

    Reply
  4. nomadon

    (4) порядок выгрузки и загрузки баз данных в dt

    Reply
  5. Rustig

    (5) так это все знают на ИС.

    Reply
  6. nomadon

    (2) видео чего? нажимания кнопки? результат на скринах видно, регистрация и поиск в базе, для остальных экспериментов и анализа кода лучше скачать и развернуть у себя

    Reply
  7. nomadon

    (6) не все. здесь не только технари, еще есть поисковые системы, которыми тоже не только технари пользуются

    Reply
  8. Rustig

    (7) ладно-ладно) привычка нашего времени — просмотреть «побырому» ютуб-версию.

    вопросы:

    1) с какой скоростью распознается ваша фотография в примере?

    2) в каком формате (размерах) надо загружать фотки?

    3) подключение к интернету обязательно?

    Reply
  9. nomadon

    (9) 1. все сильно зависит от железа.в в примере файловая база в месте в процедурой инициализации, на полу ssd, без GPU — несколько секунд. Вообще на практике удавалось достичь скорости распознавания 500 изображений в минуту без GPU (но это отдельная история — где взять столько лиц)))

    2. Библиотека dlib работает с поддержкой JPG PNG, конечно чем лучше фотка тем лучше результат, минимум 40Х40 пикселей область с лицом.

    3. В заголовке указано offline, т.е. полностью автономно может работать, есть еще варианты других решений, где скорость и точно повыше, можно встраивать в железки, видеокамеры, RaspberryPi и т.д.. Как говориться, все что угодно за ваши деньги)

    Reply
  10. Rustig

    (10) спасибо за публикацию!

    Reply
  11. nomadon

    (11) обращайтесь)

    Reply
  12. Vanch90

    Какие ограничения по системе?)

    Reply
  13. chuvak9999

    А как программа узнает что именно этот покупатель купил какие-то товары или своровал? ))

    Reply
  14. echo77

    (4) Это шутка

    Reply
  15. chuvak9999

    Если покупатель бороду отрастил или одел капюшон — это не помеха для системы?

    Reply
  16. nomadon

    (13) Это демонстрационная версия, ограничения в ней только по производительности и разрядности. Обычно внедряемое решение более оптимизировано и тесно интегрировано с существующей системой, ведь главное не распознать, а корректно использовать информацию в дальнейшем.

    Например, если розница, можно дополнить счетчики подсчета посетителей, и считать насколько часто клиент возвращается, или если он целый день заходит в магазин — наверное, что-то хочет купить, но никак не решается.

    Reply
  17. nomadon

    (14) При выдаче дисконтных карт или прочей регистрации клиентов можно привязать клиента к изображению, а по воровству — запись с камер обрабатывает служба безопасности, ну и предопределенный клиент с капсом «ВНИМАНИЕ ОПАСНОСТЬ» )

    Reply
  18. nomadon

    (16) это не рентген 🙂 через одежду не видит. Если человек прячется от камер умышленно — это работа СБ) но если засветился пусть даже на скрытую камеру — маячок. Нужно активнее отработать.

    Reply
  19. nomadon

    (16) по бороде и видоизменению — отдельная тема. Смотря как обучать систему, она ведь не самостоятельный интеллект, а компьютер с заложенным алгоритмом.

    Reply
  20. chuvak9999

    (20) Где то прочитал что соотношение глаз и кончика носа это идеальный УИД для любого человека. Или система для каждого ракурса вырабатывает свой УИД?

    Reply
  21. nomadon

    Можно еще использовать как аналог FaceID для 1с. Для тех кто любит отходить от рабочего места не блокируя компьютер или 1с, если это имеет значение в конкретном случает. Отправлять на сервер снимки с встроенной камеры ноутбука или монитора, и, если нет идентификации какой-то промежуток времени — блокировать / закрывать / уведомлять

    Reply
  22. nomadon

    (21) если замерять с микрометром на стенде (стапеле) лицо — то возможно, но на фото это расстояние посчитать сложновато, поэтому системами используются множество контрольных точек, в библиотеках можно получать доступ к этим точкам и отдельно отрисовать области глаз, губ и т. д.

    Reply
  23. protexprotex

    Добрый день. Система устойчива к поворотам головы в горизонтальной / вертикальной плоскости? — насколько падает вероятность распознавания при повороте более чем на 30 градусов. Также детекция лица на фото — с использованием виола — джонса? — если так, то при повороте головы более 30 градусов вероятность детекции лица падает очень сильно. Также с измененим освещенности как влияет?

    Reply
  24. nomadon

    (24) в заключении немного упомянул об этом, параметр про jitter, позволяет использовать встроенные средства трансформации изображения, но можно и самостоятельно поработать. Нет одного конкретного решения на все случаи жизни, да, действительно, при повороте головы, конечно, падает точность, но какую задачу Вы решаете? Распознаете повернутые головы? Если анализировать видеопоток — то этот параметр будет иметь меньшее значение, потому что, рано или поздно, голова повернется (или ей помогут повернуться вспышкой света или звуком).

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

    Если показать нейросети фото, повернутое на 90% градусов, она скорее всего, его не узнает. Для этого ее нужно обучить смотреть так же повернутые фото, но зачем увеличивать объемы и производительность в несколько раз, обучая разворотам в 4 стороны? Может быть стоит повернуть камеру? Или изображение предварительно повернуть, что менее затратно по ресурсам? Или воспользоваться менее ресурсоемкими алгоритмами машинного обучения для определения факта повернутости входного изображения?

    Автомобильные регистрационные знаки тоже можно вертикально ставить, однако этого обычно не происходит, и системы работают с допустимыми углами поворота, если, вдруг, это «жесткая» система, например, валидация доступа, тогда вообще нужно запретить не точное узнавание, «Встаньте, пожалуйста, как в паспорте» )

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

    Reply
  25. nomadon

    (26)

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

    Спасибо, удалил.

    Reply
  26. protexprotex

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

    https://infostart.ru/video/w630732/

    или тут:

    https://infostart.ru/video/w267692/

    или тут:

    https://infostart.ru/video/w299356/

    и полно еще разработок.

    Причем не использую внешние компоненты. Пишу все сам с нуля.

    Так что тема очень близка.

    Reply
  27. F1215

    Я используют CRM Битрикс 24 тариф CRM с Face- трекером связанный с 1С

    В чем фишка данной базы я откровенно не понял

    Reply
  28. nomadon

    (29)Использовать системы и разрабатывать — это разные вещи

    Reply
  29. nomadon

    (29) там можно идентифицировать конкретного человека? Прям персональную скидку предоставить тогда, когда клиент заходит в магазин?

    Reply
  30. F1215

    (31)

    да можно

    Reply
  31. amd1986

    Битрикс такое полтора года назад делал в 1С-Трекере. Тоже с внешней компонентой, в которой был затянут урезанный хром, Единственно что — не офлайн и не бесплатно.

    Reply
  32. AlX0id

    На 64-битной платформе работать не захотело — ошибка подключения компоненты. В 32-бит — работает.

    Reply
  33. nomadon

    (34) об этом написано в описании и комментариях, x64 вроде как для более детальной разработки платного решения

    Reply
  34. nomadon

    (33) технологий и сервисов на самом деле очень много уже..

    Reply
  35. AlX0id

    (35)

    Ну значит, чукча не читатель ) Так, написал, можт снимет вопросы у кого.

    Reply
  36. amd1986

    (36) сейчас уже да. Но когда выходил модуль — распознование мало где использовали. По сути это был первый сервис для 1С. К некоторым клиентам даже приходили с телевидения(основной сетки) и снимали репортаж как это работает в магазинах.

    Reply
  37. 🅵🅾️🆇

    Вопрос только один: что за библиотеку взял за основу?)

    Reply
  38. nomadon

    (39) чукча не читатель) в тексте публикации об этом написано)

    Reply
  39. 🅵🅾️🆇

    (40)

    dlib.net

    Reply
  40. catv

    Сразу же возникает вопрос за ПДн. Если человек давал письменное согласие на хранение его биометрических данных — это одно, в противном случае, даже если это вор, можно залететь по жалобе

    Reply
  41. nomadon

    (42) это не совсем биометрические данные, группы крови нет, даже цвета глаз и волос не хранится. Хранятся некие хеши, которые получаются путем визуальной оценки. Это равносильно тому, что Вы посмотрите на человека, запомните его, и поставите цифру 0.3832534, которую с ним ассоциируете. Эта цифра биометрические данные? На нее нужно давать письменное согласие? А вдруг у Вас в системе расчет кода справочника Клиенты основан на биометрических данных?

    Reply
  42. catv

    (43)

    152-ФЗ Статья 11. Биометрические персональные данные

    1. Сведения, которые характеризуют физиологические и биологические особенности человека, на основании которых можно установить его личность (биометрические персональные данные) и которые используются оператором для установления личности субъекта персональных данных…

    В каком виде вы храните эти сведения — дело десятое, тем более, что вы их привязываете к конкретному лицу в базе

    Reply
  43. nomadon

    (44) к лицу привязано в демо базе, для оценки возможностей, да и устанавливать личность совсем не обязательно, дело не в идентификации личности

    Reply

Leave a Comment

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