СОДЕРЖАНИЕ

  • Обзор
  • Что такое обнаружение объектов
  • Коротко о семье R-CNN
  • Внутренности YOLO
  • Пересечение через союз (IOU)
  • Не максимальное подавление
  • Расчет убытков
  • средняя средняя точность
  • Выполнение

Ссылка на код

В этом блоге больше внимания уделяется внутренней работе и терминологии, используемой в алгоритмах YOLO, а не части реализации. Чтобы получить доступ к полному коду этого блога, обратитесь к моему Github.

Live Prediction на YOLO для обнаружения объектов

Обзор

YOLO означает Ты смотришь только один раз. Это современная техника обнаружения объектов, которая впервые описана в оригинальном документе 2015 Джозефа Редмона и др. YOLO поставляется с множеством версий, таких как YOLO v1, YOLO v2, YOLO v3 и т. Д. YOLO v5 - последняя версия на момент написания этого блога, но здесь мы сосредоточимся на YOLO v1.

Существует множество алгоритмов и методов для обнаружения объектов, таких как семейство R-CNN, гистограмма ориентированных градиентов (HOG), детектор одиночных снимков (SSD) и многие другие, но среди них YOLO стал самым популярным методом обнаружения объектов. Две основные причины для этого:

  • Прогноз в модели YOLO практически в реальном времени.
  • Полный конвейер обнаружения объектов (от изображения как ввода до конечного вывода) включает одну единственную модель.

Прогнозирование в реальном времени сделало его популярным в таких приложениях, как беспилотные автомобили, идентификация транспортных средств по сигналам светофора и т. Д., Где стратегия обучения с использованием единой модели упростила обучение для этих приложений.

Что такое обнаружение объектов

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

Локализация:

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

Классификация:

Это самая распространенная задача компьютерного зрения. Классификация означает отнесение изображения к определенному классу.

Обнаружение объекта

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

Обнаружение объектов - непростая задача, поскольку необходимо идентифицировать:

  • Сколько там объектов
  • В каком месте размещены эти объекты
  • Каков размер каждого объекта
  • Какие бывают классы

Коротко о семье R-CNN

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

Техника раздвижного окна

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

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

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

R-CNN

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

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

Проблемы:

  • R-CNN включает в себя несколько моделей, и эти модели работают независимо. Он использует ConvNet для определения характеристик, SVM для классификации и другую модель Regressor для прогнозирования связующей коробки.
  • Он генерирует 2000 регионов для каждого изображения и использует ConvNet 2000 раз, чтобы получить характеристики для каждого региона. Эта задача станет более сложной, когда количество изображений будет большим.
  • Обучить такую ​​модель очень сложно, так как каждая из моделей работает отдельно.

Быстрый R-CNN

R-CNN использует ConvNet 2000 раз для каждого изображения, что требует очень много времени. Fast R-CNN, как его называют, предполагает сокращение времени, необходимого для прогнозирования, за счет следующих изменений:

  • R-CNN генерирует область интереса (ROI) из исходного изображения, затем отправляет его в ConvNet для определения характеристик, где Fast R-CNN изменяет последовательность процессов, поскольку сначала отправляет изображение в ConvNet, а затем генерирует ROI, используя метод регионального предложения по функции. карты. Таким образом Fast R-CNN сэкономил время, так как ConvNet используется только один раз для определения характеристик одного изображения.
  • Fast R-CNN использует слой объединения ROI, который генерирует карты характеристик фиксированного размера для каждой области интереса, что означает, что независимо от размера и формы области интереса, объединение ROI будет выводить карту характеристик одинакового размера для каждой области интереса.
  • Fast R-CNN не использует разные модели для задач классификации (прогнозирование классов) и регрессии (ограничивающая рамка), поскольку уровень объединения RIO генерирует карты функций фиксированного размера, которые можно складывать вместе и отправлять в полностью подключенную сеть.
  • На последнем уровне используется активация softmax для классов и линейная активация для ящиков.

Проблемы:

Даже у Fast RCNN есть определенные проблемные области. Он также использует выборочный поиск в качестве метода предложения для поиска областей интереса, что является медленным и трудоемким процессом. На обнаружение объектов уходит около 2 секунд на изображение, что намного лучше по сравнению с RCNN. Но когда мы рассматриваем большие наборы данных из реальной жизни, то даже Fast R-CNN уже не выглядит так быстро.

Быстрее R-CNN

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

Следующие ниже шаги обычно выполняются в подходе Faster RCNN:

  • Мы берем изображение в качестве входных данных и передаем его в ConvNet, которая возвращает карту функций для этого изображения.
  • На этих картах функций нанесены сети предложений регионов. Это возвращает предложения объектов вместе с их оценкой объектности.
  • Слой объединения RoI применяется к этим предложениям, чтобы уменьшить все предложения до одинакового размера.
  • Наконец, предложения передаются на полностью связанный слой, который имеет слой softmax и слой линейной регрессии наверху, чтобы классифицировать и вывести ограничивающие рамки для объектов.

Проблема:

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

Читатель может посетить Семейство R-CNN, чтобы узнать больше об этих алгоритмах.

Внутренности YOLO

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

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

С чего начать?

Понимание алгоритма YOLO начинается с понимания его архитектуры модели.

Модель YOLO принимает изображение rgb размером (448 448). Архитектура модели требует базового понимания сверточных нейронных сетей. При построении этой архитектуры нам просто нужно поддерживать последовательность уровня Conv и максимального уровня объединения, а остальная часть промежуточного уровня не требует пояснений.

Самая важная часть этой архитектуры - понимать ее результат.

Как интерпретировать результаты модели?

Выходной размер приведенной выше модели составляет (7,7,30) для одного изображения rgb размером (448,448). Чтобы интерпретировать выходные данные модели, представьте, что изображение разделено на сетку равного размера 7 на 7 (всего 49), которая также называется ячейкой, и каждая ячейка представлена ​​30-мерным вектором.

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

Что это за 30 параметров?

Первые 20 параметров являются выходными данными активации softmax, которые представляют вероятность принадлежности объекта к классу i (i от 1 до 20) для каждой ячейки. Эта архитектура YOLO использует набор данных PascalVOC, который содержит 20 различных классов объектов, поэтому его выходные данные назначают свои первые 20 параметров для 20 различных классов. Если вы тренируете свою модель на другом пользовательском наборе данных, выходные данные должны измениться соответствующим образом.

Для обучающих данных Pc, которые являются 21-м и 25-м выходными параметрами, будет двоичное число 0 или 1. 0 представляет отсутствие объекта, а 1 представляет присутствие объекта в ячейке. x и y представляют координаты x и y центральной точки объекта, где w и h представляют высоту. и ширина объекта. Помните, что все x, y, w и h являются значениями по отношению к определенной ячейке. Позже в этом блоге мы поймем, почему у нас есть две пары pc, x, y, w и h.

Теперь давайте разберемся с выводом на очень простом примере, где мы разделим изображение на сетку 3 на 3 и получим только два разных возможных класса dog = 1 и cat = 2. Таким образом, размер вывода будет равен

(сетка, сетка, количество классов + (5 * количество ограничивающих рамок)) → (3,3, 2 + 5 * 2) → (3,3,12)

Первая ячейка имеет небольшую часть левой собаки, но не содержит ее средней точки (синей точки), поэтому выходные данные, соответствующие этой ячейке, будут

[*, *, 0, *, *, *, *, 0, *, *, *, *], где 0 означает отсутствие объекта, а '*' означает «безразлично» означает, что эти значения будут игнорироваться при обучении модели. .

Теперь давайте попробуем рассчитать результат для этой ячейки.

Эта ячейка содержит середину объекта, который представляет собой собаку, поэтому c1 = 1 (собака), c2 = 0 (кошка) и pc1 = 1, потому что у него есть объект. Помните, что x, y, w и h эти четыре параметра вычисляются относительно ячейки, а не изображения, поэтому x, y будут быть значением с плавающей запятой от 0 до 1, но w и h могут быть больше 1 в случае, если сам объект больше ячейки.

Итак, в ячейке выше x = 0,9, потому что средняя точка находится почти на конце оси x, и y = 0,55, потому что средняя точка находится немного ниже центра оси y. .

