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

Получив изображение, сверточная нейронная сеть может классифицировать его по разным классам. Но настоящая проблема заключается в обнаружении нескольких объектов на одном изображении. Когда на изображении присутствует более одного объекта, проблема заключается в том, чтобы идентифицировать каждый объект и найти их на изображении. Ранее CNN применялась к близко обрезанным изображениям объектов или к изображениям, содержащим только один объект. Но, безусловно, чтобы обучить сеть как обнаружению, так и локализации объектов, нам необходимо обучить ее на изображениях с одним или несколькими объектами и четкой границей, обозначающей его положение на изображении. Давайте определим выходные данные сети, то есть то, что мы хотим, чтобы сеть предсказывала. Мы определяем наш выходной вектор y ₑₓₚ из сети, которая обучена обнаруживать N классов объектов, как:
Yₑₓₚ:
[Pᵢ,
L ₓ, / B
L ᵧ, / B
L ₕ, / B ₕ
L ₗ, / B ₗ
C₁,
C₂,
C₃,
… ,
…,
Cₙ]
Pᵢ → значение вероятности, определяющее, данное изображение имеет любой объект, который принадлежит хотя бы к одному из N классов изображений. Таким образом, он равен 1, если на изображении есть объект, или 0, если изображение представляет собой просто пейзаж, или объект без конкретного интересующего объекта.
Lₓ / B ₓ → Обозначает координату x центра ограничивающей рамки вокруг местоположения объекта.
Lᵧ / Bᵧ → Обозначает координату y центра ограничивающей рамки вокруг местоположения объекта.
Lₕ / Bₕ → Обозначает высоту ограничивающей рамки.
Lₗ / Bₗ → Обозначает ширину ограничивающей рамки.
C₁, C₂,…., Cₙ → Они представляют различные классы объектов, распознавать которые сеть обучается. Итак, если на изображении есть автомобиль и C₂ используется для обозначения автомобиля, то значение C₂ должно быть 1, в то время как другие параметры принимают значение 0.

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

АЛГОРИТМ ОБНАРУЖЕНИЯ РАЗДВИЖНОГО ОКНА:

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

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

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

R-CNN или региональный CNN:

Далее идет R-CNN или региональная сверточная нейронная сеть. В его основе лежит концепция разделения изображения на регионы. У нас уже есть ConvNet, обученная распознавать различные типы объектов. Для обнаружения объектов на изображении алгоритм выполняет следующие шаги.
По сути, он должен предлагать около 2 тыс. областей интересов, не зависящих от категорий, на основе выборочного поиска. Идея состоит в том, что эти области могут содержать различные объекты разного размера. Эта задача предложения региона достигается с помощью сегментации.

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

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

Несмотря на все эти шаги, обнаружение объектов в реальном времени по видеозаписям было медленным. Для повышения его производительности в версию этого алгоритма были внесены различные обновления. Начиная с Fast R-CNN до Faster R-CNN, а теперь маскируйте R-CNN.
Fast R-CNN основан на совместном использовании вычислений. Другими словами, как мы сделали в сверточной реализации скользящего окна, здесь мы передаем всю информацию в CNN для классификации и регрессии ограничивающей рамки. Это снижает общие затраты на вычисления, которые ранее приходились на обучение по каждому региону отдельно. Как только вы поймете, как сверточная реализация алгоритма обнаружения скользящего окна, вы сможете легко определить применяемый здесь подход.
Faster R-CNN был интуитивно понятной модификацией интеграции процесса предложения региона в ConvNet. В то время как Mask R-CNN представляет собой расширенную реализацию Faster R-CNN для сегментации изображения на уровне пикселей.
Вот ссылки на эти документы, на случай, если вам понадобится дополнительная информация.
R-CNN
Быстрый R-CNN
Более быстрый R-CNN
Маска R-CNN

АЛГОРИТМ ОБНАРУЖЕНИЯ ОБЪЕКТОВ YOLO (наконец):

Алгоритмы YOLO или You Only Look Once используют совершенно иной подход, чем другие. В то время как другие алгоритмы выполняют классификацию и локализацию для каждой из предложенных областей изображения. YOLO обе задачи за один проход изображения по сети. Что он делает, так это то, что он разделяет изображение на определенные «нет». областей и предсказывает результат для каждой области, если центр какого-либо объекта находится в этой области. Сначала посмотрим, что он должен выводить.
Ограничивающая рамка. Мы ожидаем, что сеть предскажет ограничивающую рамку вокруг объекта на изображении. Мы определяем вывод, как и раньше:

Yₑₓₚ:
[Cₛ, Pᵢ,
L ₓ, / B ₓ < br /> L ᵧ, / B
L ₕ, / B ₕ
L ₗ, / B ₗ
C₁,
C₂,
C₃,
…,
…,
Cₙ]
Cₛ → Известный как показатель достоверности, он определяется как произведение вероятности (Pᵢ, наличия объекта) на IoU (результат, ожидаемый). IoU я определю позже.
Pᵢ → Определяет, есть ли в данном изображении какой-либо объект, принадлежащий хотя бы к одному из N классов изображений.
Lₓ / B ₓ → Обозначает координату x центра ограничивающей рамки вокруг местоположения объекта.
Lᵧ / Bᵧ → Обозначает координату y центра ограничивающей рамки вокруг местоположения объекта.
Lₕ / Bₕ → Обозначает высоту ограничивающей рамки.
Lₗ / Bₗ → Обозначает ширину ограничивающей рамки.
C₁, C₂,…., Cₙ → Они представляют различные классы объектов, распознавать которые обучается сеть.
Вот только пример того, что обученная сеть может вернуться к данному изображению после его разделения на сетки 3 х 3. Здесь пока не отображается показатель достоверности.

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

Итак, что делает алгоритм?
Во-первых, как обычно, у нас есть CNN (сверточная нейронная сеть), обученная классифицировать объекты по различным классам.
Затем он делит изображение на ячейки или области сетки S x S. Он обучает сеть возвращать результат для каждой ячейки сетки, если обнаруживает, что центр некоторого объекта находится в этой ячейке сетки. Это можно объяснить следующими изображениями:

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

IoU (пересечение через союз):

Итак, во время обучения у нас есть два значения для вывода: во-первых, значение истинности или ожидаемый результат. Во-вторых, результат, который мы получаем после передачи изображения по сети
Итак, ожидаемый результат определяет некоторую ограничивающую рамку (Bₑ) для объекта, в то время как сеть предсказывает некоторую другую ограничивающую рамку ( Bₒ) для того же объекта.
IoU определяется как отношение площади, покрытой пересечением Bₑ и Bₒ, к площади, покрываемой объединением Bₑ и Bₒ.

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

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

На изображении выше предположим, что сеть предсказала три ограничивающих прямоугольника для одного и того же изображения с IoU, превышающим пороговое значение (скажем, 0,75). Подавление Non-Max гарантирует, что будет выбран ограничивающий прямоугольник с самым высоким IoU (здесь 0,9).

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

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

[0.82,
1,

Lₓ¹, / Bₓ¹
Lᵧ¹, / Bᵧ¹
Lₕ¹, / Bₕ¹
Lₗ¹, / Bₗ¹

0,
1,
0,
0,75,
1,
Lₓ², / Bₓ²
Lᵧ², / Bᵧ²
Lₕ², / Bₕ²
Lₗ², / Bₗ²

1,
0,
0]
Итак, предположим, что у нас есть CNN, обученная обнаруживать три класса объектов, а именно. пешеходы, автомобили и уличные знаки. Пусть C₁ обозначает пешеходов, C₂ обозначает автомобили, а C₃ обозначает уличные знаки. Имеется некоторый показатель достоверности для обоих ограничивающих прямоугольников B1 (здесь 0,82) и B2 (здесь 0,75). Вероятность наличия и автомобиля, и пешехода равна 1. Границы их ограничивающих рамок определяются параметрами Lₓ ¹ / Lₓ ² , Lᵧ ¹ / Lᵧ ² , Lₕ ¹ / Lₕ ² , Lₗ ¹ / Lₗ ². Точно так же для ограничивающего прямоугольника B1 мы ожидаем, что он будет обозначать автомобиль, поэтому C₂ равно 1, а остальные равны 0. В то время как для другого ограничивающего прямоугольника B2 мы имеем C₁ равно 1 а остальные равны 0.
Далее обучаем нашу сеть по вышеупомянутому алгоритму и получаем результат. Вот как должна выглядеть стандартная сетевая реализация YOLO. Обратите внимание, что на выходе получается вектор 7 x 7 x 30. Таким образом, изображение было разделено на 7 x 7 = 49 областей, а выходной вектор для каждой ячейки сетки содержит 30 параметров для предсказаний различных объектов.

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

Первоначально YOLO обучался на наборе данных PASCAL VOC, который мог классифицировать объекты между 20 классами. Доказано, что это полезно для более быстрого обнаружения объектов. Он успешно применяется при обнаружении объектов в видеозаписи в реальном времени. Со временем алгоритм был усовершенствован, что привело к появлению YOLOv2 или YOLO9000, а также YOLO v3. Вот ссылки на соответствующие статьи, если вам интересно.
YOLO
YOLO v2
YOLO v3
А вот таблица, в которой сравнивается производительность различных алгоритмов на заданном наборе данных. Я решил подробно осветить YOLO в другом блоге.

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

Живите долго и кодируйте.