14.5. Обнаружение объектов на разных масштабах

В Section 14.4 мы генерировали несколько якорных прямоугольников, центрированных на каждом пикселе входного изображения. По сути, эти якорные прямоугольники представляют собой выборки различных областей изображения. Однако, если они генерируются для каждого пикселя, их количество может оказаться слишком большим для вычислений. Рассмотрим изображение размером \(561 \times 728\). Если для каждого пикселя в качестве центра генерируется пять якорных прямоугольников разных форм, то для разметки и предсказания на изображении потребуется более двух миллионов якорных прямоугольников (\(561 \times 728 \times 5\)).

14.5.1. Масштабно-независимые якорные рамки

Вы можете заметить, что сократить количество якорных боксов на изображении несложно. Например, мы можем просто равномерно выбрать небольшую часть пикселей входного изображения, чтобы сгенерировать якорные боксы, центрированные на них. Кроме того, на разных масштабах мы можем генерировать разное количество якорных боксов разных размеров. Интуитивно понятно, что на изображении чаще встречаются меньшие объекты, чем большие. В качестве примера, объекты \(1 \times 1\), \(1 \times 2\) и \(2 \times 2\) могут появиться на изображении \(2 \times 2\) соответственно в 4, 2 и 1 возможных вариантах. Следовательно, при использовании меньших якорных боксов для обнаружения меньших объектов мы можем выбрать больше регионов, а для больших объектов — меньше.

Чтобы продемонстрировать, как генерировать якорные боксы на разных масштабах, загрузим изображение. Его высота и ширина составляют 561 и 728 пикселей соответственно.

%matplotlib inline
import torch
from d2l import torch as d2l

img = d2l.plt.imread('../img/catdog.jpg')
h, w = img.shape[:2]
h, w

Вспомним, что в Section 7.2 двумерный массив, являющийся выходом свёрточного слоя, называется картой признаков. Задавая форму карты признаков, мы можем определить центры равномерно распределённых якорных блоков на любом изображении.

Функция display_anchors определена ниже. Мы генерируем якорные рамки (anchors) на карте признаков (fmap), используя каждый элемент (пиксель) в качестве центра якорной рамки. Поскольку значения координат по оси \((x, y)\) в якорных рамках (anchors) нормированы на ширину и высоту карты признаков (fmap), они лежат в диапазоне от 0 до 1, что соответствует относительным положениям якорных рамок на карте признаков.

Поскольку центры якорных боксов (anchors) распределены по всем элементам карты признаков (fmap), эти центры должны равномерно располагаться на любом входном изображении с учётом их относительных пространственных позиций. Более конкретно, при заданных ширине и высоте карты признаков fmap_w и fmap_h соответственно, следующая функция будет равномерно выбирать пиксели в fmap_h строках и fmap_w столбцах на любом входном изображении. На основе этих равномерно выбранных пикселей будут генерироваться якорные боксы масштаба s (предполагая, что длина списка s равна 1) и различных соотношений сторон (ratios).

def display_anchors(fmap_w, fmap_h, s):
    d2l.set_figsize()
    # Values on the first two dimensions do not affect the output
    fmap = torch.zeros((1, 10, fmap_h, fmap_w))
    anchors = d2l.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])
    bbox_scale = torch.tensor((w, h, w, h))
    d2l.show_bboxes(d2l.plt.imshow(img).axes,
                    anchors[0] * bbox_scale)

Сначала рассмотрим обнаружение мелких объектов. Чтобы при отображении их было легче различать, якорные рамки с разными центрами здесь не перекрываются: масштаб якорной рамки установлен равным 0,15, а высота и ширина карты признаков — равными 4. Мы видим, что центры якорных рамок в 4 строках и 4 столбцах на изображении распределены равномерно.

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])

Перейдём к уменьшению высоты и ширины карты признаков вдвое и использованию более крупных якорных коробок для обнаружения больших объектов. При установке масштаба 0.4 некоторые якорные коробки будут перекрываться.

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])

Наконец, мы ещё раз уменьшаем высоту и ширину карты признаков вдвое и увеличиваем масштаб якорной рамки до 0,8. Теперь центр якорной рамки совпадает с центром изображения.

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])

14.5.2. Мультимасштабное обнаружение

Поскольку мы сгенерировали якорные рамки на разных масштабах, мы будем использовать их для обнаружения объектов различных размеров на разных масштабах. В дальнейшем мы представим метод обнаружения объектов на основе свёрточных нейронных сетей, который реализуем в Section 14.7.

На некотором масштабе, предположим, у нас есть \(c\) карты признаков формы \(h \times w\). Используя метод из Section 14.5.1, мы генерируем \(hw\) наборов якорных рамок, где каждый набор содержит \(a\) якорных рамок с одинаковым центром. Например, на первом масштабе в экспериментах из Section 14.5.1, имея десять (число каналов) \(4 \times 4\) карт признаков, мы сгенерировали 16 наборов якорных рамок, где каждый набор содержит 3 якорные рамки с одинаковым центром. Далее каждая якорная рамка получает метку класса и смещения на основе эталонных ограничивающих рамок. На текущем масштабе модель обнаружения объектов должна предсказать классы и смещения для \(hw\) наборов якорных рамок на входном изображении, причём разные наборы имеют разные центры.

Предположим, что \(c\) карты признаков здесь — это промежуточные выходы, полученные в результате прямого распространения свёрточной нейронной сети на входном изображении. Поскольку на каждой карте признаков имеется \(hw\) различных пространственных позиций, одну и ту же пространственную позицию можно рассматривать как набор из \(c\) единиц. Согласно определению рецептивного поля в Section 7.2, эти \(c\) единиц в одной и той же пространственной позиции карт признаков имеют одинаковое рецептивное поле на входном изображении: они кодируют информацию входного изображения в пределах одного и того же рецептивного поля. Следовательно, мы можем преобразовать \(c\) единиц карт признаков в одной и той же пространственной позиции в классы и смещения для \(a\) якорных боксов, сгенерированных с использованием этой пространственной позиции. По сути, мы используем информацию входного изображения в определённом рецептивном поле для предсказания классов и смещений якорных боксов, расположенных вблизи этого рецептивного поля на входном изображении.

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

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

14.5.3. Итоги

  • На разных масштабах мы можем генерировать якорные рамки разных размеров для обнаружения объектов различных размеров.

  • Определив форму карт признаков, мы можем определить центры равномерно выбранных якорных блоков на любом изображении.

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

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

14.5.4. Упражнения

  1. Как обсуждалось в Section 8.1, глубокие нейронные сети изучают иерархические признаки с возрастающим уровнем абстракции для изображений. При обнаружении объектов в нескольких масштабах соответствуют ли карты признаков на разных масштабах разным уровням абстракции? Почему да или почему нет?

  2. На первом масштабе (fmap_w=4, fmap_h=4) в экспериментах из Section 14.5.1 сгенерируйте якорные боксы, распределённые равномерно и потенциально пересекающиеся.

  3. Рассмотрим переменную карты признаков формы \(1 \times c \times h \times w\), где \(c\), \(h\) и \(w\) — это количество каналов, высота и ширина карт признаков соответственно. Как преобразовать эту переменную в классы и смещения якорных боксов? Какова форма выходных данных?

Обсуждения