width w будет где-то около 0,5, потому что ширина объекта составляет половину ширины ячейки, а высота h будет равна 1,5, потому что высота объекта будет в полтора раза больше высота ячейки. поэтому окончательный результат, соответствующий этой ячейке, будет [1, 0, 1, 0.9, 0.55, 0.5, 1.5, 0, *, *, *, *], и поле будет выглядеть примерно так

Точно так же мы можем кодировать вывод для каждой из ячеек.

Что такое якорь и почему в этой архитектуре два якорных ящика?

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

Рассмотрим ситуацию, когда середина двух объектов находится в одной ячейке.

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

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

Обратите внимание, что в нашей реальной модели мы делим изображение на сетку 7 на 7, и каждая сетка может представлять два объекта, поэтому теоретически мы можем представить 7 * 7 * 2 = 98 объектов на изображение.

Пересечение через союз (IOU)

Как измерить правильность предсказанного окна?

Давайте рассмотрим этот прогноз

Если вы получите подобное предсказание, то как вы сможете измерить его правильность? IOU - мера правильности предсказанного бокса. Как следует из названия, это отношение площади пересечения к площади объединения. Для идеального соответствия он равен 1 и 0, когда нет пересечения между фактическим и прогнозируемым прямоугольником. Мы выбираем порог хорошего прогноза, который обычно составляет 0,7, но его можно изменить в зависимости от требований.

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

что, если мы спрогнозируем несколько ящиков для одного объекта?

Если читатель до сих пор понимал все концепции, то он, должно быть, вообразил, что практические изображения в основном состоят из двух или трех объектов, но у нас есть способность представления 98 объектов на изображение. Вам не кажется, что вы получите много прогнозов для одного объекта? Ответ: конечно, будешь. А вот и Non Max Suppression, чтобы удалить нежелательные прогнозы.

Предположим, мы получили три прогноза и помним, что мы прогнозируем коробки с оценкой объектности, которая равна Pc. Non Max Suppression удаляет нежелательные предсказания за счет:

  • Сначала он выбирает коробку с наивысшим показателем объектности.
  • Затем рассчитайте долговую расписку между ячейкой с наивысшей оценкой объектности и другими ячейками.
  • Если долговая расписка превышает какое-то пороговое значение, например 0,5, другие поля удаляются.

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

Допустим, долговая расписка между ячейками с оценкой объективности = 0,9 и 0,6 равна долговой расписке = 0,51, что превышает пороговое значение 0,5, поэтому прямоугольник с оценкой 0,6 будет удален.

мы повторим то же самое с ящиком, имеющим показатель объективности 0,3

IOU составляет 0,6, что превышает порог 0,5, теперь он также будет удален. В конце концов, мы остались с наилучшим возможным предсказанием.

Расчет убытков

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

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

расчет потерь по координатам x и y

xi, yi - фактические, а xi_hat, yi_hat - прогнозируемые координаты x и y средней точки объекта. относительно i ячейки изображения. Потеря - это потеря ошибки в квадрате, которая связана с функцией идентичности. Функция идентичности может принимать только два значения 0 и 1, и она равна 1 только тогда, когда блок привязки j'th ячейки i'th представляет объект в обучающих данных, в противном случае это 0 . lambda_coord - гиперпараметр, который в нашем случае равен 0,5.

Чтобы интерпретировать приведенную выше функцию потерь, давайте просто рассмотрим фиктивный пример с S = 9 (сетка 3 на 3) и B = 2 (количество якорей на ячейку).

указанное выше значение функции потерь будет равно 0 для всех ячеек, кроме ячейки 3 и 4. Предположим, что наш первый блок привязки представляет вертикальный, а второй блок привязки представляет горизонтальный блок, тогда мы рассмотрим координаты x и y средней точки объекта для первой Якорная коробка предсказания, потому что форма левой собаки ориентирована вертикально.

Наконец, вышеуказанные потери будут рассчитаны по координате x и y для i = 3 (третья ячейка) с B = 0 (первая ячейка привязки) и i = 4 (четвертая ячейка) с B = 0 (первая ячейка привязки).

