Мягкий подход

Что такое YOLO v3?

YOLO v3 – это популярная сверточная нейронная сеть (CNN) для обнаружения объектов в реальном времени, опубликованная в 2018 году компанией J. . Редмон и др. На момент своего выпуска он представлял собой современный инструмент для решения этой задачи, обеспечивая точную и быструю работу, как никогда раньше, и даже сегодня он по-прежнему является более чем действенным инструментом. С графическим процессором Titan X он может эффективно обрабатывать изображения 320x320 со скоростью 45 кадров в секунду (22 мс для логического вывода). При входном изображении цель обнаружения объектов состоит не только в распознавании объектов на изображении, но и в определении их местоположения с помощью ограничивающих прямоугольников. Со временем он нашел множество применений и применений, сильно затронув несколько промышленных областей. Просто подумайте о таких задачах, как обнаружение транспортных средств или пешеходов для автономного вождения, обнаружение животных для мониторинга леса или обнаружение определенных компонентов для производственных прицелов.

Вы только посмотрите один раз.

Название YOLO расшифровывается как «You Only Look Once» и относится к монолитной архитектуре модели. По сути, YOLO v3 — первая в своем роде сквозная сеть. Это означает, что входные изображения потребляются за один этап, во время которого одновременно определяются местоположения объектов и связанные с ними классы. Это гарантирует огромные преимущества с точки зрения скорости обучения и логического вывода. До YOLO v3 конкурирующие модели интенсивно обрабатывали входные данные: обработка одного изображения занимала до минуты, что делало невозможным работу приложений в реальном времени. Например, при наличии входного изображения R-CNN (CNN на основе регионов) применяет выборочный поиск для извлечения около 2000 регионов-кандидатов. После этого наиболее похожие регионы объединяются для формирования окончательных предложений. Только в этот момент каждая из выбранных областей проходит через CNN для классификации объектов внутри них.

YOLO v4, YOLO v5 или PP-YOLO?

На самом деле YOLO v3 — не последний продукт семейства YOLO. Позже было опубликовано несколько версий, таких как YOLO v4, YOLO v5 и PP-YOLO среди самых известных, все от разных авторов, в 2020 г. на очень небольшом расстоянии друг от друга. На самом деле, история, стоящая за ними, довольно противоречива. YOLO v4 — последняя модель, использующая DarkNet-53, основу YOLO v3. PP-YOLO — это повторная реализация YOLO v3 на основе среды глубокого обучения PaddlePaddle. Вместо этого YOLO v5 является наиболее обсуждаемым из трех в исследовательском сообществе, так как при его публикации отсутствовали экспертные оценки, а также из-за обещанной производительности. YOLO v3 — это последняя работа, над которой непосредственно работал J. Редмона, которого можно считать отцом семейства продуктов YOLO. Говорят, что он прекратил исследования в этой области после того, как YOLO v3 был использован в военных целях, что нежелательно для автора. Более того, он заявил, что признает только YOLO v4 действительно достойным преемником YOLO v3. Таким образом, причина углубления уже не самой современной модели заключается в том влиянии, которое она оказала на компьютерное зрение. Более того, он заложил основу для всех последующих архитектур: понимание YOLO v3 дает возможность лучше понять и выбрать между последними моделями обнаружения объектов.

Архитектура.

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

CNN.

Начнем с основ: YOLO v3 — это CNN. Проще говоря, CNN — это глубокая нейронная сеть, предназначенная в первую очередь для обработки изображений. Она отличается от более классической нейронной сети наличием сверточных слоев. Каждый сверточный слой можно рассматривать как набор фильтров (таких как размытие по Гауссу или детектор краев), применяемых к изображению для извлечения полезных функций. Эти фильтры динамически изучаются во время обучения сети. Фильтр состоит из матрицы, называемой kernel, обычно размером 3x3 или 1x1, как в YOLO v3, т.е. применяется к изображению с помощью операции свертки. Ядро перемещается по всему изображению с определенным шагом (количеством пикселей), обрабатывая основное содержимое на каждом этапе. Размер ядра и шаг определяют размеры вывода фильтра.

Даркнет-53.

