Русский
Русский
English
Статистика
Реклама

Распознавание образов

Эволюция баркода

17.06.2020 12:21:27 | Автор: admin
Баркод, безусловно, относится к одному из тех изобретений человечества, которые изменили течение нашей жизни. Благодаря появлению штрихового кодирования и его последующей эволюции, многие обыденные действия не только значительно упростились и ускорились, но иногда и приобрели неожиданные формы. В процессе нашей деятельности по разработке и улучшению алгоритмов интеллектуального распознавания документов (IDR) и движка распознавания баркодов Smart BarcodeReader мы постоянно систематизируем знания в предметной области. Понимание того, как развивается технология, позволяет нам совершенствовать наши разработки, делать их более быстрыми, точными и эффективными. Сегодня мы расскажем о том, как эволюционировал (и продолжает эволюционировать) баркод от линейного черно-белого рисунка к многомерной конструкции.



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

Идея кодирования товаров появилась одновременно с идеей организации работы идеального супермаркета, разработанной студентом Гарвардской школы бизнеса Уоллесом Флинтом в начале 1930-х годов. Предложенное техническое решение предполагало, что покупатель самостоятельно формирует перечень покупок на складе, делая проколы в специальной перфокарте покупателя. На кассе эта перфокарта по задумке должна была считываться специальным устройством, товары подавались при помощи специального транспортера, а процесс обслуживания был быстрым и для покупателя, и для продавца. Главная проблема заключалась в том, что на тот период технологии и оборудование для обслуживания подобных процессов практически отсутствовали: ЭВМ, которая требовалась бы для организации считывания и обработки информации подобного класса была бы слишком громоздка и дорога.

Следующий подход к кодированию товарного ассортимента был предпринят в 1948 году, когда аспирантами-энтузиастами из Дрексельского технологического института (США) началась проработка технологии сбора аналитической информации о покупках непосредственно на кассах в супермаркетах на основании маркировки товаров. Тогда группа исследователей создала гибрид технологии оптической звуковой дорожки (optical soundtrack) и азбуки Морзе. В классической технологии оптической звуковой дорожки по краю кинопленки наносится покрытие с неравномерной плотностью. Эта неравномерность приводит к тому, что интенсивность луча проектора, проходящего через него, также изменяется. Эти колебания яркости и преобразуются в звук.

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

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

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

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

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

В конце 60-х годов в США началась разработка универсальной системы нумерации товаров как средства идентификации. Система штрихового кодирования, которую начали применять в торговле, была разработана в 1972 году и получила название UPC Universal Product Code. Штрих-коды этой системы начали присваивать всем видам товаров, производимым и зарегистрированных в США и Канаде. Одноименная организация начала активную пропаганду и внедрение использования штрих-кодов в промышленность и торговлю. Первое историческое считывание штрих-кода стандарта UPC в рознице произошло в американском супермаркете в 1974 году.

С 1977 года в Западной Европе для идентификации потребительских товаров стала применяться аналогичная американской система под названием Европейский артикул (EAN European Article Numbering). Сегодня именно эта ассоциация и занимается распределением штрих-кодов для производителей товаров. Чтобы избежать дублирования номеров, штрих-коды товарам выдаются централизованно международной ассоциацией, включающей 98 организаций из 100 стран мира. Производитель может получить штрих-код для своего товара, предварительно зарегистрировавшись в этой ассоциации.

Штрих-коды семейств UPC и EAN оперируют достаточно небольшим алфавитом, позволяющим закодировать достаточно ограниченный объем информации. UPC, используемый в США, состоит из 12 символов, EAN из 13 цифр и является немного усовершенствованной модификацией кода UPC. Кодирующие символы это вертикальные полосы различной ширины и пробелы между ними. В стандартных линейных кодах зашифрована информация о стране происхождения товара, организации-изготовителе, непосредственно код товара. Для проверки корректности кода в конце размещается контрольная цифра и специальный знак, указывающий на то, что товар производится по лицензии.


Теперь посмотрим на код с точки зрения структуры и принципов кодирования. Здесь мы подробно разберем только один стандартизированный штрих-код типа UPC-A, чтобы показать: принципы кодирования, которые применяются значительно сложнее, чем кажутся на первый взгляд. Эта сложность обеспечивает безошибочность распознавания за счет минимизации риска неверного считывания.



Штрих-код типа UPC-A код разделен на 2 равные части и отображается в виде темных (штрихов) и светлых (пробелов) полос, которые кодируют 12-значный номер UPC-A. Каждая цифра это уникальный набор из 2 штрихов и 2 пробелов переменной ширины в 1, 2, 3 или 4 модуля (в данном случае минимальная дискретная ширина полосы). При этом общая ширина кодирующих полос для каждой цифры остается неизменной 7 модулей. Таким образом содержательная часть товарного кода UPC-A кодируется в 84 единицах.

Многие задавались вопросом, почему на разных штрих-кодах одинаковые цифры могут быть несколькими разными способами (некоторые даже строили на сей счет конспирологические теории). Делов в том, что алгоритм кодирования штрих-кода не совсем линейный. В правой и левой частях кода цифры кодируются неодинаково: чередование штрихов и пробелов в цифрах происходит по трем наборам последовательностей (A, B и С). В последовательности А темных модулей всегда нечетное количество, в наборах В и С четное. При этом набор В представляет собой инверсию набора а (штрихи заменены пробелами и наоборот), а набор С зеркальное отражение набора В. Знаки символа в числовых наборах А и В всегда начинаются слева со светлого модуля и заканчиваются справа темным модулем, а в числовом наборе С начинаются слева с темного модуля и заканчиваются справа светлым модулем. В левой стороне при кодировании цифр используются наборы А или В в зависимости от позиции цифры в коде, правая сторона кодируется набором C. Алгоритмы кодирования подробно прописаны в стандартах. Например, в этом.

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

Форматы штрих-кодов постоянно совершенствуются и меняются. На сегодняшний день помимо принятых в международном товарообороте стандартных Universal Product Code и European Article Numbering существует более 300 стандартов штрих-кодирования.

С 2005 года принят международный стандарт, в котором используются три основные типа кодирования информации о товарах:

  • EAN-8 (сокращённый) кодируется 8 цифр.
  • EAN-13 (полный) кодируется 13 цифр (12 значащих + 1 контрольная сумма).
  • EAN-128 позволяет кодировать любое количество букв и цифр, объединенных в регламентированные группы.

В отличие от EAN-8 и EAN-13, кодом EAN-128 (GS1-128) используется производителями, перевозчиками и торговыми компаниями для обмена данными о перевозимых грузах. В этом, более длинном коде, может содержаться расширенная информация, такая как номера накладных, индексы пунктов назначения, объемы перевозимого груза, коды товара и серийные номера изделий, сроки годности и пр.

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

Эра 2-D


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

Кроме этого возникала необходимость маркировать кодами буквально все: не только, допустим, узлы агрегатов, но и отдельные детали. Поэтому возникала необходимость миниатюризировать код и повысить плотность кодируемой информации на единицу площади.

В двумерном коде, как и следует из названия, кодирование происходит не по одному направлению, а по двум. Действительно, если расположить несколько одномерных кодов в виде чередующихся фрагментов, получится простейший двумерный код типа Stacked Linear (составной линейный). Если мы упакуем модули в квадрат получится матричный баркод (Matrix).

Пример составного линейного баркода PDF417, появившийся в 1991 году и запатентованный в 1993. Код PDF417 состоит из строк, образуемых словами набором из чередующихся штрихов и пробелов (4 штриха, 4 пробела первое число из названия кода). Общая длина каждого слова 17 модулей (второе число в названии кода).

