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

ЛОКАЛИЗАЦИЯ ОБЪЕКТА:

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

Это то, что называется «классификацией с локализацией». Позже мы увидим проблему «обнаружения», которая занимается обнаружением и локализацией нескольких объектов на изображении.

Но обо всем по порядку.

При решении проблемы локализации объекта мы начинаем с той же сети, которую видели при классификации изображений. Итак, у нас есть изображение в качестве входных данных, которое проходит через ConvNet, в результате чего в softmax передается вектор функций для классификации объекта (например, с 4 классами для пешеходов / автомобилей / мотоциклов / фона). Теперь, если мы хотим локализовать эти объекты на изображении, мы изменяем нейронную сеть, чтобы у нее было еще несколько единиц вывода, которые охватывают ограничивающий прямоугольник. В частности, мы добавляем еще четыре числа, которые определяют координаты x и y левого верхнего угла, а также высоту и ширину прямоугольника (bx, by, bh, bw).

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

Где pc - это уверенность в том, что объект находится на изображении. Он отвечает на вопрос «есть ли объект?» Вместо этого c1, c2, c3, в случае наличия объекта, сообщают, является ли объект частью класса 1, 2 или 3. Таким образом, он сообщает нам, какой это объект. Наконец, bx, by, bh, bw идентифицируют координаты, относящиеся к ограничивающей рамке вокруг обнаруженного объекта.

Например, если на изображении изображен автомобиль, целевая метка будет такой:

Если сеть не обнаруживает объект, результат будет простым:

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

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

ОБНАРУЖЕНИЕ ОБЪЕКТОВ

Обнаружение объекта может быть выполнено с использованием метода, называемого «обнаружение скользящего окна». Мы обучаем ConvNet обнаруживать объекты в изображении и используем окна разных размеров, которые мы перемещаем поверх них. Для каждого окна мы делаем прогноз.

Этот метод дает довольно хорошие результаты (я использовал его для проекта, связанного с беспилотными автомобилями, и он дал отличные результаты. Зацените его: здесь).

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

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

Давайте это проверим!

Первым шагом на пути к сверточной реализации скользящих окон является превращение полностью связанных слоев нейронной сети в сверточные слои. См. Пример ниже:

Отлично, теперь, чтобы упростить представление, давайте перерисуем окончательную сеть в 2D:

Если наше тестовое изображение имеет размер 16x16x3 и нам нужно было выполнить «обычное» скользящее окно, нам пришлось бы создать 4 разных окна размером 14x14x3 из исходного тестового изображения и запустить каждое через ConvNet.

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

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

Каждый из 4-х подмножеств блока вывода является, по сути, результатом работы ConvNet с областью 14x14x3 в четырех позициях на исходном изображении 16x16x3.

Вам может быть интересно, работает ли это и на других примерах, и это так.

Подумайте о входном изображении 28x28x3. Пройдя по сети, приходим к итоговому выводу 8x8x4. В этом случае каждый из 8 подмножеств соответствует 8 запуску области 14x14x3 со слайдом 2 в исходном изображении.

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

Вскоре мы увидим, что алгоритм YOLO является решением этой проблемы.

_ _ _ _ _ _ _ _

YOLO ALGORITHM: (You-Only-Look-Once)

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

Начнем с размещения сетки поверх входного изображения. Затем для каждой ячейки сетки мы запускаем алгоритм классификации и локализации, который мы видели в начале блога. Метки для обучения для каждой ячейки сетки будут похожи на те, что мы видели ранее, с 8-мерным выходным вектором:

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

Объект «присваивается» конкретной ячейке, смотрящей туда, куда падает центр.

Если у нас есть ячейка сетки 3x3, то целевой выходной объем будет иметь размер 3x3x8 (где 8 - количество меток в y). Итак, в этом случае мы пропустим входное изображение через ConvNet, чтобы сопоставить его с выходным объемом 3x3x8.

Итак, у нас есть сверточная реализация для всех ячеек сетки (а не для 9 отдельных ячеек), как мы видели ранее. Поэтому мы объединяем то, что мы видели в алгоритме классификации локализации, со сверточной реализацией.

Преимущество этого алгоритма заключается в том, что он выводит точные положения ограничивающих прямоугольников, поскольку значения bx, by, bh, bw вычисляются относительно ячейки. Таким образом, чем более мелкая сетка у нас есть, тем больше точности мы можем получить, а также у нас меньше шансов иметь несколько объектов в ячейке.

Пересечение через Союз (IoU)

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

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

Следовательно:

Мы определяем эталонный тест и рассматриваем возможность точного обнаружения объекта, если результат IoU превышает это конкретное значение. (т.е. IoU ‹= 0,5)

Очевидно, что чем выше значение IoU, тем точнее мы получаем результаты.

Подавление без максимальных значений

Этот метод используется для улучшения работы нашего алгоритма YOLO.

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

Сначала мы назначаем вероятность для каждого обнаружения, затем берем ячейку «наибольшая вероятность». Теперь мы смотрим на блоки, которые перекрываются больше всего с блоком «наибольшей вероятности», и удаляем те, которые имеют высокий IoU (то есть те, которые имеют большую площадь пересечения). Наконец, оставшееся поле - это правильное определение.

Помните, что каждое предсказание имеет значение pc, которое определяет вероятность предсказания. Теперь отбросим, ​​например, все квадраты с pc ‹= 0,6.

Пока есть оставшиеся коробки, мы делаем:

  • возьмите коробку с самым большим компьютером. Выведите это как прогноз.
  • отбросьте все оставшиеся поля с IoU ›= 0,5 по отношению к выходным данным окна на предыдущем шаге.

Если у нас есть несколько классов (объектов), то мы реализуем немаксимальное подавление независимо для каждого из них.

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

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

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

Если мы выбрали два якорных блока, то метка класса будет:

Таким образом, каждый объект в обучающем образе был назначен ячейке сетки, которая содержала среднюю точку этого объекта (для сетки 3x3 результат был 3x3x8). Теперь каждый объект в обучающем образе назначается ячейке сетки, которая содержит среднюю точку этого объекта и блок привязки для ячейки сетки с наивысшим значением IoU.

(для сетки 3x3 и 2 якорных ящиков результат будет 3x3x16).

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

Собираем все вместе для YOLO

Советы по реализации алгоритма YOLO:

  • определите размер сетки и количество якорных ящиков (поскольку эти две переменные определяют размер выходного объема y).
  • Обучите ConvNet на обучающих образах.
  • Запустить не максимальное подавление.

_____________________

РЕГИОНАЛЬНЫЕ ПРЕДЛОЖЕНИЯ (R-CNN)

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

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

Чтобы ускорить это там, был предложен алгоритм «быстрого R-CNN». Для этого у нас все еще есть первый шаг, который предлагает области, но затем он использует реализацию свертки скользящих окон для классификации всех предложенных областей.

Ну, первый шаг все еще немного медленный, правда?

Почему не «более быстрый R-CNN»? Да, есть.

Он заменяет первый шаг использованием сверточной сети для предложения регионов.

Какое путешествие!

Этот блог основан на лекциях Эндрю Нг на DeepLearning.ai