В этом посте объясняется работа детектора Single-Shot MultiBox, а также пошаговое руководство по коду.

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

В этой области было проведено множество исследований, и наиболее часто встречающийся алгоритм обнаружения объектов - это You Only Look Once (YOLO), который был первой попыткой получить детектор реального времени, и с тех пор, как он был представлен, он претерпел несколько обновлений. Основная проблема с первой версией YOLO заключалась в том, что ее точность была очень низкой по сравнению с современными детекторами того времени, все из которых работали в два этапа: на первом этапе генерировался список предложений или предположений для где объекты могут находиться в пределах изображения, и на втором этапе классифицируется каждый из предложенных блоков. Подробнее о том, как работают двухступенчатые детекторы, читайте в блоге this. YOLO относится к категории одноэтапных детекторов, которые удаляют этап генерации предложения и предсказывают оценки класса вместе с координатами ограничивающего прямоугольника непосредственно из изображения в сквозной структуре. Детектор Single-Shot Multibox (SSD) был первым одноступенчатым детектором, который достиг точности, достаточно близкой к двухступенчатым детекторам, при этом сохраняя способность работать в реальном времени. Было приложено много усилий для того, чтобы одноступенчатые детекторы превзошли точность двухступенчатых детекторов, решив несколько проблем с SSD и добавив дополнительный этап доработки в одноступенчатый конвейер, но большинство из них используют SSD в качестве стартового. точка. В его посте я подробно объясню каждый компонент SSD. На протяжении всего сообщения я буду ссылаться на эту отличную реализацию SSD в PyTorch, чтобы сопоставить концепции с соответствующими примерами кода.

1. Что такое ящики по умолчанию

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

Блоки по умолчанию представляют собой тщательно выбранные ограничивающие рамки в зависимости от их размеров, соотношений сторон и положения на изображении. SSD содержит 8732 ящика по умолчанию. Цель модели - решить, какие из полей по умолчанию использовать для данного изображения, а затем спрогнозировать смещения от выбранных полей по умолчанию, чтобы получить окончательный прогноз. Если это прозвучало как много жаргона, оставайтесь со мной. Следующий пример и последующие разделы должны прояснить это дальше. Но вам нужно постоянно возвращаться к этому моменту и быть уверенным, что вы все четко понимаете. На изображении ниже представлены объекты двух разных масштабов и соотношений сторон. Мы знаем, что по мере того, как мы продолжаем добавлять сверточные слои, разрешение карты функций продолжает уменьшаться, и, следовательно, принимающее поле каждой ячейки карты функций продолжает увеличиваться. Таким образом, более ранние слои, имеющие меньшее воспринимающее поле, лучше подходят для обнаружения более мелких объектов, тогда как более поздние слои, имеющие большее воспринимающее поле, могут лучше обнаруживать более крупные объекты.

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

i) Определите, какие из его 8732 ящиков по умолчанию являются положительными;

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

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

Архитектура SSD состоит из 3 основных компонентов:

i) Базовая сеть

ii) Дополнительные векторные слои

iii) Слои прогнозирования

Базовая сеть - это, по сути, начальные уровни любой стандартной сети классификации изображений, предварительно обученной на наборе данных ImageNet. Авторы используют VGG-16. Полностью связанные слои в конце реализуются как сверточные слои. Конечным результатом базовой сети является карта характеристик размером 19 x 19 x 1024.

Поверх базовой сети добавляются 4 дополнительных сверточных слоя, так что размер карт объектов продолжает уменьшаться до тех пор, пока не будет получена окончательная карта объектов размером 1 x 1 x 256.

Уровни прогнозирования являются важным компонентом SSD. Вместо использования одной карты функций для прогнозирования оценок классификации и координат ограничивающего прямоугольника используются несколько карт функций, представляющих несколько шкал. Здесь используется идея блоков по умолчанию и разрешений карты объектов, обсуждавшаяся выше. В частности, слои conv4_3, conv7, conv8_2, conv9_2, conv10_2 и conv11_2 (показанные на рисунке) используются для прогнозов ограничивающей рамки.

Как показано на изображении ранее, есть блоки по умолчанию, связанные с каждой ячейкой карты функций, и количество таких блоков - 4 или 6 - определяется заранее. Учитывая, что количество классов (включая фоновый класс как класс 0) должно быть C, каждый прогноз представлен (C + 4) numbers: C классификационными баллами и 4 смещениями: cx, ∆cy, w and h, , представляющий смещения от центра поля по умолчанию и его размеров. Таким образом, для карты признаков с k блоками по умолчанию на ячейку, слой прогнозирования представляет собой 3 x 3 сверточный слой с k * (C + 4) каналами.

3. Передний пас

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

Таким образом, объекты из этого конкретного слоя нормализуются и устанавливаются на начальное значение масштаба 20. Фактический масштаб затем изучается во время обратного распространения с помощью параметра weight. Код для слоя L2Norm показан ниже:

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

4. Выбор полей по умолчанию

Поскольку SSD в значительной степени полагается на блоки по умолчанию, он очень чувствителен к выбору блоков по умолчанию, в частности, к их масштабу и соотношению сторон. В документе авторы проектируют блоки по умолчанию таким образом, чтобы каждая карта характеристик соответствовала определенному масштабу блоков по умолчанию вместе со списком соотношений сторон для каждого масштаба. Минимальная и максимальная шкала s_min и s_max установлены на 0,2 и 0,9. Для k -й карты объектов (среди карт объектов m) масштаб выбран следующим образом:

Для карты объектов, соответствующей определенному масштабу и имеющей 6 связанных с ней полей по умолчанию, высота и ширина полей по умолчанию получаются, как показано ниже:

Для каждой карты объектов добавляется дополнительное поле по умолчанию с масштабом s* и соотношением сторон 1. На картах объектов, имеющих только 4 поля по умолчанию, не используются соотношения сторон 3 и 1/3. Центр каждого блока по умолчанию устанавливается как центр ячейки, которой он принадлежит. Поля по умолчанию определены в коде, как показано ниже:

5. Обучение

Используемая функция потерь - это потеря MultiBox, которая состоит из двух членов: потеря достоверности и потеря локализации. Сеть выводит (C + 4) прогноз для каждого из 8732 блоков: оценки класса C и 4 смещения локализации.

Сопоставление якоря: для обучения сети все поля по умолчанию сопоставляются с наземными полями истинности. Во-первых, каждый наземный блок истинности сопоставляется с блоком по умолчанию, имеющим максимальное перекрытие жаккартов. Это делается для того, чтобы убедиться, что в каждом наземном блоке истинности есть хотя бы один соответствующий блок по умолчанию. Затем каждый блок по умолчанию сопоставляется с любым блоком наземной истины, имеющим перекрытие жаккартов ›0,5. По сути, это превращает проблему в проблему с несколькими метками для каждого блока. Приведенная ниже реализация соответствует каждому блоку по умолчанию только для наилучшего соответствия основополагающей истине, но ее можно легко изменить, чтобы включить критерии с несколькими метками.

Функция потерь: поля по умолчанию, которые не были сопоставлены ни с одним основным прямоугольником истинности, считаются отрицательными и вносят вклад только в потерю уверенности, тогда как все поля с положительным совпадением добавляют к потере достоверности, а также потеря локализации. Потеря достоверности - это, по сути, потеря кросс-энтропии, в то время как потеря локализации - это потеря Smooth L1 между фактическими смещениями блоков по умолчанию к наземным блокам истинности и прогнозируемыми смещениями.

Окончательная потеря определяется как комбинация потерь, где α - относительный вес потери локализации относительно потери достоверности (установлен на 1 при перекрестной проверке), а N - количество положительно согласованных блоков.

Жесткий отрицательный майнинг: большинство полей из 8732 полей по умолчанию являются отрицательными. Непосредственное использование всех отрицательных блоков приведет к серьезному дисбалансу классов во время обучения, и, следовательно, после того, как сопоставление будет выполнено, будут сохранены только те отрицательные блоки, которые имеют самые высокие потери достоверности, так что соотношение между положительными и отрицательными блоками будет не менее 1: 3.

Увеличение данных: отказ от увеличения данных приводит к значительному падению производительности. Используемые важные стратегии увеличения данных:

6. Заключение

Во время вывода у нас теперь есть 8732 поля для каждого класса (потому что мы выводим оценки достоверности C для каждого поля). Большинство этих прямоугольников отрицательные, а среди положительных будет много перекрывающихся прямоугольников, как показано ниже:

При получении изображения в качестве входных данных сначала создаются поля по умолчанию для всех классов вместе (вверху справа). Затем для каждого класса применяется доверительный порог 0,01 для получения положительных квадратов (внизу справа). Наконец, применяется не максимальное подавление (NMS), чтобы избавиться от перекрывающихся блоков для каждого класса и получить не более 200 блоков, используя индекс Жаккара в качестве меры перекрытия и пороговое значение перекрытия 0,45. Необходимость NMS и то, как это делается, можно понять из этого видео. NMS, по сути, делает следующее (для каждого класса): сортирует блоки на основе оценок достоверности, выбирает ячейку с наибольшей оценкой достоверности, удаляет все другие предсказанные ячейки с перекрытием Жаккар ›порог NMS (здесь 0,45), повторяет процесс до тех пор, пока все коробки закрыты.

7. Обсуждение

Некоторые общие моменты, которые следует учитывать при использовании SSD:

  • Увеличение данных очень важно для повышения производительности, особенно для небольших объектов.
  • Сеть очень чувствительна к ящикам по умолчанию, и важно выбирать ящики по умолчанию в зависимости от набора данных, в котором они используются. Хорошая стратегия - использовать кластеризацию K-средних для определения правильных размеров бокса по умолчанию.
  • Использование более сильных сетей классификации изображений в качестве базовой сети, таких как Resnet, Inception, Xception, может улучшить производительность.
  • SSD плохо работает с мелкими предметами. Одна из возможных причин этого, обсуждаемая в этой статье, заключается в том, что более ранние слои, которые имеют меньшее воспринимающее поле и отвечают за обнаружение мелких объектов, слишком мелкие. Существует также структурное противоречие, когда более ранние уровни должны изучать низкоуровневые функции для передачи на более высокие уровни, а также изучать абстракцию высокого уровня для правильной идентификации блоков. Этот документ добавляет больше контекста к прогнозам и показывает значительно более высокую производительность на небольших объектах. Использование изображений с более высоким разрешением также может улучшить производительность для небольших объектов.
  • 80% времени прямого прохождения тратится в базовой сети. Значительное сокращение времени вывода можно получить, используя MobileNet вместо VGG.
  • Использование многомасштабных карт функций для прогнозирования обязательно для производительности SSD. Добавление дополнительных ящиков по умолчанию может повысить точность за счет более низкой скорости.

8. Ресурсы

  • Оригинальный SSD бумага
  • PyTorch кодовая база используется в сообщении
  • Оригинальный Caffe код
  • Другие сообщения в блоге, объясняющие SSD: 1, 2, 3

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

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

Если вы хотите получать уведомления о моих будущих публикациях, подписывайтесь на меня на Medium. Если есть что-то, чем вы, возможно, захотите поделиться со мной или высказать какие-либо отзывы о моих письмах / мыслях, я тоже хотел бы это услышать. Не стесняйтесь связываться со мной в LinkedIn, или подписывайтесь на меня на Github.