Помимо собственно содержательных слов, каждая строка состоит из старт-паттерна (крайнего левого набора, ключевых слов (индикаторов они занимают крайние позиции на строке), необходимых для коррекции ошибок, и стоп-паттерна (Впрочем, существует также и так называемый усеченный PDF417 (truncated), где исключен индикатор правой строки и уменьшен шаблон остановки до одной линии. Таким образом, усеченные PDF417 занимают меньше места, но они более восприимчивы к неправильному прочтению. Такой вариант PDF417 используют только там, где риск повреждения изображение кода минимальный). Так как все слова имеют одинаковую длину, размещенные одна под другой строки образуют колонки. В самом коде PDF417 как количество строк, так и количество столбцов может варьироваться: код может содержать от 3 до 90 строк, и иметь ширину от от 3 до 30 столбцов включительно, не считая столбцов со словами индикаторами. Подробная статья про кодирование PDF417 недавно выходила на Хабре здесь, а о возможности его ручного декодирования здесь.



Особенность кода PDF417 заключается в возможности кодировать информацию в текстовом режиме, числовом режиме и режиме данных (байт-режиме).

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

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

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

Код в матрице


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

Код Data Matrix


Код DataMatrix был изобретен компанией International Data Matrix в середине 1980-х для программы Space Shuttle, где требовалась маркирровка большого количестко деталей. Data Matrix был разработан до PDF417, а не предшествовал ему, как указывается в некоторых источниках. Важное преимущество кода его компактность и простота нанесения. В настоящее время Data Matrix описывается соответствующими стандартами ISO.



DataMatrix это двумерный штрих-код, который может хранить до 3116 цифр и до 2335 букв. Информация в баркоде Data Matrix кодируется черными и белыми квадратами (модулями) при этом минимальный линейный размер модуля 0.255 мм.

Шаблон поиска (finding pattern) в виде буквы L две сплошные линии на внешней стороне кода Data Matrix.Этот шаблон позволяет сканеру штрих-кода задать изображению правильную ориентацию и считать информацию в правильном порядке.

Второй важный шаблон, необходимый для понимания кода машиной, шаблон синхронизации (clocking pattern, clock track). Он необходим для информирования системы считывания о количестве модулей в матрице и для правильного распознавания сетки, на которой размещены модули.

Зона тишины (quiet zone) это область отделяющая границу штрих-кода от фона и других изображений. Для Data Matrix ширина зоны тишины равна линейному размеру используемого модуля. Маленькие габариты для зоны тишины позволяют минимизировать площадь нанесения Data Matrix на поверхность.

Специфика Data Matrix позволяет читать его как в прямом так и отраженном свете (то есть при использовании инвертированного изображения, при котором светлые модули становятся темными).

Еще одно преимущество Data Matrix, что от квадратные модули могут быть заменены на круглые. Это дополнительно расширяет возможности использования различных технологий нанесения, например в виде тиснения или ударной гравировки. Впрочем, эта же технология замены квадратного модуля на круглый взята на вооружения и в других разновидностях кодов, например в QR-коде.

Стандартизированный код Data Matrix сегодня рассматривается как ключевое звено идентификации и маркировки фармацевтических товаров и медицинских изделий. С 1 июля 2020 года маркировка кодами Data Matrix станет обязательной для всех лекарств, находящихся в обороте в России.

Подробный процесс создания Data Matrix описан здесь.

Код AZTEC


Баркод типа Aztec появился в 1995 году, как пишут, в результате объединения лучших практик разработки баркодов предыдущих поколений. Вид и структура кода Azteс разработана таким образом, чтобы она была одинаково удобна как для нанесения и считывания. Символы в целом квадратные на квадратной сетке с квадратным центральным прицелом из концентрических темных и светлых квадратов типа яблочка мишени (в англоязычных описаниях используется термин bulls eye).

Самый маленький символ Aztec Code имеет площадь 15 x 15 модулей, а самый большой 151 x 151. Самый маленький символ Aztec Code кодирует 13 цифровых или 12 буквенных символов, тогда как самый большой символ Aztec Code кодирует 3832 цифровых или 3067 буквенных символов.



В этом материале мы не ставим своей задачей подробно разбирать каждый код в отдельности, тем более, что про Aztec великолепно написано во всех подробностях на Хабре здесь.

QR-код


Добрались до самых, пожалуй, распространенных кодов, которые встречаем на каждом шагу.

QR код это еще одна разновидность матричного кода. Его название происходит от английского Quick Response Быстрый Отклик. Он был создан компанией Denso-Wave в 1994 году в Японии для внутреннего рынка (отличие QR-кода от других двумерных баркодов в том, что этот код позволяет кодировать символы японского (вернее, пришедшего из китая в японию) письма кандзи. Также в QR коде может быть заложена избыточная информация, которая позволяет закодировать определенные действия для программы смартфона или сканера для считывания.

Принципы кодирования QR-кода описаны достаточно подробно и их можно легко найти. Алгоритм того, как читать штрих-код не не сканером, а глазами, можно прочитать, например, здесь.

В таком QR-коде можно легко закодировать адрес интернет-страницы, которая будет открываться при наведении на нее мобильного телефона:



А в этом QR-коде содержится не только адрес интернет-страницы, но и номер телефона, адрес электронной почты, почтовый адрес. Для создания карточки контакта достаточно навести на QR-код мобильный телефон, и информация будет автоматически распознана, а данные внесены в систему.



При этом даже наличие логотипа нашей компании, закрывающего около 10% кода, не мешает корректно распознавать всю закодированную информацию.

Ниже пример QR-кода самой большой размерности, который позволяет закодировать до 1852 символов.



Перечисленные баркоды QR-коды позволяют кодировать цифровые и текстовые данные примерно с одинаковой эффективностью. Согласно сравнению, приведенному на сайте РИТ-сервис, специализирующейся на обработке штрих-кодов, QR-код позволяет кодировать большие объёмы цифровых данных на меньшей площади при одинаковом размере модуля по сравнению с Aztec и Data Matrix кодировать большие объёмы цифровых данных. Код Data Matrix уступает QR коду при кодировании более 88 цифр, Aztec уступает QR-коду при кодировании более 170 цифр. Но по эффективности кодирования текста QR-код значительно уступает Aztec, а Data Matrix превосходит только при объёме текста большем 298 символов. Однако, при кодировании текста набранного прописными (заглавными) буквами эффективности QR-код и Aztec близки, а Data Matrix уступает QR-коду уже при кодировании 88 букв.

Что объединяет все эти коды?


Машине важно понимать, что перед ней код, где находится его начало и конец. Для этого используются зоны тишины, специальные пограничные паттерны и прицелы. Кроме этого, машине необходимо понимать, в каком формате записаны данные, то есть как производить декодирование в виде цифр, цифро-буквенного текста, или в формате данных. Машина также должна иметь возможность скорректировать ошибки, чтобы случайное выпадение нескольких пикселов изображения баркода не приводило к его полной нечитаемости. Коррекция ошибок в кодах DataMatrix, Aztec, QR осуществляется с помощью кодов Рида-Соломона, исправляющих ошибки чтения и позволяющие распознавать данные даже в сильно испорченных кодах (вплоть до 30% поверхности).

Зачем вообще нужны баркоды?


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

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

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

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

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

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


Каждый баркод должен быть распознан. Если он не может быть распознан, то из баркода он превращается в нераспознаваемый художественный орнамент.

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

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

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

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

А что дальше?


Где два измерения, там 3 и 4. В середине 2006 года Японская компания Content Idea of ASIA c гордостью заявили о том, что они изобрели первый в истории 3D-код. В PM-коде (от образовано от paper memory бумажная память ) в качестве третьего измерения к двумерному QR-коду был добавлен цвет. Добавление цветной компоненты, по заявлению изобретателя Татсуи Онода, если в черно белом двумерном QR-коде можно зашифровать 3 кб информации, то в трехмерном до 720 (то есть в 240 раз больше). Вместо ссылки на изображение, используя топологию цветного 3D-кода, можно зашифровать картинку целиком, а также небольшие видео и аудио фрагменты. Технология получила патенты в Японии и Европе. Судя по всему, проект развивался до 2013 года, а к настоящему моменту заморожен или закрыт. Сайт японской компании-изобретателя не обновляется с 2013 года, а скачать приложение в официальных магазинах приложений уже невозможно. (При желании его можно скачать с некоторых зеркал в сети и на размещенных на сайте разработчика образцах посмотреть, как оно работает).



В 2010 году Microsoft пошла дальше объявила о создании новой концепции высокоплотных цветных баркодов (High Capacity Color Barcode (HCCB)), где код был представлен уже в виде той же QR-подобной матрицы, однако в качестве элементов кода выступали не черные квадратные модули, а цветные (4 или 8 цветов) треугольники, каждый из которых занимал ячейки.



Проект HCCB тоже просуществовал до 2013 года: тогда Microsoft объявила о том, что проект не будет поддерживаться и был закрыт в 2015.Недавно в сети появилась информация о том, что Apple разрабатывает новые типы кодов, которые будут доступны в будущих модификациях ОС. Речь идет о круглых баркодах, где информация кодируется в виде 4-х цветных капель размещенных по центру и по периметру круга.

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

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

В качестве послесловия


В 2013 году появилась забавная программа для мобильников Barcode KANOJO, которая декодировала (или делала вид, что декодировала) баркод не совсем привычным способом. Вместо заложенного набора символов на экране мобильного появлялась виртуальная подруга (kanojo) персонаж аниме соответствующая просканированному коду. С ней можно было дружить, завоевывать доверие (и любовь???). Проект просуществовал достаточно недолго, персонажи не генерировались а, скорее всего, просто выбирались из некоторого набора созданных заранее с внешнего сервера данных, который сейчас недоступен.
Подробнее..

Бизнес-идея для программистов. Совершенно незанятая ниша на рынке программ

28.12.2020 16:18:38 | Автор: admin

Есть такой вид спорта - спортивное ориентирование. В нём есть задачи, которые просто вопят о программной реализации на смартфонах. Но пока программисты обходили своим вниманием этот рынок программ.

Пример участка карты с контрольными пунктамиПример участка карты с контрольными пунктами

1. Что такое "Спортивное ориентирование"

В некой природной области (лес, горы) собирается толпа увлечённых людей. В начале соревнования Вам дают карту, на ней обозначены "контрольные пункты" - места где в реальности расположены призмы, компостеры или станции электронной отметки. В общем пункты, которые надо найти и одним из регламентированных способов подтвердить, что Вы на них были. Пункты эти расположены хаотично, рассыпаны облаком на карте. Каждый контрольный пункт имеет свою "цену". Обычно в часах или минутах. Если Вы не "взяли" контрольный пункт (КП), то его цена прибавляется к вашему времени прохождения дистанции. Своего рода - штрафы за невзятие. Побеждает тот, кто финиширует с минимальным временем прохождения дистанции. В принципе, можно сразу пробежать от старта до финиша, не собирая ничего, но полученные штрафы добавятся ко времени прохождения дистанции и оно будет огромным. Но бывает, что контрольные пункты находятся сильно в стороне от основного облака КП или находятся в сложнопроходимой местности. Тогда может получиться, что на взятие КП будет потрачено больше времени, чем штрафное время за его невзятие.

2. Задача планирования маршрута

Ориентировщики обычно идут/бегут "по азимуту" - по прямой от КП к КП. Спортсмены могут развивать скорость до 6 км/ч даже по слегка заваленному и заросшему лесу. Но вариантов последовательности взятия КП может быть множество. Программисты, конечно же, скажут, что это банальная задача коммивояжёра. Да, с небольшими отягощениями. Местность проведения соревнований обычно очень разнообразна по ландшафту: болота, редколесья, поля, пашни, заросшие вырубки, ручьи, завалы, пески, непроходимые ветровалы, овраги, холмы, канавы и многое другое. Очевидно, что по разному ландшафту можно пройти с разной скоростью. По чистому грейдеру (грунтовой дороге, выровненной бульдозером) можно пробежать со скоростью около 6км/ч, по болоту вы будете вязнуть со скоростью 1,5-2км/ч.

Бывают два типа соревнований. В первом варианте спортсменам дают карту до старта и у них есть время для планирования маршрута. Во втором варианте карту дают на старте и время начинает отсчёт от времени выдачи карты, и спортсмены решают задачу на ходу. Когда есть запас времени до старта ориентировщики пользуются методом "булавок и нитки". Участник знает свою среднюю скорость по лесу, знает время закрытия финиша (максимальная длительность прохождения дистанции. Помножив одно на другое получает приблизительный километраж дистанции. Этот километраж умножается на масштаб карты и отмеривается нитка полученной длины. Например, масштаб карты - 500 метров в одном сантиметре, ориентировщик планирует маршрут 45км, отрезает нитку 22,5 сантиметра. Затем кладёт карту на пенку (коврик), точки контрольных пунктов, которые планирует брать, накалывает булавками, затем проматывает нитку через все булавки.

3.Собственно бизнес-идея для программистов

Нужна программа для смартфона. Для Андроида (никогда не видел, чтобы по лесу бегали с айфонами). Встраивание рекламы смысла почти не имеет, там где будут пользоваться этой программой зачастую не ловит интернет. Программа может быть платной в разумных пределах (не более 600р/месяц). Программа должна поддерживать векторные форматы карт, которые есть в открытом доступе (типа OSM) и работать с ними. При фотографировании выданной на соревнованиях карты программа должна распознать характерные узловые точки на фотографии и привязать их к загруженной векторной карте. Программа должна распознать на фотографии отметки контрольных пунктов и привязать их к загруженной векторной карте - они обозначаются красным кружком с номером тоже красного цвета, ничего другого на карте этими условными обозначениями не отмечают. После чего рассчитать различные варианты маршрута и выдать их клиенту - минимальные штрафы, оптимальное время прохождения дистанции, ландшафты с максимальной средней скоростью. Программа должна принимать информацию от пользователя о взятии КП и динамически перестраивать маршрут с учётом реальной скорости пользователя.

Заключение

Если программа будет содержать все перечисленные функции, то гарантирована обширная аудитория. Только в России спортивным ориентированием занимается около 149 тысяч человек (данные на 30 апреля 2020г.). Это только в России... в мире это в разы более крупная аудитория. Примерно половина спортивных ориентировщиков - завсегдатаи соревнований. Они точно захотят воспользоваться такой программой, дающей тактическое преимущество. Если предположить месячную абонплату в 600 рублей (как у знаменитой Strava) у половины из 149 000человек - это почти 45 миллионов в месяц... А если добавить английскую, французскую, итальянскую, немецкую и испанскую версию... Программ таких нет ещё. Совсем. Требуемые технологии уже есть. Кто первый напишет такую программу, будет иметь шикарный куш.

Подробнее..

Сегментация данных с видеокамеры

28.11.2020 02:16:23 | Автор: admin

Введение

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

Разметка данных

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

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

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

Рис. 1 Программа разметки кадров видеопотокаРис. 1 Программа разметки кадров видеопотока

Тренировка нейросети для сегментации изображений

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

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

Использование натренированной сети для сегментации изображений

Последний шаг, это использование натренированной сети. Рассмотрим результат тренировки на 4 кадрах видеопотока (да, да, да ... выборка очень маленькая, но задача факультативная, чтобы посмотреть как работает, а не создание массового продукта) и 60 эпох тренировки используя архитектуру сети DeepLab v3+ (основанная на ResNet-18). Результат приведен на Рис. 2.

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

Рис. 2 Использование быстронатреннированной нейросети для сегментации изображений Рис. 2 Использование быстронатреннированной нейросети для сегментации изображений

Использование результатов сегментации

Данную камеру можно использовать в качестве анализатора пробок на дороге, для этого можно создать маску (Рис. 3 и 4), в пределах которой анализируется количество присутствующих машин.

Рис. 3 Создание маски для интересующего участка дорогиРис. 3 Создание маски для интересующего участка дорогиРис. 4 Созданная маска интересующего участка дорогиРис. 4 Созданная маска интересующего участка дороги

Таким образом, нам необходимо сегментировать изображение только на интересующем участке (Рис. 5 и 6).

Рис. 6 Сегментация интересующего участка дорогиРис. 6 Сегментация интересующего участка дороги

Для упрощения задачи подсчета количества автомобилей, можно просто считать количество пикселей дороги и автомобилей, и по процентному соотношению выставлять бальное значение индекса загруженности (Рис. 7 и 9). Дополнительно рассмотрим случай когда дорога сильно загружена (Рис. 8).

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

Рис. 7 Процентное соотношение площади автомобилей к площади дороги и ее элементов составляет ~3%Рис. 7 Процентное соотношение площади автомобилей к площади дороги и ее элементов составляет ~3%Рис. 8 Анализ загруженности дороги в загруженное времяРис. 8 Анализ загруженности дороги в загруженное времяРис. 9 Процентное соотношение площади автомобилей к площади дороги и ее элементов составляет ~54%Рис. 9 Процентное соотношение площади автомобилей к площади дороги и ее элементов составляет ~54%

Дополнительные варианты использования результатов сегментации

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

Вывод

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

P.S. Если кто знает, каким софтом можно максимально просто записывать видеопоток с ютуб стрима?) Просто камеры пишут данные в циклический буфер (последние 12 часов) в виде ютуб стрима, таким образом формируется видеонаблюдение, где каждый житель дома может просмотреть последние 12 часов.

Подробнее..

Распознавание Ворониных на фотографиях от концепции к делу

17.01.2021 16:22:22 | Автор: admin

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

Откуда родилась задача

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

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

Что будем использовать

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

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

Устанавливается face-recognition довольно легко, единственная важная оговорка - пользователям Mac и Linux (в моем случае была Ubuntu 20.04) необходимо вручную установить dlib. Процесс тоже довольно подробно описан в документации.

Немного о том, как все работает

face-regontion использует внутри себя обозначенный выше dlib и OpenFace. Сначала на фотографии выделяется лицо, а после на лице выделяется 68 значимых точек.

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

Подробно о том, как все устроено, можно узнать в оригинальном посте автора библиотеки.

От слов к реализации

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

На серверной стороне python с fast api. Эта давно зарекомендовавшая себя пара и тут продемонстрировала все свои красоту и удобство.

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

Далее мы загружаем в систему все наши тестовые фотографии, чтобы выделить кодировки лиц:

kostik = face_recognition.load_image_file("samples/kostik.jpg")kostik_encoding = face_recognition.face_encodings(kostik)[0]vera = face_recognition.load_image_file("samples/vera.jpg")vera_encoding = face_recognition.face_encodings(vera)[0]

После я реализовал набор функций, которые принимают на вход кодировку присланного изображения, сравнивают его с определенном персонажем, а после возвращают либо имя, либо вызов следующей функции. Выглядит все следующим образом:

def start_comparing(encoding):compare_result = face_recognition.compare_faces([kostik_encoding], encoding)if compare_result[0]:return "Костик"else:return compare_vera(encoding)def compare_vera(encoding):compare_result = face_recognition.compare_faces([vera_encoding], encoding)if compare_result[0]:return "Вера"else:return compare_nikolay(encoding)

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

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

Ну и в конце нужно реализовать обычный API-поинт, который умел бы принимать фото и возвращать результат:

@app.post("/recognize/")def create_file(file: UploadFile = File(...)):with open("samples/test.jpeg", "wb") as buffer:    shutil.copyfileobj(file.file, buffer)unknown_image = face_recognition.load_image_file("samples/test.jpeg")try:unknown_encoding = face_recognition.face_encodings(unknown_image)[0]result = start_comparing(unknown_encoding)except Exception as e:result = "Тут нет лица"else:passfinally:passreturn {"filename": file.filename, "result": result}

Получаем файл изображения, сохраняем его, кодируем и запускаем алгоритм сравнения. Если вы все сделали правильно, не забыли про CORS и написали веб-приложение (или использовали мое, с 2 формами), то теперь у вас готовая система, которая умеет отличать Галю от Лени. Итоговое решение можно найти тут. Если вдруг кто-то заинтересуется и будет скучать томными вечерами, то присылайте пулл-реквесты - буду рад!

Выводы

Теперь немного выводов:

  • Искусственный интеллект и распознавание изображений в частности - это очень сложный домен, который требует большого количество знаний и опыта. Однако существует ряд инструментов, которые помогут облегчить вам жизнь и внедрить необычные технологии "малой кровью".

  • Библиотека замечательно показала себя в учебном проекте. Использование ее будет вполне оправдано в хакатонах или же стартапах, где нужно как можно быстрее реализовать MVP.

  • Не стоит бездумно использовать библиотеку в больших проектах, все же лучше изучить ограничения производительности.

  • Навык импорта библиотеки в python и последующее использование ее методов не делает из программиста Senior Data Sciene Engineer. Область искусственного интеллекта куда как сложнее и глубже.

  • Математику все же забывать не стоит :)

Подробнее..

Распознавание дорожных знаков

24.04.2021 18:16:03 | Автор: admin

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

Набор данных дорожных знаков

В рамках этой статьи используется общедоступный набор данных, доступный вKaggle:GTSRB это мультиклассовая задача классификации одного изображения, которая проводилась на Международной совместной конференции по нейронным сетям (IJCNN) 2011. Набор данных содержит более 50 000 изображений различных дорожных знаков и классифицируется на 43 различных класса. Он весьма разнообразен: некоторые классы содержат много изображений, а некоторые классы - несколько изображений.

Изучение набора данных

В начале импортируем все необходимые библиотеки.

import osimport matplotlibimport numpy as npfrom PIL import Imagefrom tensorflow.keras.preprocessing.image import img_to_arrayfrom sklearn.model_selection import train_test_splitfrom keras.utils import to_categoricalfrom keras.models import Sequential, load_modelfrom keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropoutfrom tensorflow.keras import backend as Kimport matplotlib.pyplot as pltfrom sklearn.metrics import accuracy_score

Для тренировки нейронной сети будем использовать изображения из папки train, которая содержит 43 папки отдельных классов. Инициализируем два списка:dataи labels. Эти списки будут нести ответственность за хранение наших изображений, которые мы загружаем, вместе с соответствующими метками классов.

data = []labels = []

Далее, с помощью модуля os мы перебираем все классы и добавляем изображения и их соответствующие метки в списокdataиlabels. Для открытия содержимого изображения используется библиотекаPIL.

for num in range(0, classes):    path = os.path.join('train',str(num))    imagePaths = os.listdir(path)    for img in imagePaths:      image = Image.open(path + '/'+ img)      image = image.resize((30,30))      image = img_to_array(image)      data.append(image)      labels.append(num)

Этот цикл просто загружает и изменяет размер каждого изображения до фиксированных 3030 пикселей и сохраняет все изображения и их метки в спискахdataиlabels.

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

data = np.array(data)labels = np.array(labels)

Форма данных - (39209, 30, 30, 3), означает, что имеется 39 209 изображений размером 3030 пикселей, а последние 3 означают, что данные содержат цветные изображения (значение RGB).

print(data.shape, labels.shape)(39209, 30, 30, 3) (39209,)

Из пакета sklearn мы используем метод train_test_split() для разделения данных обучения и тестирования, используя 80% изображений для обучения и 20% для тестирования. Это типичное разделение для такого объема данных.

X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)(31367, 30, 30, 3) (7842, 30, 30, 3) (31367,) (7842,) 

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

