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

Локализация объекта

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

Чтобы выполнить локализацию объекта, нам сначала нужно настроить вывод y, чтобы он также содержал информацию о местонахождении объекта. Конкретно, вы хотели бы что-то вроде следующего:

Для ограничительной рамки мы обрабатываем верхний левый угол изображения как (0, 0) и нижний правый угол изображения как (1, 1). Если на изображении нет объекта, мы ожидаем, что Pc равно 0, а остальные значения нас не интересуют. Если на изображении была найдена машина, мы ожидаем, что Pc равно 1, а один из cᵢ равен 1.

Обнаружение ориентира

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

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

Обнаружение объекта

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

Раздвижные окна

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

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

Раздвижные окна с извилинами

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

Мы можем выразить 400 единиц полносвязного слоя как сверточный слой 1x1x400. Преобразование может быть выполнено с помощью свертки с максимальным размером фильтра. Например, мы можем преобразовать 5x5x16 в 1x1x400 с фильтром 5x5. Фильтр 1x1 может конвертировать из 1x1x400 в 1x1x400. Единственное отличие состоит в том, что во время преобразования нам нужно выполнить дополнительные линейные вычисления.

Теперь давайте посмотрим, как сделать скользящие окна с извилинами. Для наглядности мы рисуем только его 2D-часть.

Как мы видим выше, эта конкретная комбинация операций свертки для 16x16x3 на самом деле одновременно вычисляет свертки скользящих окон с размером 14 и шагом 2.

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

YOLO (Вы только посмотрите один раз)

YOLO — это алгоритм, разработанный Джозефом Редмоном и др. в 2015 году. Этот алгоритм был мотивирован тем фактом, что люди могут просто один раз взглянуть на изображение и понять, где находятся объекты. Вместо того, чтобы выбирать несколько окон и шагов и пробовать CNN, YOLO требует CNN только один раз, чтобы сделать их все.

[Reference]
Original Paper

Предсказания ограничивающей рамки

Идея состоит в том, что мы собираемся рисовать линии сетки следующим образом:

Для наглядности давайте разделим изображения на 3x3. Каждая ячейка отвечает за обнаружение одного объекта. Ячейка отвечает за объект, если его центр находится внутри ячейки. На картинке выше ячейки в (1, 3) и (2, 1) отвечают за обнаружение объектов. На практике мы разбиваем изображение на ячейки сетки 19х19 так, чтобы в одну ячейку попадало не более одного центра объекта.

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

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

Что именно представляет кубоид? Он содержит тип, который мы видели в разделе локализации объектов. Конкретно, если c₁ — пешеход, c₂ — автомобиль, а c3 — мотоцикл, мы ожидаем, что прямоугольный параллелепипед будет следующим:

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

Почему это работает?

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

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

Пересечение над союзом (IOU)

Чтобы понять функцию потерь алгоритма YOLO, нам нужно понять, как оценивать обнаружение объектов с помощью Intersection Over Union (IOU). IOU — это мера перекрытия между двумя ограничивающими прямоугольниками.

Значение IOU определяется как (размер пересечения / размер объединения). IOU варьируется от 0 до 1.

Немаксимальное подавление

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

Это результат алгоритма YOLO? Нет. Мы знаем, что каждая ячейка отвечает только за один объект. Может быть несколько ячеек, обнаруживающих один и тот же автомобиль. Это заставит алгоритм предсказывать несколько ограничивающих рамок для одного объекта.

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

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

Два светло-голубых ограничивающих прямоугольника будут конечным результатом алгоритма YOLO. Затем мы будем использовать этот вывод для расчета стоимости.

Якорные коробки

Прежде чем мы поговорим о функции потерь, пока есть еще одна проблема с алгоритмом YOLO. Что, если два объекта имеют общие центры?

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

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

На картинке выше якорный ящик типа 1 отвечает за обнаружение человека, а якорный ящик типа 2 отвечает за обнаружение автомобиля.

Функция потери

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

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

Чтобы решить эту проблему, мы собираемся наложить больше штрафов на ограничивающие рамки, которые отвечают за обнаружение объектов. Допустим, сетка 2x2.

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

Рассмотрим проигрыш там, где в ячейках нет центров объектов, а именно в ячейках (1, 1) и (2, 2).

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

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

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

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

Что касается потери размера, причина, по которой мы не используем ширину и высоту напрямую, заключается в следующем.

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

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

R-CNN

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

Это все на сегодня.