Понимание и подробный анализ глубокого обучения SSD

глубокое обучение

Предыдущая статья в Цзяньшу была перемещена ^-^
Сначала увеличьте тезис Бога и исходный код городского строительства:

SSD Github: https://github.com/weiliu89/caffe 请选择分支 SSD
SSD paper: АР Вест V.org/ABS/1512.02…

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

##Многомасштабный Давайте сначала поговорим о мультимасштабных функциях. В предыдущем Faster-RCNN векторы признаков были получены из Карт признаков последнего слоя.Для этого единственного слоя признаков рецептивное поле было очень ограниченным, и сети признаков предыдущих уровней не использовались полностью. В SSD, начиная с CONV4_3, автор использует комбинацию многоуровневых карт признаков в качестве основы для классификации и регрессии и достигает многомасштабного эффекта, упомянутого в статье. Заимствуя для иллюстрации картинку из статьи, автор сравнивает YOLO и SSD:

1.jpg

Видно, что признаки SSD извлекаются из разных сверточных слоев (красные линии на рисунке выше), объединяются, а затем регрессируются и классифицируются, в то время как YOLO имеет только один слой, и более поздние версии YOLO также опираются на этот многоуровневый слой. шкала SSD.идеи по улучшению карты.Другими словами, SSD — это процесс классификации и обнаружения, выполняемый один раз в Faster-RCNN и YOLO, и он выполняется несколько раз для изображений разных размеров.
##Prior_box Зная, что характеристики SSD извлекаются из разных масштабов, откуда взялись 8732 КОРОБКИ, упомянутые в документе? Используйте таблицу ниже, чтобы сказать вам.

name Out_size Prior_box_num Total_num
conv4-3 38x38 4 5776
fc7 19x19 6 2166
conv5-2 10x10 6 600
conv7-2 5x5 6 150
conv8-2 3x3 6 36
conv9-2 1x1 4 4
8732

Как и Faster-RCNN, SSD также представляет собой набор предварительно выбранных полей для каждой точки на карте объектов. Затем количество предшествующих блоков, соответствующих каждой точке в каждом слое, определяется файлом конфигурации слоя PriorBox. Взяв в качестве примера прежний блок, соответствующий conv4-3, файл конфигурации модели caffe выглядит следующим образом:

Так как же SSD генерирует соответствующие четыре априорных блока? Процесс генерации кадров можно условно разделить на следующие три этапа:

  1. сначала сmin_sizeСоздайте поле для ширины и высоты.

  2. если он существуетmax_sizeЗатем используйте sqrt(min_size_ * max_size_) для создания окна.

  3. затем согласноaspect_ratio, а затем сгенерируйте его. Например, в приведенном выше файле конфигурации aspect_ratio=2, затем будет автоматически добавлено другое aspect_ratio=1/2, а затем в соответствии со следующим методом расчета:

    Создайте две коробки, одну для ar = 2 и одну для ar = 1/2.

Интуитивно понятно, что min_size и max_size создадут квадратное поле соответственно, а параметр aspect_ratio создаст 2 прямоугольных поля. Итак, количество выходных ящиков:
Prior_box_num = количество (минимальный_размер) * 1 + количество (максимальный_размер) * 1 + количество (соотношение сторон) * 2.

PS: min_sizeЭто обязательный параметр, иначе он не войдет в процесс генерации соответствующего ящика. Есть некоторые несоответствия между тезисом и фактическим кодом.Есть также люди, обсуждающие это на Git, и они в основном предпочитают игнорировать статью. . .

Здесь есть еще один ключевой параметр, которыйstep, установлен на 8 в conv4-3, как это происходит? Давайте посмотрим на таблицу:

name Out_size Cal_scale Real_scale
conv4-3 38x38 7.8 8
fc7 19x19 15.78 16
conv5-2 10x10 30 32
conv7-2 5x5 60 64
conv8-2 3x3 100 100
conv9-2 1x1 300 300

Cal_scale = 300/out_sizeНа самом деле это отношение размера исходного изображения к карте объектов, например, ширина conv4-3 = 38, а размер ввода равен 300, тогда масштаб = 7,8, поэтому здесь установлен шаг = 8. Код реализован следующим образом:

Процесс вычисления этой части можно увидеть в Forward_cpu из Prior_box_layer.cpp.

## Характеристическое представление Если вы посмотрите на сетевую структуру SSD, вы обнаружите, что за каждым convXXXX_mbox_loc или convXXXX_mbox_conf будет следовать слой перестановки + сглаживания, как показано ниже:

Что это делает? Студенты, которые используют CAFFE, знают, что структура данных CAFFE имеет форму NCHW (N: количество выборок, C: количество каналов, H: высота, W: ширина) и выходные данные слоев XX_conf и XX_loc SSD. в виде каналов.Вектор признаков сохраняется, поэтому количество каналов здесь нужно подгонять до конца, что и делает перестановка.После прохождения через этот слой порядок данных меняется на NHWC, и затем вытягивается в колонку сплющиванием.

Здесь я еще хочу рассказать о правилах выходных каналов слоев XX_LOC и XX_CONF.Слой XX_LOC используется для возврата в кадр, поэтому нужно 4 информации о координатах, а XX_CONF используется для классификации, поэтому ему нужно class_num штук информации. Для каждой точки будет несколько prior_box, мы делаемK = count(prior_box), то количество каналов соответствующего выхода XX_LOC должно быть4*K, а количество выходных каналов XX_CONF должно бытьclass_num*K, в качестве проверки посмотрим на настройки параметров модели для VOC,

Или посмотрите на conv4_3, этот слой соответствует 4 Prior_boxes, а количество классификаций VOC равно21 (20 категорий + 1 фон), поэтому соответствующий вывод conv4_3_norm_mbox_loc = 16 = 4*4, а num_output = 84 = 21*4.Поэтому, если вы ориентируетесь на свой собственный обучающий набор, вы должны не забыть изменить количество выходных каналов XX_CONF.

На самом деле несложно понять, что выходная информация последних слоев SSD хранится в измерении Channel, и модуль LOC+CONF+PRIOR можно считать эквивалентным последнему процессу регрессии + классификации Faster- rcnn. Путем объединения признаков этих подмодулей получается набор векторов признаков для достижения цели извлечения многомасштабных признаков (несколько F-RCNN работают в разных масштабах одного и того же изображения одновременно).

#####Посмотрите, почему точка признака соответствует нескольким Prior_Box. Определенная область патча в исходном изображении будет абстрагирована в точку на карте объектов после нескольких слоев извлечения.Для нескольких Prior_Box они соответствуют одному и тому же набору информации.В чем смысл? Посмотрите на картинку ниже:

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

##Наконец, я хочу отметить улучшение данных SSD Есть много улучшений данных для SSD, случайная обрезка, масштабирование, регулировка яркости, насыщенности и так далее. Параметры в основном известны по именам, поэтому эффективнее следить за кодом, чтобы увидеть его самостоятельно. Если вам нужно улучшить данные самостоятельно, вы также можете научиться их использовать. GIT рекомендуется здесь: https://github.com/eric612/MobileNet-SSD-windows

SSD-версия этого GIT может работать в WINDOWS, так что вы можете использовать самую мощную IDE во вселенной — VS, чтобы шаг за шагом следить за изменениями изображения.