def cnt_img_in_classes(labels):    count = {}    for i in labels:        if i in count:            count[i] += 1        else:            count[i] = 1    return countsamples_distribution = cnt_img_in_classes (y_train)def diagram(count_classes):    plt.bar(range(len(dct)), sorted(list(count_classes.values())), align='center')    plt.xticks(range(len(dct)), sorted(list(count_classes.keys())), rotation=90, fontsize=7)    plt.show()diagram(samples_distribution)
Диаграмма распределенияДиаграмма распределения

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

def aug_images(images, p):    from imgaug import augmenters as iaa    augs =  iaa.SomeOf((2, 4),          [              iaa.Crop(px=(0, 4)),               iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}),              iaa.Affine(translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}),              iaa.Affine(rotate=(-45, 45))              iaa.Affine(shear=(-10, 10))])        seq = iaa.Sequential([iaa.Sometimes(p, augs)])    res = seq.augment_images(images)    return resdef augmentation(images, labels):    min_imgs = 500    classes = cnt_img_in_classes(labels)    for i in range(len(classes)):        if (classes[i] < min_imgs):            add_num = min_imgs - classes[i]            imgs_for_augm = []            lbls_for_augm = []            for j in range(add_num):                im_index = random.choice(np.where(labels == i)[0])                imgs_for_augm.append(images[im_index])                lbls_for_augm.append(labels[im_index])            augmented_class = augment_imgs(imgs_for_augm, 1)            augmented_class_np = np.array(augmented_class)            augmented_lbls_np = np.array(lbls_for_augm)            imgs = np.concatenate((images, augmented_class_np), axis=0)            lbls = np.concatenate((labels, augmented_lbls_np), axis=0)    return (images, labels)X_train, y_train = augmentation(X_train, y_train)