DarkNet-53 — это YOLO v3 основа, отвечающая за извлечение функций. Это CNN, состоящая из 52 сверточных слоев, всего 53 слоя и множество пропущенных соединений. Пропускать подключения — еще одна ключевая концепция YOLO v3. Эмпирически известно, что более глубокие сети борются с изучением простых функций, таких как функция идентификации. Эти функции хорошо оцениваются в самых первых слоях, но их качество ухудшается по мере углубления сети: эту проблему решает пропуск соединений. Обычно в нейронной сети выход слоя представляет собой вход следующего слоя. Соединения Skip позволяют одному выходному слою обходить следующие за ним слои, чтобы их можно было снова рассмотреть позже. При таком подходе сохраняется более простая информация (называемая остаточным блоком), которая не проходит через слои; с другой стороны, более сложная информация извлекается при обычном прохождении через слои. Впоследствии простая и сложная информация объединяется с операцией суммы.

Возвращаясь к YOLO v3, он состоит из DarkNet-53 плюс 53 дополнительных слоя, всего 106 слоев.

Вход.

Теперь поговорим о входе в сеть. В случае, который мы рассмотрим, YOLO v3 принимает в качестве входных изображений размер 608x608, умноженный на количество каналов (3 для изображений RGB, 1 для оттенки серого). Как мы увидим, эти размеры не случайны. Конечно, сеть может обрабатывать изображения любого размера, если они изменены до 608x608. Кроме того, вы можете просто изменить размер всего изображения или изменить его размер и обрезать его, чтобы сохранить исходное соотношение сторон.

Проходя через DarkNet-53, извлеченные карты объектов масштабируются до размеров 76 x 76, 38 x 38 и 19 x 19, используя шаги со значениями 8, 16 и 32 соответственно. Обратите внимание, что входной размер 608 идеально делится на 32, что позволяет достичь только что описанных масштабов. Таким образом, сеть может принимать любые входные данные, размеры которых кратны 32.

Мы отправим YOLO v3изображение милогопопугая с оранжевым подбородком. 🐦

Якорные ящики.

Якорные блоки — еще один ключевой момент YOLO v3. Они представляют собой идеальные ограничивающие рамки рамки и обнаруживаются на этапе обучения путем кластеризации известных рамок примеров. Таким образом, якорные поля описывают наиболее часто встречающиеся соотношения ширины и высоты в реальных условиях. Для каждого шага масштабирования (76 x 76, 38 x 38 и 19 x 19) извлекаются три поля привязки, всего девять полей. сильный>. Якорные рамки используются во время вывода, для определения размера ограничивающей рамки-кандидата. В частности, размер ограничивающей рамки выражается через отношение ширины и высоты наиболее подходящей рамки привязки. Действительно, было замечено, что легче выразить размер ограничивающего прямоугольника, рассматривая якорные блоки, чем начинать полностью с нуля.

1-е обнаружение объекта.

Перейдем к самому вкусному разделу: этапы обнаружения объекта. YOLO v3 выполняет три этапа обнаружения объектов в трех разных масштабах, чтобы распознавать объекты разных размеров. Первое обнаружение происходит на 82-м уровне, и он отвечает за распознавание самых крупных объектов на изображении. Здесь после прохождения через DarkNet-53 карта объектов имеет размер 19x19x1024. Для простоты мы теперь будем называть карту объектов изображением размером 19x19, игнорируя его глубину. Поэтому изображение подвергается операции свертки с размером ядра 1x1. Результат этой свертки будет иметь размеры 19 x 19 x (B x (5 + C)), где 19x19 относится к текущему ширина и высота изображения. Рассмотрим подробнее, что означает (B x (5 + C)):

  • B обозначает количество ограничивающих рамок, идентифицируемых для каждой ячейки изображения. Другими словами, для каждой ячейки изображения YOLO v3 пытается предсказать Bвозможные ограничивающие рамки принадлежности. В YOLO v3 B равно 3.
  • 5 – это количество атрибутов, описывающих каждую ограничивающую рамку кандидата. Вот они:
     – (tx, ty): смещение центра ограничивающей рамки относительно интересующей ячейки.
     – (tw, th): размер ограничивающей рамки, выраженный в виде масштаба наиболее подходящей рамки привязки (например, если рамка привязки имеет размер 100 x 100, а ограничивающая box имеет размер 90x80, тогда tw = 0,9 и th = 0,8).
    - p₀: показатель объективности. Он описывает вероятность того, что интересующая ячейка находится в центре ограничивающей рамки и, следовательно, является более значимой.
  • C означает количество распознаваемых классов. Следовательно, значения C {p₁, p₂, …, pc} описывают вероятность того, что ограничивающая рамка принадлежит каждому из известных классов. Поскольку большинство дистрибутивов YOLO v3 предварительно обучены на наборе данных COCO, который описывает 80 различных классов, в нашем случае мы будем говорить, что C равно 80.

