Создайте Детектор объектов из предварительно обученного Классификатора изображений в PyTorch.

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

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

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

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

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

· Полностью сверточная классификация изображений на изображениях произвольных размеров

· Вычисление принимающего поля CNN с использованием обратного распространения информации

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

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

Определив ожидания, приступим.

Немного фона

Для этого упражнения я использовал слегка измененную версию предварительно обученной модели Resnet-18, представленной в PyTorch.

В частности, используемая модель представляет собой вариант Resnet-18, в котором последний (и единственный) полностью связанный (или линейный) слой модели заменяется слоем 2D-свертки, тем самым преобразуя модель в полностью сверточную нейронную сеть ( FCNN).

Архитектура модели Fully Convolutional Resnet18 выглядит следующим образом:

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

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

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

Следующий рисунок иллюстрирует эту концепцию.

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

Давайте начнем

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

Как вы помните, карта ответов от FCNN имеет форму [1 x 1000 x n x m], где n и m зависят от ширины и высоты входного изображения и самой сети. 1000 соответствует 1000 классам базы данных ImageNet, на которых обучается Resnet18.

Используя операцию max на этой карте ответов, мы получаем максимальные [nxm] прогнозы или карту оценок из модели, которую можно интерпретировать как вывод, выполненный в [nxm] местах на изображении, полученном с помощью скользящего окна. размером 224 × 224 (размер входного изображения для исходной сети).

Для каждого из этих прогнозов в карте оценок у нас есть вероятности (заданные слоем Softmax) и категория (из ImageNet).

Ниже приведен пример карты очков формы [3 x 8] с выделенным верхним прогнозом:

Теперь мы рассмотрим каждое из этих [n x m] предсказаний и, если его вероятность выше заранее определенного порога, вычислим его рецептивное поле, используя обратное распространение.

Затем к каждому из этих принимающих полей мы применим операции OpenCV Image Threshold и Contour для получения ограничивающих рамок.

Краткое изложение всего конвейера показано ниже:

Ниже приведен фрагмент реализации. Скачайте полный код отсюда.

Ниже приводится пример результатов, которых мы достигаем:

Обработка перекрывающихся ограничивающих рамок

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

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

Параметры расчета принимающего поля

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

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

- Максимальный активированный пиксель

- Сетевое предсказание

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

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

Однако я кратко их резюмирую и дам сравнение двух методов с точки зрения результатов, которые они дают.

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

На некоторых изображениях (например, изображениях с низким разрешением) этот параметр прекрасно разделяет каждый отдельный экземпляр категории, как показано ниже:

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

Вариант-2: Воспринимающее поле, вычисляемое для Net Prediction, учитывает каждый из [nxm] пикселей в соответствующей ответной карте категории и предоставляет ограничивающую рамку области в исходном изображении, которая максимизировал чистый прогноз этой категории.

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

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

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

Какой вердикт?

Как видите, нет однозначного вердикта, какой из двух вариантов дает лучший результат.

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

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

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

С этой мыслью я хотел бы закончить этот блог.

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

Скачайте полный код отсюда.