После увеличения наш обучающий набор данных имеет следующую форму.

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)(36256, 30, 30, 3) (7842, 30, 30, 3) (36256,) (7842,)

Давайте еще раз проверим распределение данных.

augmented_samples_distribution = cnt_img_in_classes(y_train)diagram(augmented_samples_distribution)
Диаграмма распределения после аугментацииДиаграмма распределения после аугментации

На графика видно, что наш набор стал более сбалансирован. Далее из пакета keras.utils мы используем метод to_categorical для преобразования меток, присутствующих вy_trainиt_test, в one-hot encoding.

y_train = to_categorical(y_train, 43)y_test = to_categorical(y_test, 43)

Построение нейронной сети

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

Архитектура нашей модели:

  • 2 Conv2D слоя (filter=32, kernel_size=(5,5), activation=relu)

  • MaxPool2D слой ( pool_size=(2,2))

  • Dropout слой (rate=0.25)

  • 2 Conv2D слоя (filter=64, kernel_size=(3,3), activation=relu)

  • MaxPool2D слой ( pool_size=(2,2))

  • Dropout слой (rate=0.25)

  • Flatten слой, чтобы сжать слои в 1 измерение

  • Dense слой (500, activation=relu)

  • Dropout слой (rate=0.5)

  • Dense слой (43, activation=softmax)

class Net:  @staticmethod  def build(width, height, depth, classes):    model = Sequential()    inputShape = (height, width, depth)    if K.image_data_format() == 'channels_first':      inputShape = (depth, heigth, width)    model = Sequential()    model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=inputShape))    model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))    model.add(MaxPool2D(pool_size=(2, 2)))    model.add(Dropout(rate=0.25))    model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))    model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))    model.add(MaxPool2D(pool_size=(2, 2)))    model.add(Dropout(rate=0.25))    model.add(Flatten())    model.add(Dense(500, activation='relu'))    model.add(Dropout(rate=0.5))    model.add(Dense(classes, activation='softmax'))    return model

Обучение и проверка модели

Мы строим нашу модель вместе с оптимизатором Adam, а функция потерь это categorical_crossentropy, потому что у нас есть несколько классов для категоризации. Затем обучаем модель с помощью функции model.fit().

epochs = 25model = Net.build(width=30, height=30, depth=3, classes=43)model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])history = model.fit(X_train, y_train, batch_size=64, validation_data=(X_test, y_test), epochs=epochs)

Как вы можете видеть, наша модель обучалась в течении 25 эпох и достигла 93% точности на тренировочном наборе данных. С помощью matplotlib мы строим график для точности и потерь.

