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

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

Набор данных

Первым шагом является создание настраиваемого набора данных для torch DataLoader, который будет использоваться в обучении. Пример кода в этом руководстве является хорошим ориентиром для этой задачи. Чтобы реализовать лучшую производительность детектора одного класса, обучающий набор данных должен включать сложные отрицательные образцы. Это помогает ему научиться различать истинные и похожие, но ложные случаи. Например, детектор Пикачу может включать изображения Ditto, Mimikyu и настоящего Pikachu в набор обучающих данных.

Отрицательные образцы не нуждаются в аннотациях ограничительной рамки, поэтому Torchvision может легко их подготовить. Однако эта возможность поддерживается только в версии 0.6.0 или новее. Метод __getitem __ () в классе dataset должен напоминать этот фрагмент:

Модель

Сообщения типа это » и «это уже объясняют, как работает Faster R-CNN, поэтому мы не будем перефразировать эту тему. Вместо этого, после краткого изучения общей структуры Faster R-CNN, давайте сосредоточимся на изменениях, необходимых для изменения предварительно обученной модели для использования с одноклассным детектором.

Обзор структуры

Более быстрый R-CNN содержит CNN для извлечения карт признаков из входных изображений. Эти карты характеристик затем используются для предложения регионов-кандидатов, а также для прогнозирования оценки и уточнения ограничивающей рамки в каждом предложенном регионе. Одна из моделей извлечения признаков, доступных в torchvision, основана на Resnet-50, обученном с помощью набора данных COCO train2017, который может идентифицировать около 90 категорий. Извлеченные карты признаков затем отправляются в сеть предложений регионов (RPN) для прогнозирования областей (ограничивающих прямоугольников), которые, возможно, содержат целевые объекты, и каждая предлагаемая область включает прогнозируемую оценку объектности. Наконец, первые N предложенных регионов и карты характеристик передаются классификатору, чтобы решить, содержат ли они целевой объект, и уточнить их ограничивающие рамки.

Сеть предложений регионов (RPN)

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

В torchvision инициализация этих якорей определяется в AnchorGenerator. Для предлагаемого варианта использования RPN необходимо рассматривать только один объект, поэтому размер и соотношение привязок могут быть определены в соответствии с целевым объектом. Например, для ограничивающего прямоугольника Пикачу с его хвостом обычно требуется прямоугольник с соотношением высоты и ширины, близким к 1. Поэтому ratio_ratios может быть изменено со значения по умолчанию (0,5, 1,0, 2,0) на ( 0,75, 1,0, 1,5) - или даже просто (1,0), что показывает аналогичные результаты в статье с COCO dataset.

Во время обучения не все якоря будут использоваться при вычислении функции потерь RPN. Только те, у которых есть IoU (Intersection-over-Union) с окном истинности больше / меньше порогового значения fg_iou_threshold / bg_iou_threshold, считаются положительными / отрицательными. якоря и имеют возможный вклад в функцию потерь. Якоря, которые не являются ни положительными, ни отрицательными, не влияют на обучение.

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

RPN Faster R-CNN часто генерирует перекрывающиеся предложения. Чтобы уменьшить избыточность, он применяет операцию Non-Maximum Suppression (NMS), чтобы сохранить только предложения с показателем объектности выше 0,7. После NMS первые N предложений (2000 в исходной работе) передаются в последний классификатор Fast R-CNN. Все параметры по умолчанию для количества якорей и предложений настроены для обнаружения нескольких объектов. Предлагаемый сценарий, однако, включает в себя только одну или несколько целей в одном изображении, поэтому эти параметры можно снизить, чтобы уменьшить количество предлагаемых областей и ускорить обучение. В приведенном ниже фрагменте кода показан рекомендуемый RPN для этого.

Быстрый R-CNN

После получения предложений по регионам от RPN классификатор (Fast R-CNN) работает с извлеченными картами признаков для проверки объектов в этих регионах. Его цель - предсказать окончательные оценки объектности и уточнить ограничивающие рамки на целевых объектах. Этому классификатору необходим слой объединения ROI, предложенный в предыдущей работе Fast R-CNN, для извлечения объектов с разными размерами входной области и последующего вывода карт объектов фиксированного размера. Классификатор в API называется roi_heads.

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

Обучение модели

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

На приведенном выше рисунке показано, что убыток колеблется, а не снижается, предполагая, что скорость обучения по умолчанию 0,005 может быть слишком большой. Это приводит к тому, что модель испытывает трудности с нахождением минимума функции потерь. Изменение этого значения на 0,0005 с помощью torch optimizer обеспечивает гораздо лучшую сходимость, как показано ниже.

Весь процесс обучения может напоминать следующий фрагмент.

Заключение

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