SSD (однокадровый детектор MultiBox) Примечания

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

предисловие

Эта статья используется для записи процесса обучения обнаружению целей SSD и обобщения некоторых основных моментов знаний.

Почему вы хотите изучать SSD, потому что SSD — это то же самое, что и YOLO, обаone-stageКлассический фреймворк , мы должны очень глубоко его понимать, чтобы разработать лучший фреймворк. Полное название сети обнаружения целей SSD:Single Shot MultiBox Detector, сфокусироваться наMultBoxВыше эта идея хорошо использует преимущества многомасштабности и всесторонне повышает точность обнаружения.Позже YOLOv2 заимствовал идею SSD и развивался медленно.

Настоятельно рекомендуется прочитать официальнуюбумагаИметь хорошее представление о принципах и дизайнерских идеях SSD. Соответствующий pdf-файл также доступен здесь:У-у-у. В это время UNC. quota/~логистика/бумага…

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

сетевая архитектура

Первоначальная рекомендация по сетевой архитектуре SSD все еще основана на документе, ведь мы обычно вступаем в контакт с различнымиВолшебная ревизия(То есть так называемая замена костяка, типа самого обычного SSD-mobilenetv2) хоть и похожа на оригинал, но для понимания усложнит наше понимание, поэтому совершенно необходимо прочтите описание оригинальной статьи.

SSD принимает сеть VGG в качестве базовой структуры в документе, но удаляет последние несколько слоев в VGG (то есть слой классификации, о котором мы часто говорим), а затем добавляет некоторый новый контент (называемый вспомогательной структурой в исходном тексте), эти Слои:

  • Дополнительные векторные слои (Extra Feature Layers), роль которых заключается вbackboneКомбинация вышеперечисленных слоев совместно извлекает информацию о признаках разного размера, что эквивалентно усилению предыдущей магистрали, делая сеть глубже, а способность извлечения более мощной.
  • Заголовки классификации (заголовки классификации) выполняют свертку векторных слоев (разных масштабов), выводимых сетевыми слоями в разных позициях в предыдущей сети, чтобы получить классификационную информацию, соответствующую каждой координате на каждой карте признаков (каждая координата соответствует множеству значений по умолчанию). коробки).
  • Слой регрессии положения координат (слушатели регрессии), структура аналогична слою классификации, но выходные каналы немного отличаются. Путем свертки карт объектов разного масштаба на выходе получаются соответствующие координаты каждой карты объектов.default boxesКоординаты смещения (называемые в статье смещением формы).

TIM截图20190502103338

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

Многомасштабные карты объектов для обнаружения

Конкретное представление многомасштабной карты объектов заключается в том, что SSD берет соответствующие слои признаков для прогнозирования в разных положениях всей сети.Каждый слой признаков может определять поле зрения и размер целевого объекта из-за разных напольные весы. Каждая карта объектов может предсказывать информацию о классификации и информацию о местоположении.Как вы можете видеть на следующем рисунке, вся сеть использует 6 различных карт объектов от начала до конца.38x38x512прибыть1x1x256Всего имеется шесть карт объектов разного масштаба.

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

20170611145131140

Такdefault boxКак это произошло?

default box

Оригинальные слова в статье следующие:

We associate a set of default bounding boxes with each feature map cell, for multiple feature maps at the top of the network. The default boxes tile the feature map in a convolutional manner, so that the position of each box relative to its corresponding cell is fixed. At each feature map cell, we predict the offsets relative to the default box shapes in the cell, as well as the per-class scores that indicate the presence of a class instance in each of those boxes.

Для каждого из вышеперечисленных есть характеристическая диаграмма в разных масштабах (38x38,19x19,10x10,5x5,3x3,1x1), координаты каждого признака на рисунке (ячейке) для формирования множества стандартных рамок. Для каждогоdefault box, SSD прогнозирует смещение от реального кадра калибровки (смещения, всего 4 значения, представляющие информацию о местоположении) и доверительную вероятность (c1,c2,...,cpc_1 ,c_2, ..., c_p). Если всего имеется c классов, и каждая координата генерирует k блоков, то при обучении каждая ячейка будет генерировать (c+4)k данных, если размер карты признаков mxn, то общее количество равно (c+ 4) kmn , например карта объектов 3x3, mxn — это 3x3.

Обратите внимание, что приведенное выше смещение относится не только кdefault box, с другой точки зрения, это также смещение относительно реальной калибровочной рамки, т.е.default boxПлюс смещения - это положение реальной калибровочной рамки. Это смещение — это то, что мы можем рассчитать в процессе обучения и обучения и использовать его для оптимизации функции потерь.

В фактическом прогнозе нам нужно предсказать категорию каждого поля по умолчанию и соответствующее смещение.

TIM截图20190429161151

