Какие задачи хорошо решаются с помощью классического компьютерного зрения
Применение компьютерного зрения становится востребованными в разных сферах — оплата по биометрии лица в ретейле или общественном транспорте, городское видеонаблюдение, системы контроля доступа на социально значимых и промышленных объектах, анализ состояния водителей, определение средств индивидуальной защиты на производстве, банковские и государственные сервисы.
Что такое компьютерное зрение
Компьютерное зрение — это часть прикладной математики. Задача в компьютерном зрении ставится следующим образом: по данным фото или видео ответить на все те же вопросы, на которые бы ответил живой человек. Есть алгоритмы решения для таких задач, как поиск объектов на изображении (например, лиц людей), их классификация и распознавание, отслеживание их перемещения в кадре и распознавание действий. Но текущие алгоритмы, в отличие от человека, не так хорошо распознают контекст и выделяют причинно-следственные связи.
Чтобы компьютер научился «видеть» и решать ту или иную задачу, используют алгоритмы машинного обучения. Для этого собирают большие наборы данных, внутри которых выделяют объекты, признаки или их комбинации.
Как это работает
Один из частных случаев компьютерного зрения, всё чаще встречающийся нам в жизни, — это распознавание лиц. Биометрия используется для оплаты в кафе, подтверждения банковских операций, при регистрации на порталах финансовых и государственных услуг.
Работает такая система следующим образом. Программа анализирует изображение, поступающее с камер, на наличие лиц в кадре. Когда лицо обнаружено, запускается алгоритм его отслеживания в видеопотоке — программа определяет, на каком из кадров видео лицо запечатлено в лучшем качестве и ракурсе. На этом кадре с помощью алгоритма находятся ключевые точки лица, позволяющие определить его ориентацию на изображении. Портрет, «довёрнутый» с помощью ключевых точек лица до нужного стандартного положения, отправляется на сервис распознавания.
Из стандартного формата JPEG он преобразуется в дескриптор — набор неизменяемых параметров лица, который используется для последующего сравнения снимка с другим изображением. Дальше программа сравнивает два дескриптора и выдаёт ответ, занесён ли в базу попавший в кадр человек. Задача алгоритма распознавания заключается в том, чтобы дескрипторы, полученные из изображений одного и того же человека, были похожи, а для разных людей — различны.
Как создаются технологии
В основе современных систем компьютерного зрения лежат алгоритмы машинного обучения — как правило, это нейронные сети. Для их обучения нужно большое количество изображений с метками того, какие объекты на них находятся. В процессе обучения сеть сама определяет элементы, которые будет искать в других изображениях, чтобы распознать их с минимальным количеством ошибок. Иногда они совпадают с привычными нам деталями (если нейросеть решит, что узнавать собак ей помогают носы, она их запомнит), но чаще всего её выбор не поддаётся интерпретации.
Актуальные задачи технологий
Одна из задач, которую перед биометрическими системами поставила пандемия, — распознавание лиц в масках. Это стало большим вызовом для рынка, так как их наличие снижает точность работы стандартных алгоритмов на 20 50%. Основная проблема в подобных кейсах — значительное уменьшение количества информации, по которой можно построить хорошее представление лица.
В целом процесс распознавания лица в маске ничем не отличается от обычного. Система находит лицо, выравнивает его по ключевым точкам и формирует дескриптор (биометрический шаблон). Однако каждый из этих этапов становится сложнее — при наличии маски тяжелее найти лицо и его ключевые точки на изображении, поэтому конечный дескриптор получается менее точным. Чтобы решить эту проблему, необходима большая работа по формированию наборов данных для обучения нейронных сетей, в них учитывается наличие у человека различных атрибутов — очков, головных уборов, макияжа, маски и т. д. В итоге можно получить единый алгоритм, который одновременно может работать как на людях с масками, так и без.
Как определить лучший алгоритм
Для сравнения различных биометрических технологий по точности принято оценивать по показателям:
ошибки первого рода — доля ложно-отрицательных (FNR, False Negatives Rate или FRR, False Rejection Rate) срабатываний от общего количества положительных запросов;ошибки второго рода — доля ложно-положительных (FPR, False Positives Rate или FAR, False Acceptance Rate) срабатываний от общего количества отрицательных запросов.
Например, если рассмотреть процесс разблокировки мобильного телефона при помощи технологии распознавания лиц, то FNR — это вероятность того, что ваш телефон вас не узнает, а FPR — это вероятность того, что злоумышленник сможет разблокировать ваш телефон своим лицом.
Кроме того, важно учитывать быстродействие, стоимость, безопасность, масштабируемость и удобство использования решения.
Отраслевым бенчмарком является тестирование NIST Face Recognition Vendor Test Ongoing, которое ежегодно проводит Национальный институт стандартов и технологий США на больших закрытых наборах данных. Его цель — определить наиболее универсальные алгоритмы распознавания лиц, которые одинаково успешно работают в самых разных сценариях применения: Visa, Border, Visaborder, Mugshot. Их отличие в том, что тестирование проводится на разных типах изображений: фото на документы, снимки при прохождении паспортного контроля в аэропорту, портрет для картотеки. Типичный уровень точности современных систем распознавания лиц — FNR=0,003 при FMR=0,000001.
Почему технологии взлетели сейчас и что будет дальше
Прорывной рост технологий напрямую зависит от количества тренировочных данных и наличия компьютерных мощностей. Сейчас все эти условия сложились, и в мире есть сверхмощные компьютеры и все необходимые ресурсы для решения самых сложных задач. Если 10 лет назад в нейронной сети могло быть несколько тысяч настраиваемых параметров, то теперь их может быть несколько миллионов.
Количество доступных данных для обучения нейронных сетей также увеличилось на порядок. Кроме того, активно продолжаются исследования в области обучения новых алгоритмов компьютерного зрения — каждый год выходят тысячи научных публикаций с описанием новых подходов к решению той или иной задачи, улучшающих точность работы алгоритма.
Одна из основных проблем нейронных сетей — требование большого количества размеченных данных для их обучения. Наблюдается тренд на создание таких алгоритмов, для обучения которых можно использовать данные без разметки или лишь небольшую её часть. Много внимания уделяется повышению эффективности алгоритмов компьютерного зрения для работы на устройствах с небольшим количеством вычислительных ресурсов (например, на мобильных телефонах, видеокамерах и других умных устройствах). Также можно ожидать появления более комплексных решений для анализа большего количества атрибутов объектов с учётом контекста.
Компьютер видит не так, как люди. Мы стремимся к внедрению в компьютерное зрение лучшего из того, что может человек, но мы ограничены способами записи информации, поступающей непосредственно в компьютер или доступную программу. Таким образом, когда компьютер проводит генерализацию того, что он видит на изображении, и выделяет в ней некие паттерны, ошибки более чем распространены. В первую очередь это связано с тем, что человеческие способности к различению класса объектов тоже ограничены.
Для слайда «Что это может быть?» специально использовано изображение собаки, похожей на кота: на этой фотографии еще более-менее понятно, что это собака, но в целом, если бы я смотрела серию фотографий серых котов, я бы отнесла это животное к ним. Таким образом, мои способности к генерализации отличий изображений с серым котом и серым щенком с плюшевой шерстью имеют предел.
Кроме того, как видно из примеров распознавания этого кота моделью машинного обучения, она на основании обучающей выборки предполагает, что это может быть собака, шапка или кружка. Модель не до конца уверена, является ли наличие кошачьих ушей на 100% подтверждением того, что это не шапка и не кружка. Именно поэтому нам важно понимать, на каком основании модель принимает то или иное решение.
С этой точки зрения нейросети являются черным ящиком, поэтому, несмотря на относительно большую точность, их не любят в местах, где доверие к технологиям машинного обучения низкое. Поэтому требуется, чтобы модель была абсолютно понятна человеку. Например, когда мы делаем модель-помощника для эксперта, эксперт хочет точно знать, на каких основаниях модель приняла определенное решение.
С другой стороны, когда мы как дата-сайнтисты работаем с обычной моделью, а она где-то работает неверно, нам важно понять, почему так происходит. Для этого сейчас есть некоторые возможности. В частности, есть библиотеки, которые интерпретируют решения нейросети в виде тепловой карты, показывая те куски изображения, на основании которых была проведена классификация. Вот пример из довольно распространенной библиотеки Sharp:
Возможность показать, почему нейросеть приняла то или иное решение, очень важна: например, можно оценить, насколько рациональны с точки зрения человека те характерные особенности, которые увидела нейросеть. Если хотите понять, почему ваша модель принимает то или иное решение, советую обязательно обратиться к тепловым картам.
1. Классификация изображения — мы смотрим на картинку целиком и присваиваем ей некий класс из заранее нам известных.
2. Локализация на изображении конкретного объекта (или объектов) в рамке. Множество объектов отличается от одного только тем, что будет применяться более замысловатая нейросеть.
Как вариация классификации, существует сегментация изображения на отдельные объекты точно по контуру. В некотором смысле, сегментация классифицирует каждый пиксель как относящийся к объектам того или иного класса и рисует на изображении контур. Как подвид сегментации можно упомянуть распознавание границ, когда модель видит линии, обозначающие на изображении какие-то границы: разметка, регулирующая движение автомобиля; разметка в цехах, за которую нельзя заходить или можно заходить только в защитной каске, и т. п.
Если вы интересовались компьютерным зрением для беспилотников, то знаете, что в каждом релизе приводится изображение того, как видит машина. Компьютерное зрение, применяемое в беспилотном вождении, использует сегментацию изображений, потому что едущей машине важно понимать: перед ней дорога или тротуар; где разметка, которую нельзя пересекать; где пешеход, на которого нельзя наезжать, и т. д.
3. Восстановление изображений. Нейросеть убирает шум и улучшает качество картинки, но я неслучайно выбрала изображение, которое с точки зрения человека распознано неудачно:
Напомню: нейросеть очень чувствительна к тому, на каком наборе изображений она обучалась. У нас есть опыт, который мы получали на протяжении всей нашей жизни, а у нейросети есть набор изображений, которые ей показали для объяснения определенных общих принципов. Так как этот проект, использованный для восстановления фотографии бывшего президента США, сделан русскоязычными разработчиками, мы можем предположить, что в датасете, на котором обучалась нейросеть, не было достаточного количества примеров фотографий людей с темным цветом кожи (или они могли быть недостаточно разнообразны). Из-за этого происходит искажение, которое зрителю-человеку очевидно — ведь нам знаком оригинал. С точки зрения нейросети это должно быть изображение сильно загорелого белого человека.
Другой пример — восстановление конкретно «глубины» сцены. Чаще всего это используется для беспилотных аппаратов, а работает оно по такому же принципу, как зрительные способности людей и животных.
Наше зрение не случайно бинокулярное. Если закрыть один глаз, через некоторое время способность оценивать расстояние до предметов постепенно восстанавливается, но природа не зря дала человеку два глаза. Бинокулярность зрения позволяет в полной мере понимать объем предметов и расстояния между ними. Эту способность можно сравнить со стереозвуком. Один глаз не в состоянии дать столько информации об окружающем мире.
То же происходит, когда мы говорим о восстановлении глубины и объемности сцены в рамках работы компьютерного зрения. Множество двумерных снимков одной и той же сцены с разных ракурсов позволяет получить для компьютера как минимум аналог бинокулярного зрения (а чаще — даже более, потому что на камеры не распространяется ограничение природы человека, имеющего только два глаза), и это позволяет точно оценивать расстояние до объекта и придавать ему объём.
Восстановление объемных характеристик относительно неважно, если речь идет о четко расчерченном (например, разметкой на парковке) изображении, на котором хорошо видна нанесенная граница, и камера, оценивающая пересечение этой границы другими объектами, всегда висит под одним и тем же углом, а линия никуда не двигается. В этом случае не требуются восстановление сцены и дополнительные камеры. А вот если речь идет о динамическом действии, потребуется более одного изображения.
Другой интересный кейс касается проверки на мошенничество при идентификации пользователя через распознавание лица. Если алгоритм не будет проверять наличие у изображения объема, то машине не будет очевидно, что ей показывают: лицо реального человека или фото.
Поэтому при задаче идентификации людей по лицу важно определить, что у показываемого изображения есть глубина, что это не плоское изображение. Например, ранние варианты можно было обмануть, показав фото нужного человека (или видеозапись, если создатели подумали о нескольких ракурсах). Теперь системы аутентификации стремятся увидеть, что, условно говоря, — вот у человека нос, он не показан в плоскости, а действительно как-то выдается над лицом. Таким образом, восстановление сцены также используется для борьбы с мошенническими попытками взломать решения нейросети в лоб.
4. Еще одна из задач касается исключительно видео — отслеживание движущегося объекта.
Рассмотрим, например, механизм работы камер ГИБДД. Фактически, в данном случае модель определяет, с какой скоростью и в каком направлении двигается выделенный ею объект. Однако, когда мы собираем все эти задачи в один беспилотный автомобиль, выясняется, что всё это очень важно и требует быстрой обработки, а также обмена информацией между разными элементами изображения.
Если вам интересна тема развития методов обработки object detection с помощью нейросетей, рекомендую прочитать статью моего коллеги.
О том, какие задачи можно решать с помощью этой технологии, я расскажу в следующем моем посте.
Александра Царева, ведущий специалист Центра машинного обучения ИТ-компании «Инфосистемы Джет»
Привет! Меня зовут Рушан Сюрмаков я делаю Нейрон. Проект, где я рассказываю о машинном обучении, искусственном интеллекте и Data Science. И делаю так, чтобы всё это стало понятно.
Для тебя уже не является новостью тот факт, что все на себе попробовали маски старения через приложение Face App. В свою очередь для компьютерного зрения есть задачи и поинтереснее этой.
Ниже представлю 8 шагов, которые помогут освоить основные принципы компьютерного зрения.
Прежде, чем начать с этапов давайте поймём, какие задачи мы с вами сможем решать с помощью компьютерного зрения. Примеры задач могут быть следующими:
Итак, теперь давайте приступим непосредственно к этапам.
Этот шаг посвящен техническим основам.
Прочтите — третью главу книги Ричарда Шелиски «Компьютерное зрение: Алгоритмы и приложения».
Закрепите знания — попробуйте себя в преобразовании изображений с помощью OpenCV. На сайте есть много пошаговых электронных пособий, руководствуясь которыми можно во всём разобраться.
Оптический поток — это последовательность изображений объектов, получаемая в результате перемещения наблюдателя или предметов относительно сцены.
Прочтите — разделы 10.5 и 8.4 учебника Шелиски.
В качестве учебного проекта разберитесь с тем, как с помощью OpenCV отслеживать объект в видеофрейме.
В компьютерном зрении, сегментация — это процесс разделения цифрового изображения на несколько сегментов (суперпиксели). Цель сегментации заключается в упрощении и/или изменении представления изображения, чтобы его было проще и легче анализировать.
Так, преобразование Хафа позволяет найти круги и линии.
Посмотрите эти видео:
Ознакомьтесь — отличный проект подобные задачи которого чрезвычайно важны для компьютерного зрения самоуправляемых электромобилей.
Для различных данных требуется специфичный подход к фитингу и свои алгоритмы.
Прочтите — разделы 4.3.2 и 5.1.1 учебника Шелиски.
Для проекта можно взять собственные данные. Например, сфотографировать с разных сторон что-то из мебели и сделать в OpenCV из альбома плоских изображений 3D-объект.
Умея создавать 3D-объекты из плоских изображений, можно попробовать создать и трёхмерную реальность.
В качестве фреймворка для глубокого обучения удобно использовать TensorFlow. Это один из наиболее популярных фреймворков, поэтому вы без труда отыщете достаточно примеров. Для начала работы с изображениями в TensorFlow пройдите этот туториал.
Далее, пользуясь ссылками, рассмотрите следующие темы:
-
: категоризация объектов, сцен, деятельности
- Обнаружение объектов (non max подавление, скользящие окна, ограничивающие боксы и якоря, подсчёт элементов) и Darknet, нейросети для предложения областей (region proposal networks) (обучение с учителем)
В качестве проекта создайте в TensorFlow нейросеть, определяющую по изображению марку автомобиля или породу собаки.
Область применения компьютерного зрения очень широка: от считывателей штрихкодов в супермаркетах до дополненной реальности. Из этой лекции вы узнаете, где используется и как работает компьютерное зрение, как выглядят изображения в цифрах, какие задачи в этой области решаются относительно легко, какие трудно, и почему.
Лекция рассчитана на старшеклассников – студентов Малого ШАДа, но и взрослые смогут почерпнуть из нее много полезного.
Возможность видеть и распознавать объекты – естественная и привычная возможность для человека. Однако для компьютера пока что – это чрезвычайно сложная задача. Сейчас предпринимаются попытки научить компьютер хотя бы толике того, что человек использует каждый день, даже не замечая того.
Наверное, чаще всего обычный человек встречается с компьютерным зрением на кассе в супермаркете. Конечно, речь идет о считывании штрихкодов. Они были разработаны специально именно таким образом, чтобы максимально упростить компьютеру процесс считывания. Но есть и более сложные задачи: считывание номеров автомобилей, анализ медицинских снимков, дефектоскопия на производстве, распознавание лиц и т.д. Активно развивается применение компьютерного зрения для создания систем дополненной реальности.
Разница между зрением человека и компьютера
Ребенок учится распознавать объекты постепенно. Он начинает осознавать, как меняется форма объекта в зависимости от его положения и освещения. В дальнейшем при распознавании объектов человек ориентируется на предыдущий опыт. За свою жизнь человек накапливает огромное количество информации, процесс обучения нейронной сети не останавливается ни на секунду. Для человека не представляет особой сложности по плоской картинке восстановить перспективу и представить себе, как бы все это выглядело в трех измерениях.
Компьютеру все это дается гораздо сложнее. И в первую очередь из-за проблемы накопления опыта. Нужно собрать огромное количество примеров, что пока что не очень получается.
Кроме того, человек при распознавании объекта всегда учитывает окружение. Если выдернуть объект из привычного окружения, узнать его станет заметно труднее. Тут тоже играет роль накопленный за жизнь опыт, которого у компьютера нет.
Мальчик или девочка?
Представим, что нам нужно научиться с одного взгляда определять пол человека (одетого!) по фотографии. Для начала нужно определить факторы, которые могут указывать на принадлежность к тому или иному объекту. Кроме того, нужно собрать обучающее множество. Желательно, чтобы оно было репрезентативным. В нашем случае возьмем в качестве обучающей выборки всех присутствующих в аудитории. И попробуем на их основе найти отличительные факторы: например, длина волос, наличие бороды, макияжа и одежда (юбка или брюки). Зная, у какого процента представителей одного пола встречались те или иные факторы, мы сможем создать достаточно четкие правила: наличие тез или иных комбинаций факторов с некоей вероятностью позволит нам сказать, человек какого пола на фотографии.
Машинное обучение
Конечно, это очень простой и условный пример с небольшим количеством верхнеуровневых факторов. В реальных задачах, которые ставятся перед системами компьютерного зрения, факторов гораздо больше. Определять их вручную и просчитывать зависимости – непосильная для человека задача. Поэтому в таких случаях без машинного обучения не обойтись никак. Например, можно определить несколько десятков первоначальных факторов, а также задать положительные и отрицательные примеры. А уже зависимости между этими факторами подбираются автоматически, составляется формула, которая позволяет принимать решения. Достаточно часто и сами факторы выделяются автоматически.
Изображение в цифрах
Чаще всего для хранения цифровых изображений используется цветовое пространство RGB. В нем каждой из трех осей (каналов) присваивается свой цвет: красный, зеленый и синий. На каждый канал выделяется по 8 бит информации, соответственно, интенсивность цвета на каждой оси может принимать значения в диапазоне от 0 до 255. Все цвета в цифровом пространстве RGB получаются путем смешивания трех основных цветов.
К сожалению, RGB не всегда хорошо подходит для анализа информации. Эксперименты показывают, что геометрическая близость цветов достаточно далека от того, как человек воспринимает близость тех или иных цветов друг к другу.
Но существуют и другие цветовые пространства. Весьма интересно в нашем контексте пространство HSV (Hue, Saturation, Value). В нем присутствует ось Value, обозначающая количество света. На него выделен отдельный канал, в отличие от RGB, где это значение нужно вычислять каждый раз. Фактически, это черно-белая версия изображения, с которой уже можно работать. Hue представляется в виде угла и отвечает за основной тон. От значения Saturation (расстояние от центра к краю) зависит насыщенность цвета.
HSV гораздо ближе к тому, как мы представляем себе цвета. Если показать человеку в темноте красный и зеленый объект, он не сможет различить цвета. В HSV происходит то же самое. Чем ниже по оси V мы продвигаемся, тем меньше становится разница между оттенками, так как снижается диапазон значений насыщенности. На схеме это выглядит как конус, на вершине которого предельно черная точка.
Цвет и свет
Почему так важно иметь данные о количестве света? В большинстве случаев в компьютерном зрении цвет не имеет никакого значения, так как не несет никакой важной информации. Посмотрим на две картинки: цветную и черно-белую. Узнать все объекты на черно-белой версии не намного сложнее, чем на цветной. Дополнительной нагрузки для нас цвет в данном случае не несет никакой, а вычислительных проблем создает великое множество. Когда мы работаем с цветной версией изображения, объем данных, грубо говоря, возводится в степень куба.
Цвет используется лишь в редких случаях, когда это наоборот позволяет упростить вычисления. Например, когда нужно детектировать лицо: проще сначала найти его возможное расположение на картинке, ориентируясь на диапазон телесных оттенков. Благодаря этому отпадает необходимость анализировать изображение целиком.
Локальные и глобальные признаки
Признаки, при помощи которых мы анализируем изображение, бывают локальными и глобальными. Глядя на эту картинку, большинство скажет, что на ней изображена красная машина:
Такой ответ подразумевает, что человек выделил на изображении объект, а значит, описал локальный признак цвета. По большому счету на картинке изображен лес, дорога и немного автомобиля. По площади автомобиль занимает меньшую часть. Но мы понимаем, что машина на этой картинке – самый важный объект. Если человеку предложить найти картинки похожие на эту, он будет в первую очередь отбирать изображения, на которых присутствует красная машина.
Детектирование и сегментация
В компьютерном зрении этот процесс называется детектированием и сегментацией. Сегментация – это разделение изображения на множество частей, связанных друг с другом визуально, либо семантически. А детектирование – это обнаружение объектов на изображении. Детектирование нужно четко отличать от распознавания. Допустим, на той же картинке с автомобилем можно детектировать дорожный знак. Но распознать его невозможно, так как он повернут к нам обратной стороной. Так же при распознавании лиц детектор может определить расположение лица, а «распознаватель» уже скажет, чье это лицо.
Дескрипторы и визуальные слова
Существует много разных подходов к распознаванию.
Например, такой: на изображении сначала нужно выделить интересные точки или интересные места. Что-то отличное от фона: яркие пятна, переходы и т.д. Есть несколько алгоритмов, позволяющих это сделать.
Один из наиболее распространенных способов называется Difference of Gaussians (DoG). Размывая картинку с разным радиусом и сравнивая получившиеся результаты, можно находить наиболее контрастные фрагменты. Области вокруг этих фрагментов и являются наиболее интересными.
Далее эти области описываются в цифровом виде. Области разбиваются на небольшие участки, определяется, в какую сторону направлены градиенты, получаются векторы.
На картинке ниже изображено, как это примерно выглядит. Полученные данные записываются в дескрипторы.
Чтобы одинаковые дескрипторы признавались таковыми независимо от поворотов в плоскости, они разворачиваются так, чтобы самые большие векторы были повернуты в одну сторону. Делается это далеко не всегда. Но если нужно обнаружить два одинаковых объекта, расположенных в разных плоскостях.
Дескрипторы можно записывать в числовом виде. Дескриптор можно представить в виде точки в многомерном массиве. У нас на иллюстрации двумерный массив. В него попали наши дескрипторы. И мы можем их кластеризовать – разбить на группы.
Дальше мы для каждого кластера описываем область в пространстве. Когда дескриптор попадает в эту область, для нас становится важным не то, каким он был, а то, в какую из областей он попал. И дальше мы можем сравнивать изображения, определяя, сколько дескрипторов одного изображения оказались в тех же кластерах, что и дескрипторы другого изображения. Такие кластеры можно называть визуальными словами.
Чтобы находить не просто одинаковые картинки, а изображения похожих объектов, требуется взять множество изображений этого объекта и множество картинок, на которых его нет. Затем выделить из них дескрипторы и кластеризовать их. Далее нужно выяснить, в какие кластеры попали дескрипторы с изображений, на которых присутствовал нужный нам объект. Теперь мы знаем, что если дескрипторы с нового изображения попадают в те же кластеры, значит, на нем присутствует искомый объект.
Совпадение дескрипторов – еще не гарантия идентичности содержащих их объектов. Один из способов дополнительной проверки – геометрическая валидация. В этом случае проводится сравнение расположения дескрипторов относительно друг друга.
Распознавание и классификация
Для простоты представим, что мы можем разбить все изображения на три класса: архитектура, природа и портрет. В свою очередь, природу мы можем разбить на растения животных и птиц. А уже поняв, что это птица, мы можем сказать, какая именно: сова, чайка или ворона.
Разница между распознаванием и классификацией достаточно условна. Если мы нашли на картинке сову, то это скорее распознавание. Если просто птицу, то это некий промежуточный вариант. А если только природу – это определенно классификация. Т.е. разница между распознаванием и классификацией заключается в том, насколько глубоко мы прошли по дереву. И чем дальше будет продвигаться компьютерное зрение, тем ниже будет сползать граница между классификацией и распознаванием.
Компьютерное зрение — это область науки, которая занимается задачами, связанными с анализом изображений и видео. Можно считать, что во всех них требуется ответить на вопрос, что изображено на картинке. Несмотря на кажущуюся тривиальность вопроса, ответить на него не так просто.
Резюме
Арифметические операции
Итак, картинки — это матрицы чисел. В случае с черно-белыми картинками это матрицы размера высота на ширину картинки. В случае с цветной у матрицы появляется еще одна размерность, чаще всего она равна трем.
В OpenCV используется такое же представление матриц, как в библиотеке NumPy. Это значит, что для них можно использовать стандартные арифметические операции, например сложение.
Однако не все так просто: сложение матриц в NumPy не учитывает переполнение. Для изображений переполнение — это нелогичная операция. Если при сложении двух картинок яркость где-то превысила 255, то, как правило, она должна оставаться равной 255, а не превратиться в 4. Пример ниже показывает, как отличается сложение в NumPy и OpenCV.
Для примера возьмем картинку.
Первым делом изображение нужно сделать серым (даже если оно на вид уже в оттенках серого, в файле, из которого мы загружаем, оно обычно сохранено как цветное).
Команда cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) будет неоднократно встречаться в дальнейшем. Она используется для преобразования цветовых пространств, в том числе из RGB в серые картинки. После превращения картинки в серую можно прибавить к ней какое-то число.
Такое преобразование эквивалентно увеличению яркости картинки.
Можно не прибавлять, а умножать на некий коэффициент.
Умножение картинки эквивалентно увеличению ее контрастности. Можно попробовать использовать больший коэффициент (например, 1.8 ).
Именно так и работают алгоритмы изменения яркости и контраста во многих популярных графических редакторах. Однако для этой цели можно использовать и более сложные функции.
Как стать спецом по анализу данных
Взгляни на эту картинку. Чтобы ответить на вопрос, что на ней изображено, можно описывать сцену в целом. Понятно, что картинка сделана на улице (вне помещения), где-то в азиатской стране. Кто-то может узнать площадь Тяньаньмэнь в Пекине, если был там раньше.
Рекомендуем почитать:
Другой подход — выделять отдельные объекты на изображении. На картинке видно автобус, портрет, крышу, небо и так далее. Можно пойти дальше и говорить про физические свойства отдельных объектов. Например, крыша — наклонная, автобус едет, и он твердый, на стене висит изображение Мао Цзэдуна, ветер дует справа налево (это можно определить по движению флага).
Из примера выше можно заключить, что для ответа на вопрос, что изображено на рисунке, используется весь жизненный опыт. Например, знание о том, что существует ветер (на картинке его нельзя увидеть явно), что такое транспорт. Чтобы ответить на более сложные вопросы, необходимо знать историю Китая. Соответственно, задача заключается не в том, чтобы смотреть на пиксели, а в использовании знаний.
Как стать спецом по анализу данных
Взгляни на эту картинку. Чтобы ответить на вопрос, что на ней изображено, можно описывать сцену в целом. Понятно, что картинка сделана на улице (вне помещения), где-то в азиатской стране. Кто-то может узнать площадь Тяньаньмэнь в Пекине, если был там раньше.
Рекомендуем почитать:
Другой подход — выделять отдельные объекты на изображении. На картинке видно автобус, портрет, крышу, небо и так далее. Можно пойти дальше и говорить про физические свойства отдельных объектов. Например, крыша — наклонная, автобус едет, и он твердый, на стене висит изображение Мао Цзэдуна, ветер дует справа налево (это можно определить по движению флага).
Из примера выше можно заключить, что для ответа на вопрос, что изображено на рисунке, используется весь жизненный опыт. Например, знание о том, что существует ветер (на картинке его нельзя увидеть явно), что такое транспорт. Чтобы ответить на более сложные вопросы, необходимо знать историю Китая. Соответственно, задача заключается не в том, чтобы смотреть на пиксели, а в использовании знаний.
Цветовые пространства
Пока что мы говорили только о представлении в RGB, но существуют и другие варианты. Например — HSV.
Компоненты этого пространства — тон (hue), насыщенность (saturation) и значение (value). Это пространство позволяет манипулировать цветом и его насыщенностью по отдельности. Тон обозначает цвет пикселя, он закодирован числом от 0 до 360, как угол на цилиндре. Насыщенность принимает значение 0, если картинка серая.
Если мы работаем с картинкой в HSV, то можем легко сделать ее более насыщенной, умножив соответствующий канал на какой-то коэффициент. Попробуем увеличить насыщенность на 50% (коэффициент 1,5).
Блендинг
Блендинг — еще один пример применения простых арифметических операций к картинкам. Если наша задача — скомбинировать два изображения, то можно попробовать их сложить. Но в таком случае, если объекты наложатся друг на друга, получится каша.
Пусть для одной картинки известно, где расположен объект, а все остальное пространство занимает фон. Тогда можно помещать второй объект туда, где находится фон. В месте, где первый объект накрывается вторым, будет также использоваться второй объект.
Такое объединение требовательно к качеству вырезания картинки. Если по краям неаккуратно обрезан фон, то будет видна некрасивая белая полоса.
Кажется, что научиться аккуратно вырезать объект из фона — сложная задача. Это так, потому что фон неоднородный и недостаточно просто выбросить белые пиксели. Можно воспользоваться хитрым алгоритмом смешивания двух картинок и построить маску таким образом, что ее значение будет тем больше, чем дальше пиксель от белого.
Там, где на исходном изображении располагаются белые пятна, будут браться пиксели со второго изображения, и неаккуратное вырезание объекта будет не так заметно. На картинке выше ты можешь увидеть, как такое простое преобразование помогает избавиться от проблемы.
Существуют более сложные алгоритмы блендинга. В случаях, когда требуется скопировать объект с неоднородным фоном и вставить его в другое изображение, простые методы, смешивающие цвета, не помогают. Методы похитрее используют оптимизацию, чтобы определить, где находится объект, а где — фон. Затем свойства объекта переносятся без изменений, а свойства фона берутся с картинки, на которую вставляется объект.
Скользящее среднее — свертка
Проще всего объяснить, что такое линейная фильтрация, на примере. Пусть требуется подсчитать среднее в окне 3 × 3 для каждого пикселя. Вычисление среднего можно записать так:
Переписав формулу в следующем виде, можно получить выражение для свертки:
где f — это изображение (двухмерная функция, характеризующая картинку), k, l — координаты пикселя, f — яркость пикселя, h — ядро свертки (матрица 3 × 3, состоящая из единиц).
Если ядро свертки — матрица, то свертка — это скользящее среднее. В OpenCV произвести такую свертку можно следующим образом:
Картинка при этом становится более размытой. Также размытие изображения можно получать при помощи свертки с гауссовской функцией.
Фото до применения скользящего среднего, после и после применения гауссовского размытия
Внутриклассовая изменчивость
Возьмем другой пример. На вопрос, что такое стул, можно ответить первое, что придет в голову. Например, стул — это нечто с четырьмя ножками и спинкой. А как тебе вот такой стул?
Получается, что даже такую вещь, как стул, сложно описать в терминах форм. Стул — это некое концептуальное понятие: что-то, на чем сидят. Можно представить, как сложно объяснить это понятие инопланетному существу, которое не знает даже, что такое сидеть, и не умеет это делать. Прежде чем научить кого-то находить на картинках стул, было бы неплохо, чтобы оно поняло концепцию «сидеть».
Абсолютно то же самое происходит, когда компьютер учат распознавать изображения. В идеале, чтобы он отвечал на вопросы про стулья так же хорошо, как человек, ему нужно понимать концепцию «сидеть».
В науке об искусственном интеллекте существует понятие «ИИ-сложные задачи». Это класс задач, решение которых эквивалентно созданию искусственного интеллекта. Задача компьютерного зрения в общей постановке (ответ на вопрос о том, что изображено на картинке, и на все вопросы про это изображение) считается ИИ-сложной.
Мы показали, что для ответа на вопрос об изображении нужно не просто смотреть, а использовать весь свой жизненный опыт, образование, а иногда и интуицию. К сожалению, «сильный» искусственный интеллект до сих пор не создан. Поэтому наука о компьютерном зрении решает только определенные подзадачи, речь о которых пойдет далее.
Задачи компьютерного зрения
Давай на примерах разберем несколько задач, которые решаются с применением компьютерного зрения.
Первый пример — поиск изображений в интернете. Сейчас существует несколько сервисов, которые позволяют искать картинки. Изначально для поиска использовались текстовые запросы. Некоторое время назад в части из таких сервисов появилась возможность поиска по загруженному изображению. От пользователя требуется загрузить картинку, а сервис будет искать похожие на нее изображения в интернете.
Работает такой поиск следующим образом. Сначала индексируются изображения из интернета. Для них строятся цифровые представления, из них формируется структура данных, по которой можно быстро искать. То же происходит и с пользовательской картинкой — извлекается некое представление о ней, по которому в базе данных ищутся дубликаты или похожие картинки.
Эта задача сложна в структурном смысле. В интернет загружены миллиарды изображений, и использование сложных методов сравнения невозможно, потому что необходима высокая производительность.
Вот несколько других примеров.
Распознавание текста. Необходимо найти изображение текста на картинке и представить его в виде текстовых данных, с которыми можно будет работать, например, в текстовом редакторе. Эта технология широко используется в разных приложениях. В частности, это удобный способ вводить текст в онлайновый переводчик. Достаточно сфотографировать этикетку, и текст на ней будет распознан, а переводчик выполнит перевод.
Биометрия. Для распознавания людей может использоваться изображение лица, радужная оболочка глаза, отпечатки пальцев. Однако в основном компьютерное зрение занимается распознаванием лиц. С каждым годом эта технология работает все лучше и лучше и находит широкое применение.
Видеоаналитика. В мире устанавливается все больше камер: на дорогах для регистрации движения автомобилей или в общественных местах для отслеживания потоков людей и детектирования аномалий (например, оставленные вещи, нелегальные действия). Как следствие, возникает задача анализировать огромный поток информации. Компьютерное зрение помогает в решении этой задачи. Оно позволяет определять номер автомобиля, его марку, нарушает ли он правила дорожного движения.
Анализ спутниковых снимков. Сейчас накоплен огромный массив спутниковых снимков. Используя эти данные, можно решать самые разные задачи: улучшать карты, обнаруживать лесные пожары и другие проблемы, которые видны со спутника. Технологии компьютерного зрения шагнули в последнее время далеко вперед, и с их использованием автоматизируется все больше ручной работы в этой области.
Графические редакторы. Компьютерное зрение позволяет не только распознавать, что изображено на картинке. Оно же дает возможность менять и улучшать изображение. Получается, все, что можно сделать с помощью графического редактора, относится к технологии компьютерного зрения.
3D-анализ. Реконструкция объемных моделей — еще одна задача, решаемая с помощью компьютерного зрения. Например, используя множество изображений, сделанных в данном городе, можно восстановить форму зданий.
Управление автомобилем. В будущем любой автомобиль будет оснащен огромным количеством датчиков: видеокамерами, радарами, стереокамерой. Методы компьютерного зрения помогают анализировать информацию, получаемую с этих датчиков, и лежат в основе систем предотвращения ДТП и все более сложных автопилотов.
Каскады Хаара — детектор лиц
Одна из задач, решаемых наукой о компьютерном зрении, — это детекция лиц. Среди первых методов решения наиболее удачный — это каскады Хаара. Применяя этот метод, из картинки можно вычленять достаточно простые признаки. Для этого необходимо использовать несколько прямоугольников.
Каскады Хаара
Пиксели, попадающие в белый прямоугольник, берутся со знаком «плюс», в черный — со знаком «минус». Все значения суммируются, и получается одно число. Прямоугольники и коэффициенты для них выбираются с помощью алгоритма AdaBoost. У лица имеются некоторые паттерны, и в итоге каскад фильтров такого рода показывает, есть ли внутри него лицо или нет.
Сейчас есть методы детекции лиц, превосходящие по качеству каскады Хаара. Тем не менее это простой подход, и он часто встречается в готовом к использованию виде. Если не требуется решать задачу с высоким качеством, а получить детектор нужно быстро и просто, каскады Хаара из библиотеки OpenCV — это отличный вариант.
Детекция границ
Свертки также можно применять для детекции границ. С помощью сверток, как на картинке ниже, можно получить вертикальные и горизонтальные границы изображения. Если объединить результаты этих двух сверток, можно получить все границы.
Свертки для получения границ: слева — горизонтальных, справа — вертикальных
Границы изображения, полученные с помощью применения свертки. Слева — горизонтальные, в середине — вертикальные, справа — все границы, полученные объединением результатов двух сверток
Такие ядра являются частью преобразования Превитта, их использование — это самый простой способ найти границы изображения.
На самом деле существует много способов определения границ. Каждый из них применяется в разных условиях, и, в зависимости от задачи, необходимо использовать тот или иной способ.
Линейная фильтрация изображений
Важный класс преобразования изображений — это линейные фильтры. С их помощью решаются задачи поиска границ, уголков, удаления шумов.
Сегментация
Задачу сегментации в общем случае решить тоже несложно. Один из способов — отрезать пиксели выше какого-то порога и назначить их объекту, а пиксели ниже порога — фону.
Сегментация изображения
На этом примере видно, что монеты намного темнее, поэтому достаточно подобрать такую границу, чтобы они все оказались ниже. Вот код, который позволяет это сделать при помощи OpenCV:
«Низкоуровневое» зрение
Методы компьютерного зрения используются для решения задач, которые условно можно разделить на простые и сложные. Сложные задачи отвечают на вопросы, какой объект изображен на картинке, к какому классу он относится. Для решения этих задач чаще всего используются методы машинного обучения.
При решении простых задач производятся манипуляции непосредственно с пикселями, используются эвристики, а методы машинного обучения, как правило, не применяются.
Здесь мы поговорим о задачах «простого», или «низкоуровневого», компьютерного зрения. Они нередко используются как составная часть более сложных задач распознавания. Например, предобработка картинки позволяет алгоритмам машинного обучения лучше понять, что на ней изображено.
Самая популярная библиотека для решения задач «низкоуровневого» компьютерного зрения — это OpenCV. В ней содержится огромное количество алгоритмов, есть интерфейсы для многих языков программирования, в том числе С++ и Python. Другая известная библиотека — skimage, она активно используется в скриптах на Python. В примерах дальше мы будем применять OpenCV.
Представление изображения в памяти компьютера
Изображение в памяти компьютера кодируется попиксельно, и цвет каждого пикселя в зависимости от используемой модели может быть записан по-разному. Самая простая модель — это RGB, в соответствии с которой тремя числами кодируется яркость пикселей в красном, зеленом и синем каналах. Существуют и другие модели, мы поговорим о них ниже.
Эквилизация гистограммы
Пример более сложного подхода — это эквилизация гистограммы. В данном случае гистограмма — это представление картинки, по которому видно, сколько в ней пикселей той или иной яркости. Ниже показана гистограмма какого-то изображения. Черная линия — это кумулятивная гистограмма, которая отвечает на вопрос, у какого количества пикселей яркость меньше значения x.
Гистограмма до эквилизации и после
В результате эквилизации гистограмма картинки растягивается таким образом, чтобы кумулятивная гистограмма была близка к линейной функции. Выполнить эквилизацию можно следующей функцией:
Если взять нашу предыдущую картинку, то результат будет выглядеть вот так.
Корреляция
Другой пример линейного преобразования — это корреляция. Она очень похожа на свертку, но записывается немного в другом виде:
В отличие от свертки корреляция используется, чтобы показать меру похожести двух изображений. Это может быть использовано для поиска объектов. Например, требуется найти лицо футболиста.
На рисунке слева показан результат применения корреляции для поиска лица. Белое пятно — это место, где оно найдено. Корреляцию можно использовать с различными параметрами: нормировать, применять ее различные вариации.
Получается, что корреляция — это очень простой способ поиска объектов на изображении, если имеется их точные копии.
Читайте также: