Подробное объяснение Faster R-CNN - на основе блога bestrivern и собственного понимания.

искусственный интеллект
Подробное объяснение Faster R-CNN - на основе блога bestrivern и собственного понимания.

Подробный Быстрее R-CNN

предисловие

Эта статья в основном основана на блоге bestrivern, чтобы понять сеть Faster R-CNN, углубить понимание сети и систематизировать полученные идеи.

I. Обзор

Поставьте один первыйfaster r-cnnструктурная схема.

output_5.png

После накопления R-CNN и Fast R-CNN Росс Б. Гиршик предложил новую Faster RCNN в 2016 году. Что касается структуры, Faster RCN имеет特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classificationВсе они интегрированы в сеть, что значительно повышает общую производительность, особенно с точки зрения скорости обнаружения.

                            output_6.png

Faster R-CNN фактически можно разделить на 4 основных содержания:

  • Conv layers(Извлечение признаков). В качестве метода обнаружения целей в сети CNN Faster RCNN сначала использует набор базовых слоев conv+relu+pooling для извлечения карт признаков изображения. Карты объектов являются общими для последующих слоев RPN и полносвязных слоев.
  • Region Proposal Networks(Извлечение ящиков-кандидатов). Сеть RPN используется для создания предложений по регионам. Этот слой определяет, относятся ли привязки к положительным или отрицательным с помощью softmax, а затем использует регрессию ограничительной рамки для исправления привязок для получения точных предложений.
  • Roi Pooling(Определите, какие блоки-кандидаты действительны). Этот слой собирает входные карты объектов и предложения, а после синтеза информации извлекает карты объектов предложений и отправляет их на последующий полносвязный слой для определения целевой категории.
  • Classification(Выполняйте классификацию объектов и исправляйте поля-кандидаты одновременно). Используйте карты объектов предложения, чтобы вычислить категорию предложения, и в то же время снова регрессию ограничивающей рамки, чтобы получить окончательное точное положение кадра обнаружения.

Общий процесс:

На следующем рисунке показана структура сети fast_rcnn_test.pt в модели VGG16 в версии python, хорошо видно, что сеть подходит для пары любого размера.PxQизображение, сначала масштабированное до фиксированного размераMxN,ПотомMxNИзображение отправляется в сеть; слои Conv включают 13 слоев conv + 13 слоев relu + 4 слоя пула; сеть RPN сначала подвергается свертке 3x3, а затем генерирует положительные привязки и соответствующее смещение регрессии ограничивающей рамки, а затем вычисляет Roi Уровень пула использует предложения для извлечения функций предложения из карт объектов и отправки их в последующее полное соединение и сеть softmax для классификации (то есть, что является объектом предложения по классификации).

                 output_7.png

2. Подробное объяснение

1.Conv layers

Слои Conv включают слои Conv, Pooling и Relu. Взяв в качестве примера сетевую структуру fast_rcnn_test.pt в модели VGG16 в версии Python, как показано на рисунке выше, часть слоев Conv имеет в общей сложности 13 слоев conv, 13 слоев relu и 4 слоя пула. Вот очень легко упустить из виду, но чрезвычайно важная информация в слоях Conv:

  • Все слои conv: kernel_size=3, pad=1, stride=1.
  • Все слои пула: kernel_size=2, pad=1, stride=1.

Почему это важно? В слоях Faster RCNN Conv все свертки расширяются (pad = 1, то есть заполняются кругом 0), в результате чего исходное изображение становится размером (M + 2) x (N + 2), а затем выход 3x3 MxN после свертки. Именно этот параметр приводит к тому, что слои conv в слоях Conv не изменяют размеры входной и выходной матриц.. Как показано ниже:

               output_8.png

Точно так же в слоях Convслой пула kernel_size=2, шаг=2. Таким образом, каждая матрица MxN, проходящая через слой объединения, станет(M/2)x(N/2)размер. Подводя итог, можно сказать, что во всех слоях Conv слои conv и relu не изменяют размер ввода и вывода, и только слой объединения делает длину и ширину вывода равными 1/2 от ввода.

Так,Матрица размера MxN фиксируется на (M/16)x(N/16) через слои Conv.! Таким образом, карта объектов, созданная слоями Conv, может соответствовать исходному изображению.

собственное понимание:

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

2 Region Proposal Networks(RPN)

Классические методы обнаружения требуют очень много времени для создания полей обнаружения.Например, OpenCV adaboost использует скользящее окно + пирамиду изображений для создания полей обнаружения или R-CNN использует метод SS (выборочный поиск) для создания полей обнаружения. Faster RCNN отказывается от традиционного скользящего окна и методов SS,直接使用RPN生成检测框, что также является огромным преимуществом Faster R-CNN, которое может значительно повысить скорость генерации кадров обнаружения.

output_9.png                    

На приведенном выше рисунке показана конкретная структура сети RPN. Видно, что сеть RPN фактически разделена на 2 линии, верхняяПолучите положительные и отрицательные классификации с помощью якорей классификации softmax., следующий используется дляВычислить регрессионное смещение ограничительной рамки для привязок, чтобы получить точное предложение. иПоследний слой «Предложение» отвечает за синтез положительных привязок и соответствующего смещения регрессии ограничивающей рамки для получения предложений, исключая при этом предложения, которые слишком малы и выходят за границы.. Фактически, когда вся сеть достигает уровня предложения, она выполняет функцию, эквивалентную целевому позиционированию.

Суммировать:

  1. Через 128 блоков-кандидатов для решения задачи softmax с 2 категориями мы можем узнать 128 блоков, которые являются реальными и эффективными, а какие недействительными.
  2. Следующая строка 1 * 1 вычисляет смещение блока для блока-кандидата, генерируя четыре значения, положение смещения центральной точки.x,y,scaleh,scalewx_,y_,scale_h,scale_w, центральное положение и коэффициент масштабирования
  3. Последнее предложение состоит в том, чтобы синтезировать две предыдущие части, сохранить эффективную привязку и откалибровать эффективную привязку, исправить центральную точку и исправить масштаб кадра (удалить положительную привязку за пределы самого изображения).
2.1 anchors

Якоря на самом деле представляют собой набор прямоугольников, сгенерированных rpn/generate_anchors.py. Запуск generate_anchors.py в авторской демонстрации напрямую дает следующий результат:

Это координаты 9 прямоугольников, сгенерированных для центральной точки.

[[ -84.  -40.   99.   55.]
 [-176.  -88.  191.  103.]
 [-360. -184.  375.  199.]
 [ -56.  -56.   71.   71.]
 [-120. -120.  135.  135.]
 [-248. -248.  263.  263.]
 [ -36.  -80.   51.   95.]
 [ -80. -168.   95.  183.]
 [-168. -344.  183.  359.]]

где каждая строка имеет 4 значения (x1,x2,x3,x4x_1,x_2,x_3,x_4) представляет собой координаты верхнего левого и нижнего правого углов прямоугольника. 9 прямоугольников 3-х форм с соотношением сторон прибл.weight:height$\in${1:1,1:2,2:1}Есть три вида, как показано на рисунке ниже. Фактически многомасштабный метод, обычно используемый при обнаружении, вводится через якоря.

output_12.png                                                                          

Примечание. Что касается приведенного выше размера привязки, он фактически устанавливается в соответствии с изображением обнаружения. В демонстрационной версии Python входное изображение любого размера будет преобразовано в размер 800x600 (т.е. M=800, N=600 на рис. 2). Оглядываясь назад на размер якорей,anchors中长宽1:2中最大为352x704,长宽2:1中最大736x384,基本是cover了800x600的各个尺度和形状.

Так что же делают эти 9 якорей? Заимствуйте исходное изображение из статьи Faster RCNN, как показано на следующем рисунке, пройдитесь по картам объектов, полученным путем расчета слоев Conv, что每一个点Все они оснащены этими 9 якорями в качестве начальной рамки обнаружения.. Получение кадра обнаружения таким способом очень неточно. Не волнуйтесь, позже есть 2 регрессии ограничительной рамки, чтобы исправить положение кадра обнаружения.

                                                   output_13.png

Объясните числа на картинке выше.

  1. В исходном тексте используется модель ZF, а последний слой conv5 num_output=256 в своих слоях Conv генерирует 256 карт объектов, поэтому каждая точка карты объектов эквивалентна 256 измерениям. То есть окончательная полученная карта признаков будетN16*M16*256\frac{N}{16} * \frac{M}{16} * 256 .
  2. После conv5 выполните свертку rpn_conv/3x3 и num_output=256,相当于每个点又融合了周围3x3的空间信息(Думаете, это может быть более надежным? Я все равно не проверял его), а 256-d не изменился (красный прямоугольник на изображении выше).
  3. Предположим, что в каждой точке карты объектов conv5 есть k якорей (по умолчанию k=9), и каждый якорь делится на положительный и отрицательный, поэтому каждая точка преобразуется из 256d признаков в оценки cls=2k; и каждый якорь (x, y, w, h), соответствующие 4 смещениям, поэтому reg=4k координат
  4. Добавлю, слишком много анкоров для тренировок, и программа тренировок будет в соответствующих анкорах随机选取128个postive anchors+128个negative anchorsПоезд (какие подходящие анкеры объясняются ниже)

Обратите внимание, что в этом объяснении используется VGG conv5 num_output=512, поэтому это 512d, а остальные аналогичны.

фактическиRPNВ конце в масштабе исходного изображения устанавливаются плотные Анкоры-кандидаты. Затем используйте cnn, чтобы определить, какие якоря являются положительными якорями с целями, а какие отрицательными без целей. Итак, это просто бинарная классификация! (основная идея РПН)

Итак, сколько якорей всего? Исходное изображение имеет размер 800x600, даунсемплинг VGG — 16 раз, а каждая точка карты объектов имеет значение 9 привязок, поэтому:

                                                output_15.png

Где ceil() означает округление, потому что размер карты объектов = 50 * 38, выводимый VGG.

output_16.png

2.2 softmax определяет положительное и отрицательное

После отправки матрицы размера MxN в сеть Faster R-CNN она становится (M/16)x(N/16) в сети RPN Пусть W=M/16, H=N/16. Перед входом в reshape и softmax выполните свертку 1x1, как показано ниже:    output_17.png

Caffe prototxt этой свертки 1x1 определяется следующим образом:

layer {
  name: "rpn_cls_score"
  type: "Convolution"
  bottom: "rpn/output"
  top: "rpn_cls_score"
  convolution_param {
    num_output: 18   # 2(positive/negative) * 9(anchors)
    kernel_size: 1 pad: 0 stride: 1
  }
}

Вы можете видеть, что его num_output=18, то есть выходное изображение после сверткиW x H x 18размер. Это как раз соответствует тому факту, что каждая точка карты объектов имеет 9 привязок, и каждая привязка может быть положительной и отрицательной, все они хранятсяW x H x (9 * 2)матрица размеров. Зачем это делать? Затем следует классификация softmax для получения положительных привязок, что эквивалентно первоначальному извлечению поля потенциальной области цели обнаружения (обычно считается, что цель находится в положительных привязках).

Установите два порога __C.TRAIN.RPN_POSITIVE_OVERLAP = 0,7, __C.TRAIN.RPN_NEGATIVE_OVERLAP = 0,3, выберите 128 положительных привязок и 128 отрицательных привязок из всех сгенерированных привязок (выбранных функцией np.sample) в соответствии с iou и пороговым значением. Отношение устанавливает метку (метка: 1 — положительно, 0 — отрицательно, -1 — безразлично).

Так зачем соединять слой изменения формы до и после softmax? На самом деле это только для удобства классификации softmax.Что касается конкретных соображений, то надо исходить из формы реализации caffe. Данные сохраняются в blob базовой структуры данных caffe в следующем виде:

blob=[batch_size, channel,height,width]

В соответствии с приведенной выше матрицей, которая сохраняет положительные/отрицательные привязки, ее форма хранения в caffe blob выглядит следующим образом:[1, 2 x 9, H, W]. В классификации softmax требуется положительная/отрицательная двоичная классификация, поэтому слой изменения формы изменит ее на[1, 2, 9xH, W]Размер, то есть измерение «освобождается» отдельно для классификации softmax, а затем форма восстанавливается до исходного состояния. Опубликуйте очень подробное объяснение функции изменения формы в caffe softmax_loss_layer .cpp:

"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be N*H*W, "
"with integer values in {0, 1, ..., C-1}.";

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

собственное понимание:

Общий процесс этой части выглядит следующим образом: сначала выполняется свертка 3 * 3, затем карты признаков объединяются с признаками, а затем мы проходим процесс свертки 1 * 1 * 18, в основном для того, чтобы предыдущие step generateКаждая карта объектов добавляет канал, 9 положительных якорей и 9 отрицательных привязок.Это необходимо для подготовки к последующей классификации softmax.Причина двух изменений заключается в том, что первоначальный автор использует caffe, когда хранилище данных ограничено, поэтому нужно дважды Reshape настроить.

2.3 Принцип регрессии ограничивающей рамки

Как показано на рисунке ниже, зеленая рамка — это наземная истина (GT) самолета, а красная рамка — извлеченные положительные привязки.Даже если красная рамка распознается классификатором как самолет, из-за неточного позиционирования в красной рамке это изображение эквивалентно неверному Обнаружен самолет. Поэтому мы надеемся использовать метод точной настройки красного прямоугольника, чтобы сблизить положительные якоря и GT.      output_18.png

Для окна обычно используется четырехмерный вектор (x, y, w, h) для представления координат центральной точки, а также ширины и высоты окна соответственно. Как показано на рисунке ниже, красный прямоугольник A представляет собой исходные положительные привязки, а зеленый прямоугольник G представляет собой GT цели.Наша цель — найти взаимосвязь, чтобы входной исходный якорь A можно было сопоставить с окном регрессии. что ближе к реальному окну G.G', то есть:

данный якорьA=(Ax,Ay,Aw,Ah)A = (A_x,A_y,A_w,A_h)и GT=(GTx,GTy,GTw,GTh)GT = (GT_x,GT_y,GT_w,GT_h)Найдите преобразование F такое, чтоF(Ax,Ay,Aw,Ah)=(GTx',GTy',GTw',GTh')F(A_x,A_y,A_w,A_h) = (GT_{x}^{'},GT_{y}^{'},GT_{w}^{'},GT_{h}^{'})(GTx',GTy',GTw',GTh')(GTx',GTy',GTw',GTh')(GT_{x}^{'},GT_{y}^{'},GT_{w}^{'},GT_{h}^{'}) \approx (GT_{x}^{'},GT_{y}^{'},GT_{w}^{'},GT_{h}^{'})  

output_23.png

Итак, каким преобразованием F можно изменить якорь A на рис. 10 на G'? Более простой способ мышления:

Соблюдайте приведенные выше 4 формулы и обнаружите, что то, что нужно выучить, этоdx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)эти четыре преобразования. при вводеКогда разница между якорем A и GT невелика, можно считать, что это преобразование является линейным преобразованием, то можно использовать线性回归Для моделирования и точной настройки окна (обратите внимание, что модель линейной регрессии можно использовать только тогда, когда точки привязки A и GT относительно близки, в противном случае это сложная нелинейная задача).

Следующий вопрос заключается в том, как получить с помощью линейной регрессииdx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A). Линейная регрессия - это все о собственных векторах с учетом входных данныхX, узнать набор параметровW, чтобы значение после линейной регрессии совпадало с истинным значениемYочень близко, т.Y=WX. Для этой задачи вход X равенcnn feature map, определяемый как Φ, в то же время существует также величина преобразования между обучающим входом A и GT, то есть(tx,ty,tw,th)(t_x,t_y,t_w,t_h). Выход - четыре преобразованияdx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A). Тогда целевая функция может быть выражена как:

                                        output_28.png

вoutput_29.pngвектор признаков, состоящий из карты признаков, соответствующей якорю,W*W_* параметр, который необходимо изучить,d*(A)d_* (A)результирующее прогнозируемое значение (* означает x, y, w, h, то есть каждое преобразование соответствует одной из указанных выше целевых функций). Чтобы получить прогнозируемое значениеd*(A)d_* (A)с истинной стоимостьюt*t_* Зазор наименьший, а функция проектных потерь:

output_34.png

Цель оптимизации функции:

output_35.png

  • сначала сделай перевод

output_36.png                                                                                                                   

  • увеличить снова

output_37.png                                                                                                                                  

Следует отметить, что приведенное выше линейное преобразование можно приблизительно считать верным только тогда, когда ГТ находится относительно близко к положению искомой системы регрессии. После разговора о принципе, соответствующем оригинальному тексту Faster R-CNN, объем перевода между положительным якорем и основной истиной(tx,ty)(t_x,t_y)с масштабным коэффициентом(tw,th)(t_w,t_h)следующее:

output_41.png

Для обучения ветви регрессии сети регрессии ограничивающей рамки входными данными является функция cnn Φ, а контрольным сигналом является разрыв между Anchor и GT.(tx,ty,tw,th)(t_x,t_y,t_w,t_h), то есть цель обучения состоит в том, чтобы сделать выходной сигнал сети как можно более близким к контрольному сигналу при заданном входном сигнале Φ. Затем, когда работает регрессия прямоугольника будущего, а затем вводится Φ, выходом ветви регрессионной сети является масштаб перевода и преобразования каждого якоря.(tx,ty,tw,th)(t_x,t_y,t_w,t_h), очевидно, можно использовать для исправления положения привязки.

计算所有的positive anchor的$(t_x,t_y,t_w,t_h)$,但在最后loss回传的时候只选取128个做loss回传.

собственное понимание:

Общий процесс этой части выглядит следующим образом: Фактически, в этой части мы обучили сеть. Эта сеть представляет собой простую линейную регрессию. Якорь, сгенерированный нами, и реальная метка наземной истины обучаются с использованием дисперсии в качестве функции потерь. .сеть, наконец(tx,ty,tw,th)(t_x,t_y,t_w,t_h).

2.4 Регрессия ограничивающей рамки для предложений

Разобравшись с регрессией ограничительной рамки, вернитесь ко второй линии сети RPN, как показано ниже.

                        output_45.png

Давайте посмотрим на определение caffe prototxt свертки 1x1 на рисунке выше:

layer {
  name: "rpn_bbox_pred"
  type: "Convolution"
  bottom: "rpn/output"
  top: "rpn_bbox_pred"
  convolution_param {
    num_output: 36   # 4 * 9(anchors)
    kernel_size: 1 pad: 0 stride: 1
  }
}

Вы можете видеть, что num_output=36, то есть выходное изображение после этой сверткиW x H x 36, в caffe blob хранится как[1, 4 x 9, H, W], здесь эквивалентно картам объектов, каждая точка имеет 9 привязок, каждая привязка имеет 4 для регрессии  output_46.png

Сумма трансформации.

Особенности вывода ВГГ соответствуют настройке якорей, а вывода РПН: 50*38*512

  • положительная/отрицательная классификационная матрица softmax размером 50*38*2K
  • Матрица признаков регрессии координат регрессии размером 50 * 38 * 4 КБ

Он просто удовлетворяет RPN для завершения положительной / отрицательной классификации + регрессии координат регрессии ограничивающей рамки.

2.5 Proposal Layer

Уровень предложений отвечает за синтез всехdx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)Сумма преобразования и положительные привязки, рассчитайте точное предложение и отправьте его на последующий уровень пула RoI.. Давайте сначала взглянем на определение caffe prototxt слоя предложения:

layer {
  name: 'proposal'
  type: 'Python'
  bottom: 'rpn_cls_prob_reshape'
  bottom: 'rpn_bbox_pred'
  bottom: 'im_info'
  top: 'rois'
  python_param {
    module: 'rpn.proposal_layer'
    layer: 'ProposalLayer'
    param_str: "'feat_stride': 16"
  }
}

Слой предложений имеет 3 входа:

  • положительные и отрицательные результаты классификатора якорей rpn_cls_prob_reshape
  • соответствующий регистр bboxdx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)Сумма преобразования rpn_bbox_pred,
  • и im_info
  • Также есть параметр feat_stride=16.

Сначала объясните im_info. Для пары любого размераPxQИзображение, сначала измените форму на фиксированное перед передачей в Faster R-CNN.MxN, im_info=[M, N, scale_factor]сэкономь это время缩放вся информация. Затем после Conv Layers, после 4-кратного объединения, становится WxH=(M/16)x(N/16)Размер, где feature_stride=16 сохраняет эту информацию и используется для расчета смещения привязки.

output_53.png                   Proposal Layer forward(Прямая функция уровня caffe) обрабатывается в следующем порядке:

  1. Сгенерируйте якоря и используйте регрессию bbox для всех якорей (якоря здесь точно такие же, как и во время обучения)
  2. Отсортируйте якоря в соответствии с входными положительными оценками softmax от больших к малым и извлеките первые якоря pre_nms_topN (например, 6000), то есть извлеките положительные якоря после исправления положения.
  3. Определите положительные привязки, выходящие за границу изображения, как границу изображения (чтобы предотвратить выход предложения за границу изображения во время последующего объединения областей интереса).
  4. Удалите очень маленькие (ширина
  5. выполнять немаксимальное подавление
  6. Слой предложения имеет 3 входа: результат классификатора положительных и отрицательных привязок rpn_cls_prob_reshape, а соответствующий результат bbox reg (например, 300) — результат предложения.

вывод послеproposal=[x1, y1, x2, y2], Обратите внимание, что, поскольку привязки сопоставляются с исходным изображением на третьем шаге, чтобы определить, выходит ли оно за границу, выходные данные предложения здесь соответствуют масштабу входного изображения MxN, что полезно в последующих сетях.

Здесь представлена ​​структура сети RPN, резюмированная следующим образом:

Создание привязок -> классификатор softmax для извлечения положительных привязок -> положительные привязки регрессии bbox -> Слой предложений для создания предложений

                                     output_55.png

3.RoI Pooling

Слой RoI Pooling отвечает за сбор предложений, расчет карт характеристик предложений и отправку их в последующую сеть. Слой Roll pooling имеет 2 входа:

  • необработанные карты объектов
  • Ящики для предложений, выдаваемые RPN (различные размеры)

Поскольку размер блоков предложений, выдаваемых rpn, варьируется, и после要进入FC层,必须要有固定的大小, где слой RoI Pooling используется для того, чтобы сделать все блоки предложений фиксированного размера. (очень важно)

3.1 Принцип объединения ROI

Определение caffe prototxt слоя RoI Pooling Layer:

layer {
  name: "roi_pool5"
  type: "ROIPooling"
  bottom: "conv5_3"
  bottom: "rois"
  top: "pool5"
  roi_pooling_param {
    pooled_w: 7
    pooled_h: 7
    spatial_scale: 0.0625 # 1/16
  }
}

который имеет новые параметрыpooled_wиpooled_h, еще один параметрspatial_scaleЧитатели, которые читают внимательно, должны уже знать цель. Процесс пересылки уровня RoI Pooling:

  • Поскольку предложение соответствует масштабу MXN, сначала используйте параметр пространственного_масштаба, чтобы сопоставить его обратно с масштабом карты объектов размера (M/16)X(N/16);
  • Затем область карты объектов, соответствующая каждому предложению, делится на горизонтальныеpooled_w * pooled_hсетки;
  • Выполните максимальное объединение в каждой части сетки.

После этой обработки, даже если результаты вывода предложения разных размеров имеют фиксированный размер pooled_w * pooled_h, реализуется вывод фиксированной длины.

Резюме: Объединение ROI

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

4.Classification                    

Часть «Классификация» использует полученные карты характеристик предложения черезfull connect层与softmaxрассчитать каждыйК какой категории относится предложение?(например, люди, автомобили, телевизоры и т. д.), выводcls_probвектор вероятности; при повторном использованииbounding box regressionполучить каждое предложениесмещение позиции bbox_pred, который используется для регрессии более точного кадра обнаружения цели. Сетевая структура части Classification показана на рисунке ниже.

                       output_56.png

После получения карт объектов предложения размером 7x7=49 из RoI Pooling и отправки их в следующую сеть вы можете увидеть, что были сделаны следующие две вещи:

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

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

                                                                               output_57.png

Формула его расчета выглядит следующим образом:

                                        output_58.png

вWиbias Bпредварительно обучены, то есть размер фиксирован, конечно входXи выводYТо есть фиксированный размер. так,Это также подтверждает необходимость Roi Pooling ранее..

5. Более быстрое обучение R-CNN

Обучение Faster R-CNN основано на уже обученной модели (такой как VGG_CNN_M_1024, VGG, ZF). На практике тренировочный процесс делится на6 шагов:

output_59.png

  1. На обученной модели обучите сеть RPN, соответствующую stage1_rpn_train.pt.
  2. Используя сеть RPN, обученную на шаге 1, соберитеproposals, соответствующий rpn_test.pt
  3. Первый раз обучить сеть Fast RCNN, соответствующую stage1_fast_rcnn_train.pt
  4. Вторая обучающая сеть RPN, соответствующая stage2_rpn_train.pt
  5. Снова используйте сеть RPN, обученную на шаге 4, для сбора предложений, соответствующих rpn_test.pt.
  6. Второй раз обучить сеть Fast RCNN, соответствующую stage2_fast_rcnn_train.pt

Видно, что процесс обучения подобен «итеративному» процессу,Но только 2 раза. Что касается причины зацикливания только 2 раза, автор должен упомянуть:"A similar alternating training can be run for more iterations, but we have observed negligible improvements",СейчасЦикл больше раз без улучшения. В следующей главе объясняется процесс обучения, состоящий из шести вышеперечисленных шагов.

Ниже приведена блок-схема тренировочного процесса, которая должна быть более понятной.

5.1 Обучение сети RPN

На этом этапе сначала прочитайте предварительно обученную модель, предоставленную RBG (в этой статье используетсяVGG), чтобы начать итеративное обучение. Давайте взглянем на структуру сети stage1_rpn_train.pt, как показано на рисунке 19.    output_60.png

Подобно сети обнаружения, карты объектов по-прежнему извлекаются с использованием Conv Layers. Потеря, используемая всей сетью, выглядит следующим образом:

output_61.png

В приведенной выше формуле i означает индекс привязки, pi означает положительную вероятность softmax,Pi*P_{i}^{* }Представляет соответствующую вероятность прогнозирования GT (то есть, когда i-я привязка и GT находятся междуIoU>0.7, думаю, что якорьpositive,Pi*P_{i}^{* }=1, иначеIoU<0.3Когда считается, что якорьnegative,Pi*P_{i}^{* }=0;Что касается тех якорей, у которых 0,3); t представляет ограничивающую рамку предсказания,t*t^{* }Представляет поле GT, соответствующее положительной привязке. Как видите, весь Loss делится на 2 части:

  1. cls loss, то есть потери softmax, рассчитанные слоем rpn_cls_loss дляОбучение сети для классификации якорей как положительных и отрицательных
  2. reg loss, то есть потери soomth L1, рассчитанные слоем rpn_loss_bbox, который используется дляобучение регрессионной сети ограничивающей рамки. Обратите внимание, что потери умножаются наPi*P_{i}^{* }, что эквивалентно заботе только о регрессии положительных якорей (на самом деле нет необходимости заботиться о негативах в регрессии).

Поскольку в реальном процессеNclsN_{cls}иNregN_{reg}Разрыв слишком велик,Сбалансируйте их параметром λ(какoutput_69.pngнастройки времениoutput_70.png), так что два вида убытков могут быть равномерно учтены в общем процессе расчета сетевых убытков. Здесь важнееLregL_{reg}Используемые потери soomth L1 рассчитываются следующим образом:

output_72.png                                                 

  1. На этапе обучения RPN слой rpn-data (python AnchorTargetLayer) будет генерировать привязки для обучения точно так же, как слой Proposal на этапе тестирования.
  2. Для rpn_loss_cls входные параметры rpn_cls_scors_reshape и rpn_labels соответствуют p иP*P^* ,NclsN_{cls}параметры неявны в p сP*P^* размер кофейного шарика
  3. Для rpn_loss_bbox входные rpn_bbox_pred и rpn_bbox_targets соответствуют t иt*t^* , rpn_bbox_inside_weigths соответствуетP*P^* , rpn_bbox_outside_weigths не используется (как видно из кода слоя soomth_L1_Loss), иNregN_{reg}Также подразумевается в размере кофейного блоба.

Таким образом, формула точно соответствует коду. Особо следует отметить, что,Порядок, в котором якоря генерируются и сохраняются во время обучения и обнаружения, точно такой же., чтобы результаты обучения можно было использовать для обнаружения!

5.2 Сбор предложений через обученную сеть RPN

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

output_79.png                                     

5.3 Обучение сети Faster RCNN

Прочитайте файл рассола, сохраненный ранее, чтобы получить предложения и положительную вероятность. Введите сеть из слоя данных. Потом:

  1. Передайте извлеченные предложения в сеть как rois, как показано в синем поле ниже.
  2. Вычислить bbox_inside_weights + bbox_outside_weights, то же, что и RPN, передать в слое soomth_L1_loss, как показано в зеленом поле ниже

Таким образом можно обучить окончательное распознавание softmax и окончательную регрессию ограничительной рамки, как показано на рисунке 21.

output_80.png

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