Расчет потерь по ширине и высоте

потери, рассчитанные по ширине и высоте, такие же, как и те, которые мы рассчитали для координат x и y, за исключением того, что здесь при расчете потерь ширины и высоты вместо фактического значения мы берем его значение квадратного корня.

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

Расчет убытков по шкале объективности (с предметом)

В нашем случае Ci в функции потерь равно Pc_i, поэтому не путайте его с обозначениями.

Потеря оценки объектности рассчитывается для тех якорей, которые соответствуют тем ячейкам, которые представляют объект. Эта потеря будет рассчитана только в том случае, если показатель объективности Ci = 1, а когда Ci = 0, функция идентичности также равна 0.

Расчет потерь по шкале объективности (без объекта)

Потеря, связанная с оценкой объектности для ячейки без объекта, очень важна для выбора наилучшего предсказанного блока для объекта. Здесь функция идентичности будет равна 1 для всех ячеек без объекта.

При выполнении Non Max Suppression мы исходили из того, что высокий показатель объектности означает более точную коробку. Вышеупомянутая функция потерь сбрасывает все прогнозируемые оценки объектности, которые не имеют никакого объекта, до 0, что еще больше снижает нагрузку на Non Max Suppression. lambda_noobj - гиперпараметр, который в нашем случае равен 5.

Расчет убытка по вероятностям класса

pi (c) в функции потерь равно ci в нашем представлении.

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

средняя средняя точность

mAP - идеальный показатель производительности модели для задач обнаружения объектов. В этом разделе мы разберемся с MAP на небольших примерах.

Рассмотрим тестовый набор с тремя изображениями image1 image2 и image3.

здесь мы рассчитаем среднюю точность для класса «СОБАКА». Сначала мы рассчитаем общее количество собак с учетом всех тестовых изображений, которых в нашем примере четыре, две для изображения 1 и 1, 1 для изображения 2 и изображения 3. Зеленые прямоугольники - это настоящие прямоугольники, а красные прямоугольники (с оценкой объектности) - это прогнозируемые прямоугольники для класса «СОБАКА». На изображениях выше мы видим, что некоторые прогнозы хороши, но некоторые очень плохи. Как мы будем рассчитывать производительность модели для такого прогноза?

Чтобы рассчитать MAP, мы должны иметь представление о точности и полноте. Я предполагаю, что читатель уже знает точность и отзывчивость.

Сначала мы рассчитаем истинно положительный (TP) и ложный положительный (FP) для всех прогнозов на тестовых изображениях.

Прогнозируемый блок назначается как TP, если IOU между прогнозируемым блоком и фактическим блоком ›0,5, в противном случае - FP.

Теперь отсортируем таблицу по шкале достоверности (оценка объектности).

Теперь мы будем постепенно вычислять точность и вспоминать.

Простыми словами

точность = (количество правильных прогнозов / общее количество прогнозов) этого класса

отзыв = (количество правильных прогнозов / общее количество фактических меток) этого класса

Теперь мы построим кривую между точностью и вспомним, что мы только что вычислили, а площадь под кривой PR является средней точностью для класса DOG.

Конечная производительность модели MAP - это среднее значение AP для всех классов.

Выполнение:

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

  • Набор данных PascalVOC (количество классов = 20) взят для обучения модели.
  • Архитектура модели такая же, как и у модели, описанной в статье.

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

Мне потребовалось около 20 часов, чтобы обучить модель для 200 эпох всего на 100 примерах. В основном я хотел переобучить модель на небольшой выборке набора данных, просто чтобы увидеть прогноз. Я обучил модель с нуля, но я рекомендую читателю тренироваться на предварительно обученной модели, такой как vgg16, начальная сеть и т. Д., Чтобы сократить время обучения.

Вот журналы тренировок за последние 10 эпох:

Достигнута финальная тренировка потеря = 8,568 и mAP = 0,992.

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

использованная литература

Контакт

Почта: [email protected]

Github: https://github.com/Nitesh0406/YOLOv1.git

Linkedin: www.linkedin.com/in/nitesh-kumar-550819169