plt.style.use("plot")plt.figure()N = epochsplt.plot(np.arange(0, N), history.history["loss"], label="train_loss")plt.plot(np.arange(0, N), history.history["val_loss"], label="val_loss")plt.plot(np.arange(0, N), history.history["accuracy"], label="train_acc")plt.plot(np.arange(0, N), history.history["val_accuracy"], label="val_acc")plt.title("Training Loss and Accuracy")plt.xlabel("Epoch")plt.ylabel("Loss/Accuracy")plt.legend(loc="lower left")plt.show()
Training Loss and AccuracyTraining Loss and Accuracy

Тестирование модели на тестовом наборе

Набор данных содержит папку Test, а в файле Test.csv есть сведения, связанные с путем к изображению и метками классов. Мы извлекаем путь к изображению и метки из файла Test.csv с помощью фреймворка Pandas. Затем, мы изменяем размер изображения до 3030 пикселей и делаем массив numpy, содержащий все данные изображения. С помощью accuracy_score из sklearn metrics проверяем точность предсказаний нашей модели. Мы достигли 96% точности на этой модели.

y_test = pd.read_csv('Test.csv')labels = y_test["ClassId"].valuesimgs = y_test["Path"].valuesimages=[]for img in imgs:    image = Image.open(img)    image = image.resize((30,30))    images.append(img_to_array(image))X_test=np.array(images)pred = model.predict_classes(X_test)print(accuracy_score(labels, pred))0.958590657165479
Подробнее..

Распознавание волейбольного мяча на видео с дрона

14.06.2021 16:14:45 | Автор: admin

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

Основным фидбеком было - что за каменный век использовать олдскульные технологии, обучаешь нейросеть и погнали. Я пробовал, но не взлетело - очень часто мяч настолько размыт, что его даже человеческим глазом не отличить от случайной кляксы, и даже простой бинарный классификатор не дает стабильных результатов, чего уже говорить о детекторах и прочих YOLO.

В общем, я это дело подзабросил, но вот весной завел себе дрон и конечно же первым делом приспособил его для волейбольных съемок. Если поднять его на нужную высоту (12-15 метров), в кадр влезает вся площадка, что дает прямо неограниченные возможности для анализа.

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

Шум и никакого мячаШум и никакого мяча

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

Для сравнения - похожая подача при старом подходе выглядит вот так:

Делать нечего, придется искать другие подходы. У нас есть OpenCV, так что далеко идти все равно не придется. Вместо фона выделяем границы помощью фильтра Канни - и у нас есть черно-белый скетч для дальнейшего разбора.

      gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)      gray = cv.GaussianBlur(gray, (5, 5),0)      mask = cv.Canny(gray, 50, 100)

Если натравить на него детектор контуров - все прекрасно работает, мяч удается зацепить. Дальше подключается детектор траекторий и процесс идет как и в основном алгоритме.

      mask = backSub.apply(frame)      mask = cv.dilate(mask, None)      mask = cv.GaussianBlur(mask, (15, 15),0)      ret,mask = cv.threshold(mask,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)

И опять же для сравнения - тот же фрагмент с неподвижной камеры с границами:

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

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

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

Результат - гораздо лучше, шума меньше (но есть еще) и траектория мяча распознается достаточно четко.

Прошлые статьи на эту же тему

Подробнее..

Перевод - recovery mode Технология распознавания лиц тайная история

14.08.2020 12:15:32 | Автор: admin
Шестьдесят лет назад Вуди Бледсо (Woody Bledsoe) сын земледельца изобрёл технологию идентификации лиц. Но свидетельство о его причастности к открытию практически исчезло.

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

Около тридцати лет Вуди Бледсо был профессором Техасского университета в Остине и работал над развитием автоматизированных рассуждений и искусственного интеллекта. По воспоминаниям Ланса, сына Бледсо, профессор был восторженным учёным-оптимистом, который ещё в конце 1950 годов мечтал создать компьютер, наделённый человеческими возможностями и способный доказывать сложные математические теоремы, поддерживать разговор и прилично играть в пинг-понг.

Но в начале карьеры Бледсо увлечённо искал возможность научить машины распознавать лица недооценённую тогда, но потенциально мощную человеческую способность. Это были первые исследования по идентификации лиц (1960 года), и работа профессора привлекла интерес спецслужб США. Главные инвесторы Вуди, скорее всего, были подставными компаниями ЦРУ.

Распознавание лиц: благо и ящик Пандоры


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

Так, при помощи этой технологии в Китае правительство отслеживает представителей уйгурского этнического меньшинства, сотни тысяч которых поместили в лагеря для политических заключённых. А в США, по данным The Washington Post, Иммиграционная и таможенная полиция и ФБР проводит цифровой розыск: ищет подозреваемых в государственных базах данных водительских удостоверений иногда без предварительного обращения в суд.

В 2019 году расследование Financial Times показало, что исследователи из Microsoft и Стэнфордского университета собрали и выложили в открытый доступ большое количество пакетов данных с изображениями людей без ведома или согласия сфотографированных. Впоследствии эти данные были уничтожены, но исследователи техстартапов и одной китайской военной академии успели их заполучить.

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

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

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

Как всё начиналось. Метод кортежей


Вудро Вильсон (Вуди) Бледсо родился в 1921 году в многодетной семье земледельца-издольщика из Оклахомы. Был десятым ребёнком в семье и сколько себя помнил всегда помогал отцу по хозяйству. Обладал математическим складом ума. Окончил среднюю школу. Три месяца проучился в Университете Оклахомы, после чего Вуди призвали в армию в канун Второй мировой войны.

После войны Вуди изучал математику в Университете Юты, а затем уехал в Беркли для получения степени доктора наук. Закончив аспирантуру, Вуди занимался исследованиями в области ядерного оружия в правительственной корпорации Sandia в Нью-Мексико вместе с такими светилами, как Станислав Улам (Stanislaw Ulam), который участвовал в создании водородной бомбы.

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

Вуди Бледсо и его коллега Ибен Браунинг (Iben Browning) изобретатель-эрудит, авиаинженер и биофизик придумали метод, который впоследствии стал известен как метод кортежей (n-tuple).

Учёные начали с проецирования напечатанного символа скажем, буквы Q на прямоугольную сетку из клеток наподобие разлинованного листа бумаги. Каждой клетке-ячейке присваивался двоичный номер в зависимости от наличия или отсутствия в ней части символа: 0 для пустой клетки, 1 для заполненной. Затем ячейки случайным образом группировались в упорядоченные пары, как наборы координат. Теоретически группы могли включать любое количество ячеек, отсюда и название метода. Далее при помощи нескольких математических действий система присваивала сетке символа уникальное значение. А при столкновении с новым символом сетка этого символа сравнивалась с другими в базе данных до тех пор, пока не находилось ближайшее совпадение.

Суть метода состояла в том, что он позволял распознавать множество вариантов одного и того же знака: большинство Q, как правило, получали довольно схожие результаты по сравнению с другими Q. Лучше всего процесс работал с любым шаблоном, а не только с текстом. По словам Роберта С. Бойера (Robert S. Boyer), математика и давнего друга Вуди, метод кортежей помог определить область распознавания шаблонов. Это был один из первых шагов к вопросу: Как запрограммировать машину делать то, что делают люди?".

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

Спустя годы он вспоминал дикое волнение, которое испытывал, формулируя навыки для искусственного разума:


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




Исследования в компании Panoramic Research Incorporated


В 1960 году Вуди вместе с Ибеном Браунингом и ещё одним коллегой из Sandia основал компанию Panoramic Research Incorporated (Panoramic). Сначала они располагались в небольшом помещении в Пало-Альто, который ещё не был известен как сердце Кремниевой долины. В то время большинство компьютеров массивных устройств, которые хранили данные на перфокартах или магнитных лентах, размещались в офисах крупных компаний и правительственных лабораториях. Компания Вуди не могла себе позволить купить компьютер, поэтому учёные арендовали вычислительное время на такой машине у своих соседей, часто поздно вечером, когда оно было дешевле.

Бизнес Panoramic заключался в том, чтобы тестировать идеи, которые, как мы надеялись, перевернут мир.

По словам Нельса Уинклесса (Nels Winkless), писателя и консультанта, который участвовал в нескольких проектах Panoramic, а позже стал одним из основателей журнала Personal Computing, их задача заключалась в том, чтобы делать то, что другие люди находят слишком глупым.

Изобретения некоторых исследователей Panoramic получили широкую известность. Например, Хелен Чан Вульф (Helen Chan Wolf), пионер в программировании роботов, работала над созданием робота Шейки (Shakey the Robot). По мнению Института инженеров по электротехнике и радиоэлектронике, это первый в мире робот, воплощающий в себе искусственный интеллект.

Panoramic тщетно пыталась найти финансирование. Вуди сделал всё возможное для презентации технологии распознавания символов, в том числе представив изобретение Обществу справедливого страхования жизни и журналу McCall's. Но контракт так и не заключили.

