Классификация изображений

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

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

Но ждать! Как мы на самом деле определяем набор меток, которые наша система должна учитывать для прогнозов!? Что ж, получается, нам нужно заранее знать, какие изображения мы собираемся получить. Допустим, у нас есть куча фотографий, на которых изображена кошка или собака, и мы хотим, чтобы наша система упорядочивала их автоматически, чтобы у нас была корзина со всеми фотографиями кошек и корзина со всеми фотографиями собак в конце. Для этого наша система должна знать об этих двух классах cat и dog, и в результате у нас есть {cat, dog. как наш набор предопределенных категорий. Ну, а что, если мы заранее не знаем, какие ярлыки нас могут ожидать!? Получается, что тогда нам нужно что-то чуть посложнее. Тем не менее, поскольку я хочу сохранить простоту на данный момент, я не хочу вдаваться здесь в какие-либо подробности и скорее придерживаться ситуации, что мы всегда знаем наши категории заранее (но если вы все еще заинтересованы, проверьте одноклассовая классификация в моем последнем посте в блоге, по крайней мере, для основной идеи). Хорошо, давайте теперь посмотрим на пример, чтобы лучше понять весь процесс.

Давайте представим, что у нас есть изображения кошек, собак, шляп и кружек, и мы хотим организовать их автоматически с помощью нашей системы. Первое изображение, которое мы получаем, — это изображение кошки, похожее на приведенное выше, которое должно быть классифицировано в соответствии с нашим фиксированным набором меток {кошка, собака, шляпа, кружка. Итак, мы передаем это изображение в нашу систему и после некоторого анализа (об этом мы поговорим чуть позже) получаем распределение вероятностей по всем меткам (в нашем примере выше: 82% cat, 15% собака, 2% шляпа, 1% кружка). Если наша система работает правильно, вероятность метки cat будет самой высокой, так как это на самом деле правильная метка (что действительно имеет место в нашем примере выше, где мы получаем вероятность 82% для метки cat). Конечно, у нас также могут быть изображения нескольких категорий, такие как фотографии, которые показывают, например. кошки и собаки вместе, но опять же, для простоты давайте пока рассмотрим только случаи, когда нам просто нужно присвоить одну метку (т.е. бинарную или многоклассовую классификацию; подробности о различных типах классификаций см. в моем последнем сообщении в блоге).

Но подождите минутку! Распознать кошку на изображении кажется простой задачей, не так ли!? Ну, это действительно так… по крайней мере, для нас, людей! Наша зрительная система специализирована для выполнения таких задач визуального распознавания, и поэтому они кажутся нам такими простыми. Однако оказывается, что природе понадобились миллионы лет, чтобы развить эту способность, и воспроизвести ее с помощью машины на самом деле очень сложно. Мы должны помнить: что видит компьютер, когда смотрит на изображение? Ну, это не сразу то целостное представление о кошке, которое мы, люди, получаем, когда смотрим на изображение выше. Вместо этого компьютер представляет изображение в виде большой сетки чисел (подробности об этом см. в моем последнем посте в блоге), и на самом деле не так просто выделить идею кота из сетки. Эту проблему иногда называют Семантическим разрывом, что относится к разрыву между семантическим понятием, например, кот и значения пикселей изображения, которые видит компьютер (номера сетки). Сокращение этого разрыва — действительно сложная проблема, поскольку, когда мы пытаемся это сделать, мы сталкиваемся с рядом сложных проблем, которые я хочу обсудить ниже.

Проблемы

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

  • Вариант точки обзора. Допустим, мы делаем снимок, например. кружка, как показано ниже. Затем немного двигаем камеру и делаем еще один снимок, никак не двигая кружку. Хотя на обоих изображениях изображена одна и та же кружка, в итоге они совершенно разные.

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

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

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

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

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

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

Подход, основанный на данных

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

Хорошо, теперь, когда у нас есть API, давайте подумаем, как мы можем получить метку из изображения. Ну, в отличие, например. сортируя список чисел, на самом деле нет очевидного способа жестко закодировать алгоритм распознавания таких объектов, как, например. кошки. Когда мы пытаемся отсортировать список, мы можем легко (более или менее по крайней мере) записать необходимые шаги, но для классификации изображений не так ясно, как это сделать. Однако это не мешало людям придумывать различные попытки. Например, они вычислили края изображения, а затем разработали набор закодированных вручную правил, которые пытались найти углы и границы для обнаружения ушей, глаз или носов кошек. К сожалению, это оказалось не очень хорошо, потому что оно на самом деле довольно хрупкое. Кроме того, это также не очень масштабируемый подход. Если мы хотим написать алгоритм для распознавания собак, нам нужно начать все сначала и придумать новые правила. Итак, получается, что нам нужно сделать это для каждой новой категории объектов. Это довольно утомительно. Было бы лучше иметь алгоритм, который гораздо более естественно масштабируется для всех объектов в мире, чтобы нам не нужно было начинать все сначала для каждого нового объекта.

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

  1. Соберите набор изображений и соответствующие им метки. Мы часто называем это тренировочным набором. Однако сбор набора данных требует больших усилий, поскольку на практике мы часто имеем сотни классов и тысячи изображений в каждом классе. К счастью, часто другие люди уже создали для нас высококачественные наборы данных, например, например. CIFAR, ImageNet или наборы данных на платформе анализа данных Kaggle.
  2. Используйте Машинное обучение для обучения классификатора на собранных обучающих данных, т.е. классификатор должен взять все данные, каким-то образом обобщить их, а затем создать из них модель, содержащую обобщенные знания о как распознавать разные классы (в основном он должен узнать, как выглядит каждый из классов).
  3. Оцените качество классификатора в отношении его способности правильно распознавать, например. кошек или собак на новых изображениях, которые классификатор ранее не видел. Поэтому мы просто предсказываем метки этих новых изображений и сравниваем их с истинными метками (часто называемыми земной правдой), используя определенную метрику классификации (возможно, я напишу больше о метриках в другом посте в блоге, но если вам уже интересно, ознакомьтесь с this, этот и эта статья в Википедии).

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

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

Резюме

Итак, что мы узнали?

  • Классификация изображений является основной проблемой компьютерного зрения и имеет множество практических приложений.
  • Процесс классификации: классификатор получает изображение и предсказывает метку для этого изображения, соответствующую основному объекту на этом изображении.
  • Однако предсказать правильную метку — непростая задача для компьютера (в отличие от человека), поскольку существует множество проблем (например, освещение)
  • Вместо того, чтобы жестко кодировать какие-либо правила для прогнозирования метки, лучше использовать много данных и машинное обучение (подход, основанный на данных).
  • Наборы данных высокого качества, например. CIFAR, ImageNet или различные наборы данных на Kaggle