Я видел лучшее введение в этой части, поэтому я не буду здесь вдаваться в подробности, вы можете посмотреть прямо здесь:Интерпретация поля по умолчанию (Prior Box) в SSD.

тренировочный процесс

Чтобы не только понять детали сети из бумаги, вам также необходимо больше узнать о конкретном процессе обучения:

Потому что мы хотим сгенерировать на карте объектовdefault box, то на этапе обучения нам нужно сопоставить GT (Ground Truth) с блоком по умолчанию для обучения. Каков соответствующий метод? Пороговое значение IOU используется в SSD для контроля количества блоков по умолчанию, которые фактически участвуют в обучении. расчет.Этот шаг происходит при подготовке данных:

TIM截图20190506164015

Во-первых, убедитесь, что каждый GT соответствует блоку по умолчанию с ближайшим к нему метрическим расстоянием (то есть максимальным значением iou)., это очень важно для обеспечения правильности нашего обучения. Кроме того, поскольку у нас много ящиков по умолчанию, следует сохранить не только ящик по умолчанию с наибольшим IOU, но и тот, который соответствует определенному пороговому размеру.

Другими словами, во время процесса обучения необходимо определить, какойdefault boxesСоответствует реальному калибровочному кадру на каждой конкретной картинке, но на практике мы сгенерировали множество в каждой ячейке каждой карты признаковdefault boxes, SSD должен сохранить все блоки по умолчанию, чьи IOU (то есть перекрытие жаккарда) с реальным калибровочным кадром больше определенного порога (установленного в документе на 0,5), а не только сохранить максимальное значение IOU.default box(Зачем это делать, в оригинальной статье говорилось, что это способствует обучению нейронных сетей, то есть сложность обучения будет снижена).

Таким образом, мы тщательно выбираем поля по умолчанию для обучения в ранее сгенерированных полях по умолчанию.default boxes(Для удобства количество ящиков по умолчанию в реальном обучении не меняется, но мы прямо задаем те, у которых iou ниже определенного порогаdefault boxesМетка напрямую установлена ​​​​на 0, что является фоном).

функция потерь

Функция потерь также очень проста, всего их две: потеря позиции и потеря классификации:

L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))L(x, c, l, g)=\frac{1}{N}\left(L_{c o n f}(x, c)+\alpha L_{l o c}(x, l, g)\right)

вNNзаmatched default boxesколичество, этоNNОн был тщательно отобран в начале тренировочного процесса.default boxes. когдаNNКогда он равен 0, общее значение потерь также равно 0. иα\alpha- весовой коэффициент, окончательно полученный путем перекрестной проверки, и значение в статье равно 1.

потеря позиции

вxijp={1,0}x_{i j}^{p}=\{1,0\}Указывает текущийdefalut boxСоответствует ли она реальной калибровочной рамке (стр.iiКусокdefalut boxс первымjjполя калибровки наземной истины, где классpp), после предыдущих шагов совпадения естьixijp\sum_{i}x^{p}_{ij}больше или равно 1.

Lloc(x,l,g)=iеP os mе{cx,cy,w,h}N(cx,cy,w,h}xijksmoothL1(limg^jm)L_{l o c}(x, l, g)=\sum_{i \in P \text { os } m \in\{c x, c y, w, h\}}^{N} \sum_{(c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{\mathrm{L1}}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right)

Обратите внимание, что в приведенной выше формулеg^jm\hat{g}_{j}^{m}после измененияGroundTruth, процесс изменения иdefault boxсвязаны, что мы используем во время нашего обученияGroundTruthзначение сначала проходит черезdefault boxДелаем конвертацию, преобразованное значение соответственноg^jcx,g^jcy,g^jw,g^jh\hat{g}_{j}^{c x},\hat{g}_{j}^{c y},\hat{g}_{j}^{w}, \hat{g}_{j}^{h}, эти четыре значения и есть реальная калибровочная рамкасоответствоватьdefault boxкоординаты центра г.x,yx,yи ширинаwwи высотаhhкомпенсировать.

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

g^jcx=(gjcxdicx)/diwg^jcy=(gjcydicy)/dih\hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} \quad \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h}
g^jw=log(gjwdiw)g^jh=log(gjhdih)\hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) \quad \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right)

Точно так же, поскольку то, что мы узнали во время обучения,default box -> GroundTruth BoxСмещение, то у нас, естественно, должна быть противоположная формула для обратного расчета, когда мы спекулируем, просто поменяйте местами приведенные выше четыре формулы.

потеря классификации

Потеря классификации использует кросс-энтропийную потерю,

Lconf(x,c)=iеPosNxijplog(c^ip)iеNeglog(c^i0) where c^ip=exp(cip)pexp(cip)L_{c o n f}(x, c)=-\sum_{i \in P o s}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)}