На протяжении всего своего существования у Panoramic был, по крайней мере, один надёжный покровитель, который помогал ей держаться на плаву, Центральное разведывательное управление.

Если в бумагах Вуди Бледсо когда и были упоминания о ЦРУ, то, скорее всего, они были уничтожены в 1995 году. Но фрагменты сохранившихся материалов явно свидетельствуют о том, что в течение многих лет компания Вуди работала с подставными компаниями ЦРУ. Нельс Уинклесс, который приятельствовал с командой Panoramic, говорит, что компания, скорее всего, была создана благодаря финансированию агентства. Никто никогда не говорил мне об этом прямо, вспоминает Уинклесс, но так оно и было.

Согласно данным сайта the Black Vault, который занимается запросами по Закону о свободном доступе к информации, компания Panoramic Research Incorporated входила в число 80 организаций, работавших над проектом MK-Ultra. Это печально известная программа ЦРУ по контролю разума, где применялись психологические пытки без согласия людей. Через подставной исследовательский фонд the Medical Sciences Research Foundation компании Panoramic поручили заниматься подпроектами по изучению бактериальных и грибковых токсинов и дистанционному управлению деятельностью отдельных видов животных.

Дэвид Х. Прайс (David H. Price), антрополог из Университета Сен-Мартина, считал, что Вуди и его коллеги также получали деньги от Общества по изучению экологии человека. От имени этого общества ЦРУ предоставляло гранты учёным, чьи работы могли улучшить методы допроса, которые использовались агентством, или выступить в качестве прикрытия для таких исследований.

Но проведение самых значимых исследований компании Panoramic обеспечила другая фиктивная компания the King-Hurley Research Group (King-Hurley). Согласно серии исков, поданных в 1970 годах, ЦРУ использовало эту исследовательскую группу для закупки самолётов и вертолётов для секретных военно-воздушных сил агентства, известных как Air America. Некоторое время King-Hurley также финансировала психофармакологические исследования в Стэнфорде.

В начале 1963 года King-Hurley принимала разного рода презентации идей только от Вуди Бледсо. Он предложил провести исследование для определения целесообразности создания упрощённой машины для распознавания лиц. Опираясь на их с Браунингом работу по методу кортежей, Вуди хотел научить систему распознавать 10 лиц. То есть он планировал использовать базу данных из 10 фотографий разных людей и узнать, сможет ли машина идентифицировать новые фотографии каждого из них. Вскоре можно будет увеличить число людей до тысяч, писал Вуди. В течение месяца King-Hurley выдал ему разрешение на старт работ.

Первые эксперименты в области распознавания лиц


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

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

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

И вряд ли можно было бы с уверенностью утверждать, что их компьютеры справятся с этой задачей. Одной из основных машин была CDC 1604 со 192 КБ оперативной памяти примерно в 21 000 раз меньше, чем у обычного современного смартфона.

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

Работа над оцифровкой изображений проходила следующим образом. Исследователь снимал чёрно-белые фотографии участников проекта на 16-миллиметровую плёнку. Затем использовал сканирующее устройство, которое разработал Браунинг, чтобы преобразовать каждый снимок в десятки тысяч точек данных. Каждая точка должна была иметь значение интенсивности света в диапазоне от 0 (самая тёмная) до 3 (самая светлая) в определённом месте на снимке. Получалось слишком много точек для единовременной обработки компьютером, поэтому исследователь написал программу NUBLOB, которая нарезала изображение на образцы случайного размера и вычисляла для каждого уникальное значение наподобие тех, что присваивались по методу кортежей.

Над наклоном головы работали Вуди, Хелен Чан Вульф и ещё один исследователь. Сначала учёные нарисовали серию пронумерованных маленьких крестиков на левой стороне лица участника эксперимента от вершины лба до подбородка. Затем сделали два портрета, на одном из которых человек смотрел вперёд, а на другом повернулся на 45 градусов. Проанализировав местоположение крестиков на этих двух изображениях, экстраполировали данные на снимок лица с поворотом на 15 или 30 градусов. Загружали в компьютер чёрно-белую картинку размеченного лица, а на выходе получали автоматически крутящийся портрет страшноватый, точечный и удивительно точный.

Решения исследователей были оригинальными, но недостаточно эффективными. Через тринадцать месяцев после начала работы команда Panoramic признала, что им не удалось обучить машину распознать хотя бы одно лицо, не то что десять.

Рост волос, выражения лица и признаки старения этот тройной вызов представлял собой колоссальный источник изменчивости, написал Вуди в марте 1964 года в отчёте о проделанной работе для King-Hurley. Поставленная задача выходит за рамки текущего состояния области распознавания образов и современных компьютерных технологий. При этом Вуди рекомендовал финансировать больше исследований, чтобы попытаться найти совершенно новый подход к решению проблемы распознавания лиц.

Человеко-машинный подход к распознаванию лиц


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

Система, которую он предложил, была похожа на метод французского криминолога Альфонса Бертильона, который он создал в 1879 году. Бертильон описывал людей на основе 11 физических измерений, включая длину левой ноги и длину от локтя до конца среднего пальца. Идея состояла в том, что если провести достаточно измерений, то каждый человек станет уникальным. Метод был трудоёмким, но работал: при помощи него в 1897 году, задолго до широкого распространения дактилоскопирования, французские жандармы идентифицировали серийного убийцу Жозефа Ваше.

На протяжении 1965 года Panoramic пробовала создать полностью автоматизированную систему Бертильона для идентификации лиц. Команда пыталась разработать программу, которая могла бы определять носы, губы и другое при помощи светлых и тёмных участков на фотографии. Но их постигла неудача.

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

К проекту Вуди привлёк своего сына Грегори и его друга им дали 122 фотографии, на которых было изображено около 50 человек. Ребята сделали 22 измерения каждого лица, включая длину уха и ширину рта. Затем Вульф написала программу для обработки данных.

Машина научилась сопоставлять каждый комплект измерений с фотографией. Результаты были скромными, но неоспоримыми: Вульф и Вуди доказали, что система Бертильона теоретически работоспособна.

Их следующим шагом, в конце 1965 года, было создание более масштабной версии того же эксперимента, чтобы сделать человека более эффективным в их системе человек-машина. На деньги King-Hurley они приобрели планшет RAND устройство стоимостью 18 000 долларов, которое выглядело как планшетный сканер изображений, а работало как iPad. При помощи стилуса исследователь рисовал на планшете и на выходе получал компьютерное изображение относительно высокого разрешения.

Через планшет RAND провели новую партию фотографий, подчёркивая стилусом ключевые элементы лица. Этот процесс хотя и был сложным, но проходил гораздо быстрее, чем раньше: данные ввели примерно для 2 000 снимков, включая как минимум два изображения каждого лица. В час обрабатывали порядка 40 снимков.

Даже при такой, более крупной выборке команда Вуди с трудом преодолевала обычные препятствия.

По-прежнему не была решена проблема с улыбками, которые искажают лицо и кардинально меняют межлицевые измерения, а также со старением.

При попытке сопоставить фотографию Вуди 1945 года с фотографией 1965 года система сбивалась с толку. Она не видела большого сходства между молодым человеком с широкой улыбкой и густыми тёмными волосами и человеком более старшего возраста с мрачным выражением лица и поредевшей шевелюрой.


Фото Вуди Бледсо из исследования 1965 года. Фотограф: Dan Winters

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

В марте 1965 года за 50 лет до того, как Китай начал использовать совпадение паттернов лица для идентификации этнических уйгуров в провинции Синьцзян Вуди предложил Управлению перспективных исследовательских проектов (Advanced Research Projects Agency ARPA) при Министерстве обороны США поддержать Panoramic в изучении использования черт лица для определения расового происхождения человека. Существует очень большое количество антропологических измерений людей со всего мира, которые принадлежат к различным расовым и экологическим группам, писал Вуди. Это обширное и ценное хранилище данных, которое было собрано с большим трудом и крупными затратами, но не использовано должным образом. Согласилась ли ARPA финансировать этот проект, остаётся неизвестным.

Вуди вкладывал в Panoramic тысячи долларов из собственных средств без гарантии их возврата. А тем временем его друзья из Техасского университета в Остине уговаривали его устроиться в университет, завлекая стабильной зарплатой. И в январе 1966 года Вуди покинул Panoramic. Вскоре после этого компания закрылась.

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

Самый успешный эксперимент Вуди Бледсо по распознаванию лиц


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

Как и прежде, финансирование проекта, судя по всему, поступило от правительства США. В документе 1967 года, рассекреченном ЦРУ в 2005 году, упоминается внешний контракт на систему распознавания лиц, что позволило бы в сто раз сократить время поиска.

