Приложение Android для идентификации/распознавания образов (с обучением с одного раза, One-Shot Learning) с возможностью работы с 1С через веб-сервис

Публикация № 849170

Программирование - Мобильные приложения

компьютерное зрение one-shot learning распознавание образов

12
В данной статье описано приложение, алгоритм и методика распознавания изображений, предоставляющее посредством http-запросов информацию о распознанных объектах в 1С. В качестве примера интеграции прилагается конфигурация, реализующая веб-сервис для приема запросов от приложения.

Введение

Я хочу представить вам результат своих экспериментов с алгоритмами распознавания образов с обучением с первого раза (так называемый One Shot Learning). В результате экспериментов выработались определённые подходы к структуризации изображения и в итоге они воплотились в несколько взаимосвязанных алгоритмов и рабочее приложение на Android которое уже можно использовать для работы совместно с решениями на 1С посредством приема HTTP-запросов от приложения.

Ссылка на приложение: https://play.google.com/store/apps/details?id=ru.travelfood.bitmaps

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

Как это устроено

Основная идея такая: изображение- образец должно быть структурировано, т.е. информация в нем должна быть уменьшена до необходимого минимума, но так чтобы не терялся смысл. Например художники рисуют скетчи – всего в несколько точных линий художник может изобразить лицо человека или какой то предмет и зрителю будет понятно что изображено. Фотография содержит матрицу N*M пикселей каждый пиксель содержит сколько то бит информации о цвете, а если представить это все в виде параметров линий то объем информации резко уменьшается и обработка такой информации гораздо проще. Примерно тоже самое должен делать алгоритм. Он должен выделить главные детали в кадре – то что несет в себе основную информацию и отбросить все лишнее.

Алгоритм находит структуру векторов по границам объектов в образце и такую же структуру в распознаваемом изображении. Для того чтобы получить вектора изображение проходит несколько стадий обработки

  • Переводится в монохром по простой формуле (Red+Green+Blue)/3
  • Вычисляется градиент для каждой точки матрицы
  • Находятся наиболее значимые в весовом отношении области градиента
  • Ищутся цепочки векторов, покрывающих эти области
  • Далее происходит зацикливание шагов для получения в итоге минимального количества векторов несущих в себе максимум информации.

 

В анализируемом алгоритме происходит тоже самое. Далее полученные массивы векторов сравниваются:

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

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

И т.д. пока не получится картина из отношений между кластерами которая соберет в себе все или почти все векторы изображения. Т.е. например из бровей, глаз, носа и т.д. не получится лицо.

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

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

Обучение в несколько этапов

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

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

Почему не нейросети?

Приведу несколько причин против нейросетей:

  1. Требуются большие датасеты для обучения, которых может просто не быть в распоряжении. Т.е. например имеется один образец или его изображение и сразу же система должна начать его распознавать
  2. Большие мощности для обучения. Если помножить на большой размер классификатора то требуются серьёзные вычислительные мощности
  3. Непрозрачность алгоритма, невозможность отладки и прямого влияния на результат. Очень сложно если не сказать невозможно понять логику распределения весов. Это и сила и слабость.

Работа приложения и связь с 1С

Приложение работает с матрицей 100*100 пикселей, преобразует картинку к монохромной матрице такого размера. Алгоритму не важно под каким углом находится образец и его размеры в некоторых пределах тоже.

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

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

Можно сохранить несколько образцов. И показывая новое изображение алгоритм найдет наиболее подходящее из них и покажет похожие части.

Для связи с 1С или другими программами приложение отправляет GET-запрос на адрес указанный в настройках. По сути он добавляет наименование распознанного изображения к строке запроса.

В настройках должен быть адрес с ключом параметра в таком виде

[АдресВашегоСервиса]/hs/oneshot/result/?res=

Например http://192.168.1.4:2312/testws/hs/oneshot/result/?res=