Следует отметить, чтоxijpx_{i j}^{p}Представляет, соответствует ли прогнозируемое поле в данный момент реальному калибровочному полю, и совпадение равно 1, что означает, что первая половина потери классификации учитывает только те, которые соответствуют метке, то есть положительные поля. И вторая половинаc^i0\hat{c}_{i}^{0}Он представляет собой потерю фоновой классификации, то есть потерю отрицательных полей, и хочет сделатьc^i0\hat{c}_{i}^{0}Чем больше (фон правильно делится на фон), тем меньше должен быть проигрыш для второй половины.

Hard negative mining

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

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

Мы находимся в оставшихся ящиках, потому что оставшиеся ящики не могут содержать цель (поскольку цель выбрана в сопоставлении, это оставшиеся), поэтому метка этих ящиков должна быть предсказана какbackgroundТо есть фон, поэтому значение потерь этих прямоугольников относительно фона должно быть относительно небольшим, то есть модель более правильно предсказывает фон. Затем мы должны выбрать блоки, которые наиболее трудно идентифицировать, то есть блоки, которые наиболее трудно идентифицировать как фоновые блоки.Они называются отрицательными блоками.Сначала мы сортируем остальные эти блоки по отношению к потере фона, а затем выберите определенное число впереди (отношение к положительным полям составляет 3: 1) поля можно использовать как отрицательные поля.

Это описание может быть немного абстрактным, и оно может выглядеть лучше с кодом:

def hard_negative_mining(loss, labels, neg_pos_ratio):
    """
    It used to suppress the presence of a large number of negative prediction.
    It works on image level not batch level.
    For any example/image, it keeps all the positive predictions and
     cut the number of negative predictions to make sure the ratio
     between the negative examples and positive examples is no more
     the given ratio for an image.

    Args:
        loss (N, num_priors): the loss for each example.
        labels (N, num_priors): the labels.
        neg_pos_ratio:  the ratio between the negative examples and positive examples.
    """
    pos_mask = labels > 0                                    
    num_pos = pos_mask.long().sum(dim=1, keepdim=True)
    num_neg = num_pos * neg_pos_ratio

    loss[pos_mask] = -math.inf                               # put all positive loss to -max
    _, indexes = loss.sort(dim=1, descending=True)           # sort loss in reverse order (bigger loss ahead)
    _, orders = indexes.sort(dim=1)
    neg_mask = orders < num_neg
    return pos_mask | neg_mask

улучшение изображения

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

Изображение после рандомной выборки должно содержать исходные боксы GT (не обязательно все), а боксы после кадрирования тоже правильные.

Эта часть более абстрактная, можете посмотреть в этой статье, мне лень демонстрировать:

Настройки скорости обучения

  • Официально: оптимизатор использует SGD, а начальная скорость обучения составляет0.001,momentumза0.9,weight-decayза0.0005,batch-sizeза32.
  • Я лично использую тот же оптимизатор, что и официальный, но пропускаю скорость обученияmulti-stepметод (подробности см. в разделе реализации, связанном с Pytorch), снизить скорость обучения до предыдущих этапов 80 и 150 эпох1/10. Всего было обучено 300 эпох.

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

Предварительно подготовленные веса

персональное использованиеmobilenetv2-SSDАрхитектура обучила свои данные, при условии, что все гиперпараметры и коэффициенты обучения остаются неизменными, если используются предварительно обученные веса mobilenetv2 (на ImageNet), скорость обучения и итоговая точность обучения будут выше на один Cut (под той же эпохи), поэтому важно использовать предварительно обученную информацию о весе.

Суммировать

SSD — это элегантная структура обнаружения целей. Она по-прежнему остается одной из самых популярных сред обнаружения целей. Ее стоит изучить. Однако эффект обнаружения SSD небольших целей невелик, а скорость отзыва не очень высока. Семантика семантическая информация связана, и некоторые причины для улучшения mAP также упоминаются в SSD, большинство из которых связано с частью улучшения изображения.Упомянутое выше случайное исправление может быть замаскировано как «увеличение» или «уменьшение масштаба» на изображение.», то есть метод или сужение, что повышает возможности сети по наблюдению за большими и малыми целями (но возможности по наблюдению за мелкими целями все же несколько хуже).

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

Ссылка на ссылку

Ронг опубликовал .GitHub.IO/articles/78… блог woo woo woo.cn на.com/is Contemporary/afraid/102…

дразни меня

  • Если вы единомышленники со мной, Лао Пан очень хочет общаться с вами;
  • Если вам нравится контент Лао Пана, подпишитесь и поддержите его.
  • Если вам понравилась моя статья, надеюсь, она вам понравится? Избранное ? Комментарии ? Три в ряд~

Я хочу знать, как Лао Пан научился наступать на яму, и я хочу обменяться со мной вопросами ~ Пожалуйста, обратите внимание на публичный аккаунт "старый блог". Лао Пан также организует некоторые из своих частных коллекций, надеясь помочь всем, нажмитеТаинственный порталПолучать.