Основным партнёром Вуди по проекту был Питер Харт (Peter Hart), инженер-исследователь Лаборатории прикладной физики Стэнфордского научно-исследовательского института. (Сейчас известный как SRI International. Институт отделился от Стэнфордского университета в 1970 году из-за разногласий в кампусе по поводу сильной зависимости института от военного финансирования.)

Вуди и Харт начали с базы данных из порядка 800 снимков по два снимка 400 взрослых мужчин европеоидной расы. Сфотографированные различались по возрасту и повороту головы. При помощи планшета RAND учёные зафиксировали 46 координат для каждой фотографии, в том числе пять значений для каждого уха, семь для носа и четыре для каждой брови. На базе предыдущего опыта Вуди по нормализации вариаций изображений применили математическое уравнение, чтобы повернуть головы в анфас. Затем, для учёта разницы в масштабах, увеличили или уменьшили каждое изображение до стандартного размера, где опорной метрикой было расстояние между зрачками.

Задача системы состояла в том, чтобы запомнить одну версию каждого лица и использовать её для идентификации другого.

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


Фотограф: Dan Winters

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

По итогам обе программы справились с задачей примерно одинаково хорошо. А также оказались лучше соперников-людей. Когда Вуди и Харт попросили трёх человек сопоставить подгруппы из 100 лиц, даже самому быстрому из них понадобилось шесть часов. Компьютер CDC 3800 выполнил аналогичное задание примерно за три минуты, добившись стократного сокращения времени. Люди лучше справлялись с поворотами головы и плохим качеством фотосъёмки, но компьютер значительно превосходил в плане определения возрастных изменений.

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

В 1970 году, через два года после окончания сотрудничества с Хартом, робототехник по имени Майкл Касслер сообщил Вуди, что Леон Хармон (Leon Harmon) из Bell Labs планирует провести исследование по распознаванию лиц. Меня возмущает, что это исследование второго рода будет опубликовано и окажется в итоге лучшей системой человекмашина", ответил Вуди. Мне кажется, что при условии усердной работы Леон будет отставать от нас где-то на 10 лет к 1975 году. Должно быть, Вуди был разочарован, когда несколько лет спустя исследование Хармона попало на обложку журнала Scientific American, в то время как его собственная, более продвинутая работа хранилась в запасниках.

Использование метода Вуди Бледсо в современной технологии распознавания лиц


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

В 1973 году японский учёный-программист Такэо Канаде (Takeo Kanade) совершил большой скачок в технологии распознавания лиц.

На основе базы данных из 850 оцифрованных фотографий со Всемирной выставки в Суите (Япония) в 1970 году Канаде разработал программу, которая могла извлекать черты лица нос, рот и глаза без участия человека. Канаде удалось осуществить мечту Вуди об исключении человека из системы человек-машина.

За эти годы пару раз Вуди использовал свои знания в области распознавания лиц.

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

Только за последние 10 лет технология распознавания лиц научилась работать с несовершенствами, говорит Анил К. Джейн (Anil K. Jain), учёный-программист Мичиганского государственного университета и соредактор Руководства по распознаванию лиц (Handbook of Face Recognition).

Почти все проблемы, с которыми сталкивался Вуди, отпали. Cегодня есть неисчерпаемый запас оцифрованных изображений. Через социальные сети вы можете получать столько снимков лица, сколько захотите, говорит Джейн. А благодаря достижениям в области машинного обучения, объёму памяти и вычислительной мощности компьютеры эффективно самообучаются. Учитывая несколько простых правил, они могут анализировать огромные объёмы данных и создавать шаблоны практически для чего угодно, начиная от человеческого лица и заканчивая пакетом чипсов никаких замеров с помощью планшета RAND или метода Бертильона больше не требуется.

Даже учитывая то, как далеко зашло распознавание лиц с середины 1960 годов, Вуди Бледсо определил многие проблемы, которые ещё предстоит решить в этой области.

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

И хотя современным системам на основе глубокого обучения программист не даёт явного указания идентифицировать носы и брови, поворот Вуди в этом направлении в 1965 году задал направление развития отрасли на десятилетия. Первые 40 лет главенствовал именно метод, основанный на выделении признаков, говорит Такэо Канаде, в настоящее время профессор Института робототехники Карнеги-Меллона.

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

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

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

В 2019 году в ходе тестирования программного обеспечения Rekognition от Amazon 28 игроков НФЛ были ошибочно определены как преступники. Спустя несколько дней Американский союз защиты гражданских свобод предъявил иск Министерству юстиции США, ФБР и Управлению по борьбе с наркотиками на предмет получения информации об использовании ими технологии распознавания лиц от Amazon, Microsoft и других компаний. В отчёте Национального института стандартов и технологий за 2019 год, который протестировал код более 50 разработчиков программного обеспечения для распознавания лиц, говорится, что белые мужчины неверно сопоставляются с преступниками реже, чем представители других групп. В 2018 году пара учёных выступила с резкой критикой: Мы считаем, что технология распознавания лиц самый опасный механизм наблюдения, когда-либо изобретённый.

Весной 1993 года из-за дегенеративного заболевания БАС речь Вуди ухудшилась. Но он продолжал преподавать в Техасском университете до тех пор, пока его речь не стала неразборчивой. Он продолжал и исследования в области автоматизированных рассуждений пока не перестал держать ручку. До конца оставаясь учёным, Вуди делал записи своей речи, чтобы отслеживать развитие болезни.

Вуди Бледсо умер 4 октября 1995 года. В некрологе не упоминалась его работа по распознаванию лиц. На фотографии в некрологе седовласый Вуди смотрит прямо в камеру и его лицо озаряет широкая улыбка.



Комментарий Елены Герасимовой, руководителя направления Аналитика и Data Science в Нетологии


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

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


В 1998 году подходы к распознаванию рукописных цифр усовершенствовал Ян Лекун в его сети LeNet благодаря эволюции вычислительных мощностей, которых не было во времена исследований Вуди Бледсо

Технология распознавания лиц граничит с более продвинутой технологией генерации лиц, которая используется для, например, создания дипфейков и генерации лиц взрослых и детей, а также котиков, собак. Казалось бы, что проще сделать фото человека и загрузить его, условно, в электронный каталог одежды; или снять симпатичное видео с младенцем и игрушками; или научить нейронную сеть создавать изображение ребенка в одежде, интерьере или с игрушкой, которую мы планируем размещать в каталоге и таким образом демонстрировать? Ответ подскажет сумма инвестиций в компании разработчиков технологии создания фотореалистичных изображений только в США в 2019 году суммарный объём инвестиций составил более 500 млн долларов.



Генерация фотореалистичных изображений людей

Если вам интересна работа с данными, нейронными сетями, предлагаем познакомиться с нашими программами, обучение по которым опирается на научную базу и исследования:

  • Профессия Data Scientist. Премия Знак качества в номинации Подготовка профессионалов цифровой индустрии (2019).
  • Курс Deep Learning. На лендинге курса сможете познакомиться с примерами проектов в рамках курса и посмотреть, как проходит обучение.

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

Эксперимент в распознавании рукописных текстов на кириллице

16.12.2020 14:07:22 | Автор: admin

Введение

Распознавание рукописного текста (англ. Handwritten Text Recognition, HTR) - это автоматический способ расшифровки записей с помощью компьютера. Оцифрованный текст рукописных записей позволило бы автоматизировать бизнес процессы множества компаний, упростив работу человека. В данной работе рассматривается модель распознавания рукописного текста на кириллице на основе искусственной нейронной сети. В исследовании использовалась система SimpleHTR разработана Гаральдом, а также LineHTR, расширенной версией системыSimple HTR. Подробнее о SimpleHTR можно почитать здесь.

Датасет

В этом разделе опишу два типа наборов данных: Первый набор данных содержит рукописные цитаты на кириллице. Он содержит 21 000 изображений из различных образцов почерка (названия стран и городов). Мы увеличили этот набор данных для обучения, собрав 207 438 изображений из доступных форм или образцов.

Второй HKR для рукописной казахско-русской базы данных состоял из отдельных слов (или коротких фраз), написанных на русском и казахском языках (около 95% русского и 5% казахского слова/предложения, соответственно). Обратите внимание, что оба языка являются кириллическими написаны и разделяют одни и те же 33 символа. Кроме этих персонажей, в казахском алфавите есть еще 9 специфических символов. Некоторые примеры набора данных HKR показаны ниже:

Некоторые образцы набора данныхНекоторые образцы набора данных

Этот окончательный набор данных был затем разделен на обучающие (70%), валидация (15%) и тестовые (15%) наборы данных. Сам тестовый набор данных был разделен на два субданных (по 7,5% каждый): первый набор данных был назван TEST1 и состоял из слов, которые не были включены в обучающий и проверочный наборы данных; другой субдатасет был назван TEST2 и состоял из слов, которые были включены в обучение набор данных, но полностью различные стили почерка. Основная цель разбиения тестового набора данных на наборы данных TEST1 и TEST2 нужно было проверить разница в точности между распознаванием невидимых слов и слов, видимых на стадии обучения, но с невидимыми стилями почерка.

