[Из песочницы] Алгоритм распознавания образов обучающийся с одного раза (One-Shot learning)

Введение

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

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


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

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

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


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


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

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


gx7gdu54yygq1ersfsfpw512yem.jpeg

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


cjvkiu2w7-tbu6gbwxuwqlzwfni.jpeg

Для того чтобы получить вектора изображение проходит несколько стадий обработки:


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


qv8vcjq4onqsy3lrt6gs74lw0h8.jpeg

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


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

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

Общая схема работы алгоритмов:


gxp3w1bu-yvpcoc4iqblen-z2oy.jpeg

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

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

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

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


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

Честно говоря я все усилия сконцентрировал на самом алгоритме. Хотя т.к. я работаю с среде бизнес решений и автоматизации производства то одно применение я вижу — распознавание продукции на складах и производственных линиях — тут как раз нет больших датасетов — то образец надо показать 1 раз после чего распознавать. Как привязка штрих кодов только без штрих кодов. Ну, а вообще применение такое же как и у любого другого алгоритма распознавания. Применение обусловлено возможностями и ограничениями алгоритма.


Работа тестового приложения


xchcvj5xn2sxm44tqdpsvrq1ycs.jpeg

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

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

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

© Habrahabr.ru