Напомним, что для каждой ячейки изображения идентифицируются три ограничивающих прямоугольника, всего 19x19x3 = 1083 ограничивающих прямоугольника на первом этапе обнаружения. Каждая ограничивающая рамка описывается следующими значениями (tx, ty, tw, th, p₀, {p₁, p₂, …, pc}). Оценка класса каждой ограничивающей рамки определяется путем умножения оценки объектности на наивысшую вероятность принадлежности к классу (p₀ MAX ({p₁, p₂, …, pc})).

Обнаружение 2-го и 3-го объекта.

Как только первое обнаружение закончено, давайте сделаем шаг назад прямо перед ним. Изображение размером 19 x 19 подвергается повышению дискретизации до 38 x 38, проходит через несколько сверточных слоев и пропускает соединения. Перед вторым обнаружением изображение объединяется с изображением из 61-го слоя, имеющим тот же размер 38x38. Это связано с тем, что текущее изображение можно рассматривать как изображение с низким разрешением, функции которого были тщательно обработаны. И наоборот, выход 61-го слоя — это изображение с более высоким разрешением, черты которого еще недостаточно обработаны. Следовательно, объединение двух изображений потенциально может улучшить результаты обнаружения. Обнаружение второго объекта происходит на 94-м уровне и отвечает за распознавание объектов среднего размера на изображении. Он работает точно так же, как первое обнаружение, и на этот раз извлекается 38x38x3 = 4332 ограничивающих прямоугольника-кандидата.

Таким же образом, перед третьим детектированием изображение размером 38x38 подвергается апсэмплингу до 76x76, проходит дальнейшие сверточные слои и пропускают соединения, и он объединяется с выходом 36-го уровня, имеющего тот же размер 76x76. Наконец, обнаружение третьего и последнего объекта происходит на 106-м уровне и отвечает за распознавание более мелких объектов на изображении.76x76x3 = 17328 ограничивающие рамки извлекаются на этом этапе.

Не максимальное подавление.

Всего один шаг, мы почти у цели! После того, как три этапа обнаружения объектов завершены, у нас есть в целом 1083+4332+17328 = 22743 ограничивающих прямоугольника-кандидата, каждый со своей собственной оценкой класса. Конечно, не все из них дают хороший результат, поэтому нам нужно их фильтровать. Алгоритм немаксимального подавления рассматривает набор B всех ограничивающих рамок-кандидатов и набор D окончательных ограничивающих рамок, изначально пустых. Ограничивающий прямоугольник с наибольшей оценкой перемещается из B в D, а затем сравнивается со всеми другими прямоугольниками, оставшимися в B. с точки зрения IoU. IoU (пересечение над единицей) — это показатель, принятый в задачах обнаружения и сегментации, который описывает перекрытие между двумя ограничивающими рамками (обычно истинной и предсказанной). Если IoU превышает определенный порог, блок в B отбрасывается, поскольку он слишком похож на только что извлеченный и имеет более низкий балл. После завершения сравнения процедура повторяется, перемещая лучшие ограничительные рамки из B в D, пока B не станет пустым. Наконец, вы можете дополнительно отфильтровать ограничительные рамки в B, отклонив те, оценка которых ниже фиксированного порога.