Для демонстрации приложена тестовая база, в которой реализован веб-сервис и обработка для показа сообщений веб-сервиса. Ну и работа всего этого вместе такая – делается снимок в приложении, распознается и посредством веб сервиса выводится сообщение в 1С:

 

Для чего может применяться

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

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

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

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

12

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

Наименование Файл Версия Размер
база с веб-сервисом и обработкой приема сообщений от приложения
.dt 33,42Kb
18.06.18
2
.dt 33,42Kb 2 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. saa@kuzov.org 19.06.18 13:02 Сейчас в теме
Как раз интересуюсь распознаванием образов.

Есть задача классифицировать фотографии/сканы документов - есть куча фоток, нужно разложить их по полям документа: фото клиента, скан паспорта, фото накладной и т.п.

Подскажите, пожалуйста, тут подойдет описанная Вами методика?
6. informa1555 1037 19.06.18 17:57 Сейчас в теме
(1) ну не совсем. Просто инфраструктуры нет под это в приложении
2. saa@kuzov.org 19.06.18 13:08 Сейчас в теме
И, собственно, первый вопрос после прочтения статьи - где сам алгоритм распознавания? в 1Сной базе? в мобильном приложении? В неком внешнем веб-сервисе?
5. informa1555 1037 19.06.18 17:55 Сейчас в теме
(2) все в самом приложении. Силами устройства
3. Сурикат 205 19.06.18 14:57 Сейчас в теме
А почему не использовали напрямую дескрипторы?
Бинаризация не всегда может выполняться корректно ...

На картинках у вас идеальное разделение фон/объект. В жизни это почти не встречается
4. informa1555 1037 19.06.18 17:54 Сейчас в теме
(3) так у меня приложение собственно само и готовит изображение. В смысле проводит нормализацию
7. Сурикат 205 19.06.18 21:08 Сейчас в теме
Ваше приложение сможет определить машину во дворе?
Маловероятно, т.к. отделить фон от интересующего объекта сложно.

Например, используя SIFT или SURF дескрипторы можно эту проблему порешать.
https://www.youtube.com/watch?v=Z3OVMm1knwo как пример.

Тем более в OpenCV они достаточно давно есть.
8. informa1555 1037 28.06.18 15:12 Сейчас в теме
(7) Она может найти обученный объект на любом фоне если знает что искать. У приведенных алгоритмов те же проблемы с фоном
9. bayce 24 13.09.18 11:01 Сейчас в теме
Добрый день,
Можно ли использовать программу для промышленного применения?
10. informa1555 1037 15.09.18 09:36 Сейчас в теме
(9) Здравствуйте! Да можно - там нет каких либо ограничений для использования, включая юридические. Если она вам подходит, используйте пожалуйста. Я использую отдельную сборку из которой выкинул лишние слои алгоритма для повышения скорости , "загрубления" и заточку под конкретный набор изображений.
11. user1089784 15.11.18 08:45 Сейчас в теме
Добрый день,
Существует производственная задача определения количества профилей в упаковке, часто упаковщики недокладывают или перекладывают лишнего. Скажите пожалуйста, ваше приложение может распознавать одинаковые образы (профили) и выдавать их количество?
12. borman 76 07.12.18 12:10 Сейчас в теме
Добрый день! Есть желание заказать индивидуальную разработку, будьте добры, напишите мне в личку, а то по новым правилам сайта я не могу первым начать переписку. Спасибо
13. izidakg 150 24.06.19 16:18 Сейчас в теме
можно еще раз для тех кто не понял?
приложенный dt файл содержит опубликованное приложение или это только связка с ним?
14. informa1555 1037 24.06.19 17:15 Сейчас в теме
(13) Не, приложуха сама есть в гугл-плее. А тут просто веб-сервис на 1С который принимает от нее идентификаторы распознанных образов
15. izidakg 150 25.06.19 00:02 Сейчас в теме
(14) а исходниками приложения делитесь?
Оставьте свое сообщение