Простое обнаружение объектов с помощью DETR от Facebook

Краткое введение в DETR с реальными примерами

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

Недавно я наткнулся на интересную статью от Facebook Research. Они публично предоставляют DETR, что означает DEtection TRansformer, алгоритм обнаружения объектов, очень простой в использовании с Pytorch. Как фанат питона, все, что есть в Pytorch, делает меня счастливым! 🤗

В этой статье мы быстро попробуем DETR на некоторых изображениях хорошего и низкого качества.

Обзор DETR

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

Давайте быстро увидим силу DETR на простом изображении. Мы выполняем следующие шаги на графическом процессоре:

  1. Создайте экземпляр модели DETR и отправьте его на графический процессор.
  2. Определите классы, которые DETR может обнаружить.
  3. Загрузите изображение и нормализуйте его. Будьте осторожны, это должно быть изображение RGB в форме (800, 600).
  4. Отправьте изображение на графический процессор с поддержкой cuda.
  5. Продвиньте ваше изображение через модель и получите прогнозы: i / предсказанные блоки с положением на изображении обнаруженных объектов и ii / предсказанные вероятности для каждого из 100 обнаруженных изображений. Для последнего у нас есть для каждого обнаруженного изображения распределение значений, соответствующих каждому классу. После нормализации, например, с помощью функции softwax, мы получаем для каждого изображения вектор размера (1, N_CLASSES), где N_CLASSES = 91, с вероятностями каждого класса. Форма выхода: (100, 91)
  6. Затем мы применяем argmax к каждой строке предыдущего вывода, чтобы получить индекс класса, максимизируя вероятность того, что объект будет взят из одного из классов. Обратите внимание, что нормализация с помощью Softmax ранее не требуется, поскольку здесь нас интересует только argmax, то есть индекс максимальной вероятности в нашем векторе вероятностей по классам. Форма вывода: (100, 1)
  7. Теперь, когда у нас есть предсказанный класс для каждого объекта, обнаруженного на нашем изображении, мы можем нарисовать на изображении рамку, чтобы показать объект с его ассоциированным классом. Координаты такого бокса находятся на одном из выходов DETR на шаге 5.

Авторы DETR предоставляют колабу, чтобы продемонстрировать, насколько легко им пользоваться. DETR использует стандартную нормализацию ImageNet и поля вывода в относительных координатах изображения в формате [center, 𝑦center, 𝑤, ℎ], где [𝑥center, 𝑦center] - это прогнозируемый центр ограничивающего прямоугольника, а 𝑤, ℎ - его ширина и высота. Поскольку координаты относятся к размеру изображения и лежат между [0,1], мы конвертируем прогнозы в абсолютные координаты изображения и формат [𝑥0, 𝑦0, 𝑥1, 𝑦1] для целей визуализации .

Производительность DETR на изображениях хорошего и низкого качества

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

Применяя шаги с 1 по 7, мы можем обнаруживать объекты на таком изображении с помощью DETR.

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

Давайте теперь посмотрим, как DETR работает с кадрами камеры, что в целом соответствует изображению низкого качества. Мы решили поиграть с двумя примерами, взятыми из видеозаписи Гетеборга в Швеции. Начнем с примера, где я могу обнаружить примерно 17 человек. Сколько людей вы обнаруживаете? 🤗

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

Теперь мы хотим знать, скольких людей наша модель предсказывает с достаточной уверенностью. Этот уровень достоверности можно настроить как гиперпараметр (см. Параметр уровень достоверности в функции обнаружить из нашего colab ). Ниже мы показываем два выхода DETR, первый соответствует уровню достоверности, установленному на 70%.

Второй результат соответствует более низкому уровню достоверности, установленному на 10%. В этом случае модель действительно не уверена в предсказании, поскольку она предсказала класс объекта с вероятностью не менее 0,10.

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

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

Простое сравнение Yolo и DETR

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

На этот раз мы будем использовать Pytorch-реализацию Yolo. Мы воспроизводим обнаружение объектов, предложенное в их реализации, и в этом случае делаем общее обнаружение объектов без фильтрации класса человек.

Для DETR мы выполняем шаги 1–7, как указано ранее в разделе Обзор DETR.

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

Начнем с обнаружения любого объекта с помощью Yolo. Удивительно, но алгоритм не обнаружил ни одного человека. Из-за отсутствия ясности в исходном коде я оставляю определение как есть. Сообщите мне, если вы обнаружите какую-либо явную проблему в предлагаемом коде! 🤗

Теперь давайте займемся «обнаружением человека» с помощью DETR. На этот раз это очень просто, и можно сразу увидеть результаты, как показано ниже, с минимальным уровнем достоверности, установленным на 0,70.

Мы воспроизводим тот же эксперимент с другим кадром, как показано ниже.

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

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

Очевидно, что такой эксперимент недостаточно строгий. Следует создать гораздо больший набор данных с помеченными изображениями и сравнить на нем эти две архитектуры. Исследователи Facebook провели более тщательный анализ. Ниже мы приводим одну из сравнительных таблиц из их статьи, где мы можем увидеть производительность DETR по сравнению с Faster R-CNN, ResNet-50 и ResNet-101.

Заключение

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

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