B: set of candidate bounding boxes, D: set of definitive bounding boxes
1. Consider the bounding box b with maximum score in B and move it to D
2. Compare b with all the other bounding boxes bi in B
 — If bi is too similar to b in terms of IoU, remove bi from B
3. Repeat from 1. until B is empty

Вот так! Прогноз завершен. 😎

Демо.

Поскольку DarkNet является открытым исходным кодом, существует множество версий YOLO v3, готовых к использованию в различных случаях. Например, вы можете легко найти блокноты Python для обнаружения объектов на изображениях, видео или даже в режиме реального времени через веб-камеру. Помимо этого, существует множество руководств и учебных пособий, объясняющих, как использовать YOLO v3, обучить его заново, выполнить перенос учиться и даже создавать его с нуля. Учитывая объем доступного материала, в этом разделе мы просто покажем, как можно легко использовать предварительно обученную модель для обнаружения объектов на изображениях, написав всего несколько строк кода. В этой демонстрации мы будем использовать один из самых распространенных фреймворков YOLO v3, доступных в репозитории GitHub (https://github.com/AlexeyAB/darknet). Вы можете протестировать следующий код в блокноте Google Colab.

Во-первых, вам нужно клонироватьрепозиторий GitHub. Вы можете включить использование графического процессора и OpenCV, отредактировав Makefile, иначе модель будет выполняться на ЦП. После этого запустите Makefile и скомпилируйте то, что вам нужно, так как фреймворк в основном написан на C.

! git clone https://github.com/pjreddie/darknet
! sed -i ‘s/GPU=0/GPU=1/g’ Makefile
! sed -i ‘s/OPENCV=0/OPENCV=1/g’ Makefile
% cd darknet
! make

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

! wget https://pjreddie.com/media/files/yolov3.weights

Вы почти сделали это! Теперь вам нужно только запустить модель. Вы можете выбрать изображения, уже доступные в darknet/data, или загрузить свои собственные.

! ./darknet detect cfg/yolov3.cfg yolov3.weights data/giraffe.jpg

Вот и все! Вы выполнили прогнозирование обнаружения объектов с помощью YOLO v3 всего за 7 строк кода. В выходных данных вы увидите некоторую информацию, такую ​​как длительность прогноза и показатели достоверности, связанные с распознанными объектами. Продолжительность прогноза может значительно измениться, если вы решите использовать ЦП или ГП. Наконец, вы можете визуально оценить результаты прогноза, открыв изображение darknet/predictions.jpg.

Выводы.

Вот мы и подошли к концу этого путешествия с YOLO v3! Как мы видели, YOLO v3 — это мощная CNN для обнаружения объектов в реальном времени. Это была первая в своем роде сквозная сеть, которая заложила основу для всех последующих архитектур. Мы проанализировали, как это работает, наблюдая за полной обработкой входного изображения, от его получения до подачи прогноза. Это позволило нам получить общее представление об архитектуре YOLO v3 и углубиться в некоторые ключевые функции, такие как пропуск соединений, блоки привязки или Алгоритм немаксимального подавления. Это был «мягкий подход» к YOLO v3, но многое еще предстоит сказать. Например, учитывая его простую структуру, впечатляющей прогностической способности YOLO v3 действительно способствует его функция потерь во время обучения. Это сложная функция, которая сочетает в себе координатность, объектность и потери классификации, чтобы свести к минимуму эти три ошибки. Наконец, мы увидели, насколько легко использовать предварительно обученную модель для прогнозирования и сколько онлайн-решений доступно для самых разных вариантов использования. В заключение, несмотря на свой четырехлетний возраст, YOLO v3 по-прежнему является более чем подходящим инструментом для задач обнаружения объектов. Конечно, это уже не уровень техники: на сегодняшний день существует множество решений, способных удовлетворить различные требования по точности, частоте кадров, вычислительным затратам, переносимости и так далее. Однако целью этой статьи было дать понятное описание функционирования YOLO v3, чтобы любой, кто приближается к обнаружению объектов, мог понять все остальные модели, основанные на нем, и выбрать для себя лучшую.

Спасибо за прочтение, надеюсь было полезно! Развлекайтесь с YOLO v3! 🎉

Ссылки.

YOLO v3: постепенное улучшение