В I части этого поста мы узнали, как загрузить и обработать набор данных из POINTOUT. Теперь мы увидим, как реализовать и обучить сеть обнаружения объектов SSD с нашими данными.

Если вы хотите узнать больше о POINTOUT, ознакомьтесь с нашим предыдущим постом.

Вы можете следить за этим постом с блокнотами Jupyter в этом репозитории.

Загрузка данных

Во-первых, мы должны загрузить данные, сгенерированные в части I. Мы создали несколько файлов csv, содержащих имена изображений и их аннотации, один из которых содержит исправления для обучения, а другой — для оценки. У нас также есть два дополнительных файла со связью между исходными изображениями и патчами, поэтому мы можем реконструировать мозаику.

Мы собираемся использовать PyTorch для реализации и обучения нашей модели. Чтобы передавать данные в нашу сеть, нам нужны два класса. Первый — это Набор данных, который будет отвечать за загрузку изображений и аннотаций и за применение всех необходимых преобразований к данным. Мы используем библиотеку albumentations, чтобы применять повороты, цветовые вариации, шум и т. д. Этот метод известен как дополнение данных, и его полезно избегать переобучения.

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

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

Модель

Мы реализуем одноступенчатый детектор. Сеть состоит из:

  • Магистральная сеть для извлечения признаков: мы используем предварительно обученный Resnet34.
  • Голова для дальнейшего извлечения признаков в меньших масштабах и прогнозирования положения ограничительных рамок и меток.

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

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

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

Обучение

Для начала обучения нам необходимо определить следующие параметры:

  • Оптимизатор: мы используем оптимизатор ADAM со скоростью обучения 3e-4.
  • Критерий: Мы определяем SSD_Loss, состоящую из суммы потерь классификации (Focal Loss) и потерь локализации (потеря L1).
  • Метрика: мы используем оценку F1 в качестве нашей метрики.

Затем нам нужно только указать количество эпох и начать обучение.

После обучения мы можем визуализировать профиль. Мы должны увидеть снижение потерь и рост точности.

Тестирование

Наконец, мы можем применить наш детектор к проверочным изображениям, чтобы проверить его производительность. Мы используем файл мозаики_eval.csv для обнаружения объектов во всех фрагментах, принадлежащих одному и тому же полному изображению. В зависимости от порога, который мы использовали для расчета потерь, несколько якорей могут соответствовать одному и тому же объекту. Для удаления дубликатов мы используем алгоритм немаксимального подавления (NMS), который будет сохранять прогноз с наибольшей вероятностью среди тех, которые перекрываются в течение заданного IoU (этот порог обычно меньше, чем тот, который используется в потерях, между 0,3–0,4, и может быть найден с помощью жадного поиска, чтобы сохранить значение, которое максимизирует точность набора проверки).

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

Выводы

В этом посте мы увидели, как обучить сеть SSD с глубоким обучением для обнаружения объектов, используя данные, загруженные из POINTOUT. Обнаружение объектов — одна из самых сложных задач в компьютерном зрении, требующая множества настраиваемых вручную параметров и экспериментов со следами и ошибками. Предоставленные здесь ресурсы позволят вам попробовать различные конфигурации и создать наилучший из возможных детекторов. Общеизвестно, что алгоритмы глубокого обучения становятся лучше, когда используется больше данных. Это означает, что вы всегда можете зайти на https://targetdetection.com и добавить больше аннотаций для улучшения ваших моделей. Кроме того, если вы заинтересованы в обнаружении определенного типа объектов в определенной интересующей области без доступных данных, просто перейдите на POINTOUT и создайте свой собственный набор данных!

Связаться !

Если ты:

  • Профессионал, студент или энтузиаст ML/EO, заинтересованный в предоставлении отзывов для улучшения платформы.
  • Бизнес-разработчик заинтересован в такой платформе, как Pointout, адаптированной для ваших вариантов использования.

Свяжитесь с нами по адресу [email protected].

Следите за нами в Твиттере @Pointoutproject!

Мы продемонстрируем платформу и рассмотрим этот же пример вживую на Big Dive 8.