SimpleHTR модель

Предлагаемая система использует ANN, при этом для извлечения объектов используются многочисленные слои CNN с входной фотографии. Затем выход этих слоев подается в RNN. RNN распространяет информацию через последовательность. Вывод RNN содержит вероятности для каждого символа в последовательности. Для прогнозирования конечного текста реализуются алгоритмы декодирования в выход RNN. Функции CTC отвечают за декодирование вероятностей в окончательный текст. Для повышения точности распознавания декодирование может также использовать языковую модель. CTC используется для получения знаний; выход RNN представляет собой матрицу, содержащую вероятности символов для каждого временного шага. Алгоритм декодирования CTC преобразует эти символические вероятности в окончательный текст. Затем, чтобы повысить точность, используется алгоритм, который продолжает поиск слов в словаре. Однако время, необходимое для поиска фраз, зависит от размеров словаря, и он не может декодировать произвольные символьные строки, включая числа.

Операции: CNN: входные изображения подаются на слои CNN. Эти слои отвечают за извлечение объектов. Есть 5х5 фильтры в первом и втором слоях и фильтры 3х3 в последних трех слоях. Они также содержат нелинейную функцию RELU и максимальный объединяющий слой, который суммирует изображения и делает их меньше, чем входные данные. Хотя высота изображения уменьшается в 2 раза в каждом слое, карты объектов (каналы) добавляются таким образом, чтобы получить выходную карту объектов (или последовательность) размером от 32 до 256. RNN: последовательность признаков содержит 256 признаков или симптомов на каждом временном шаге. Соответствующая информация распространяется РНН через эти серии. LSTM-это один из известных алгоритмов RNN, который переносит информацию на большие расстояния и более эффективное обучение, чем типичные РНН. Выходная последовательность RNN сопоставляется с матрицей 32х80.

CTC: получает выходную матрицу RNN и прогнозируемый текст в процессе обучения нейронной сети, а также определяет величину потерь. CTC получает только матрицу после обработки и декодирует ее в окончательный текст. Длина основного текста и известного текста не должна превышать 32 символов

Модель SimpleHTR, где зеленые значки - это операции, а розовые- потоки данныхМодель SimpleHTR, где зеленые значки - это операции, а розовые- потоки данных

Данные: Входные данные: это файл серого цвета размером от 128 до 32. Изображения в наборе данных обычно не имеют точно такого размера, поэтому их исходный размер изменяется (без искажений) до тех пор, пока они не станут 128 в ширину и 32 в высоту. Затем изображение копируется в целевой образ размером от 128 до 32 дюймов Белый. Затем значения серого цвета стандартизированы, что упрощает процесс нейронной сети.

LineHTR модель

Модель LineHTR - это просто расширение предыдущей модели SimpleHTR, которая была разработана для того, чтобы позволить модели обрабатывать изображения с полной текстовой строкой (а не только одним словом), таким образом, чтобы еще больше повысить точность модели. Архитектура модели LineHTR очень похожа на модель SimpleHTR, с некоторыми различиями в количестве слоев CNN и RNN и размере входных данных этих слоев: она имеет 7 слоев CNN и 2 слоя Bidirectinal LSTM (BLSTM) RNN.

Ниже кратко представлен конвейер алгоритма LineHTR:

  • На входе изображение в градациях серого фиксированного размера 800 x 64 (Ш x В).

  • Слои CNN сопоставляют это изображение в градациях серого с последовательностью элементов размером 100 x 512.

  • Слои BLSTM с 512 единицами отображают эту последовательность признаков в матрицу размером 100 x 205: здесь 100 представляет количество временных шагов (горизонтальных позиций) в изображении с текстовой строкой; 205 представляет вероятности различных символов на определенном временном шаге на этом изображении)

  • Слой CTC может работать в 2 режимах: режим LOSS - чтобы научиться предсказывать правильного персонажа на временном шаге при обучении; Режим ДЕКОДЕР - для получения последней распознанной текстовой строки при тестировании

  • размер партии равен 50

Экспериментальные Материалы

Все модели были реализованы с использованием Python и deep learning библиотеки Tensorflow. Tensorflow позволяет прозрачно использование высоко оптимизированных математических операций на графических процессорах с помощью Python. Вычислительный граф определяется в скрипте Python для определения всех операций, необходимых для конкретных вычислений. Графики для отчета были сгенерированы с помощью библиотеки matplotlib для Python, а иллюстрации созданы с помощью Inkscape-программы векторной графики, аналогичной Adobe Photoshop. Эксперименты проводились на машине с 2-кратным " Intel Процессоры Xeon(R) E-5-2680, 4x " NVIDIA Tesla k20x и 100 ГБ памяти RAM. Использование графического процессора сократило время обучения моделей примерно в 3 раза, однако это ускорение не было тщательно отслежено на протяжении всего проекта,поэтому оно могло варьироваться.

SimpleHTR эксперименты

SimpleHTR модель-это обучение, валидация и тестирование на двух различных датасетах. Для того чтобы запустить процесс обучения модели на наших собственных данных, были предприняты следующие шаги:

Создан словарь слов файлов аннотаций

Файл DataLoader для чтения и предварительного владения набором данных изображений и чтения файла аннотаций принадлежит изображениям

Набор данных был разделен на два подмножества: 90% для обучения и 10% для проверки обученной модели. Для повышения точности и снижения частоты ошибок мы предлагаем следующие шаги: во-первых, увеличить набор данных, используя данные увеличение; во-вторых, добавьте больше информации CNN слоев и увеличение ввода размера; в-третьих, удалить шум на изображении и в скорописи стиле; В-четвертых, заменить ЛСТМ двусторонними ГРУ и, наконец, использование декодера передача маркера или слово поиска луча декодирование, чтобы ограничить выход в словарь слова.

Первый Набор Данных: Для обучения на собранных данных была обработана модель SimpleHTR, в которой есть 42 названия стран и городов с различными узорами почерка. Такие данные были увеличены в 10 раз. Были проведены два теста: с выравниванием курсивных слов и без выравнивания. После изучения были получены значения по валидации данных, представленных в Таблице ниже.

Алгоритм

выравнивание скорописи

нет выравнивания

CER

WAR

CER

WAR

bestpath

19.13

52.55

17.97

57.11

beamsearch

18.99

53.33

17.73

58.33

wordbeamsearch

16.38

73.55

15.78

75.11

Эта таблица показывает точность распознавания SimpleHTR для раличных методов декодирования (bestpath, beamsearch, wordbeamsearch). Декодирование наилучшего пути использует только выход NN и вычисляет оценку, принимая наиболее вероятный символ в каждой позиции. Поиск луча также использует только выход NN, но он использует больше данных из него и, следовательно, обеспечивает более детальный результат. Поиск луча с character-LM также забивает символьные последовательности, которые еще больше повышают исход.

Результаты обучения можно посмотреть на рисунке ниже:

Результаты эксперимента с использованием SimpleHTR (lr=0,01): точность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): точность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): погрешность модели.Результаты эксперимента с использованием SimpleHTR (lr=0,01): погрешность модели.

На рисунке ниже показано изображение с названием региона, которое было представлено на вход, а на другом рисунке мы видим узнаваемое слово " Южно Казахстанская с вероятностью 86 процентов.

Пример изображения с фразой " Южно-Казахстанская на русском языкеПример изображения с фразой " Южно-Казахстанская на русском языкеРезультат распознаванияРезультат распознавания

Второй набор данных (HKR Dataset): Модель SimpleHTR показала в первом тесте набора данных 20,13% символьной ошибки (CER) и второго набора данных 1,55% CER. Мы также оценили модель SimpleHTR по каждому показателю точности символов(рисунок ниже). Частота ошибок в словах (WER) составил 58,97% для теста 1 и 11,09% для теста 2. Результат например TEST2 показывает что модель может распознавать слова которые существуют в обучающем наборе данных но имеют полностью различные стили почерка. Набор данных TEST1 показывает, что результат не является хорошим, когда модель распознает слова, которые не существуют в обучении и наборы данных проверки.

Следующий эксперимент проводился с моделью LineHTR, обученной на данных за 100 эпох. Эта модель продемонстрировала производительность со средним CAR 29,86% и 86,71% для наборов данных TEST1 и TEST2 соответственно (рисунок ниже). Здесь также наблюдается аналогичная тенденция переобучения обучающих данных.

Заключение

Эксперименты по классификации рукописных названий городов проводились с использованием SimpleHTR и LineHTR на тестовых данных были получены следующие результаты по точности распознавания: 57,1% для SimpleHTR рекуррентного CNN с использованием алгоритмов декодирования с наилучшим путем, 58,3% для Beamsearch и 75,1% wordbeamsearch. Лучший результат был показан для Wordbeamsearch, который использует словарь для окончательной коррекции текст при распознавании.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru