estimateAnchorBoxes

Оцените якорные коробки для детекторов объектов глубокого обучения

Описание

пример

anchorBoxes = estimateAnchorBoxes(trainingData,numAnchors) оценивает заданное количество якорей, используя обучающие данные.

[anchorBoxes,meanIoU] = estimateAnchorBoxes(trainingData,numAnchors) дополнительно возвращает среднее значение пересечения по соединению (IoU) анкерных блоков в каждом кластере.

Примеры

свернуть все

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

data = load('vehicleTrainingData.mat');
trainingData = data.vehicleTrainingData;

Создайте boxLabelDatastore объект с использованием маркированных ограничительных рамок из обучающих данных.

blds = boxLabelDatastore(trainingData(:,2:end));

Оцените якорные коробки с помощью boxLabelDatastore объект.

numAnchors = 5;
anchorBoxes = estimateAnchorBoxes(blds,numAnchors);

Задайте размер изображения.

inputImageSize = [128,228,3];

Укажите количество классов для обнаружения.

numClasses = 1;

Используйте предварительно обученную ResNet-50 сеть в качестве базовой сети для сети YOLO v2.

network = resnet50();

Укажите слой сети, который будет использоваться для редукции данных. Можно использовать analyzeNetwork функция для просмотра всех имен слоев в сети.

featureLayer = 'activation_49_relu';

Создайте сеть обнаружения объектов YOLO v2.

lgraph = yolov2Layers(inputImageSize,numClasses,anchorBoxes,network, featureLayer)
lgraph = 
  LayerGraph with properties:

         Layers: [182×1 nnet.cnn.layer.Layer]
    Connections: [197×2 table]
     InputNames: {'input_1'}
    OutputNames: {'yolov2OutputLayer'}

Визуализируйте сеть с помощью сетевого анализатора.

analyzeNetwork(lgraph)

Якорные коробки являются важными параметрами детекторов объектов глубокого обучения, таких как Faster R-CNN и YOLO v2. Форма, шкала и количество анкерных коробок влияют на эффективность и точность детекторов.

Для получения дополнительной информации см. раздел «Якорные рамки для обнаружения объектов».

Загрузка обучающих данных

Загрузите транспортное средство набор данных, который содержит 295 изображений и связанных меток ящиков.

data = load('vehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;

Добавьте полный путь к локальной папке данных о транспортном средстве.

dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir,vehicleDataset.imageFilename);

Отобразите сводные данные набора данных.

summary(vehicleDataset)
Variables:

    imageFilename: 295×1 cell array of character vectors

    vehicle: 295×1 cell

Визуализация основного блока истинности

Визуализируйте маркированные рамки, чтобы лучше изучить область значений размеров объектов, присутствующих в наборе данных.

Объедините все основные блоки истинности в один массив.

allBoxes = vertcat(vehicleDataset.vehicle{:});

Постройте график площади коробки в зависимости от соотношения сторон коробки.

aspectRatio = allBoxes(:,3) ./ allBoxes(:,4);
area = prod(allBoxes(:,3:4),2);

figure
scatter(area,aspectRatio)
xlabel("Box Area")
ylabel("Aspect Ratio (width/height)");
title("Box Area vs. Aspect Ratio")

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

Оценка анкерных коробок

Оцените якорные коробки из обучающих данных с помощью estimateAnchorBoxes функция, которая использует метрику расстояния пересечения по соединению (IoU).

Метрика расстояния, основанная на IoU, инвариантна размеру коробок, в отличие от метрики Евклидова расстояния, которая производит большие ошибки, когда размеры коробки увеличиваются [1]. В сложение, использование метрики расстояния IoU приводит к тому, что коробки одинаковых соотношений сторон и размеров кластеризуются вместе, что приводит к оценкам якоря, которые соответствуют данным.

Создайте boxLabelDatastore использование основных блоков истинности в наборе данных о транспортном средстве. Если шаг предварительной обработки для настройки детектора объектов включает изменение размера изображений, используйте transform и bboxresize изменение размера ограничивающих рамок в boxLabelDatastore перед оценкой анкерных коробок.

trainingData = boxLabelDatastore(vehicleDataset(:,2:end));

Выберите количество анкеров и оцените анкерные коробки с помощью estimateAnchorBoxes функция.

numAnchors = 5;
[anchorBoxes, meanIoU] = estimateAnchorBoxes (trainingData, numAnchors);
anchorBoxes
anchorBoxes = 5×2

    21    27
    87   116
    67    92
    43    61
    86   105

Выбор количества якорей является еще одним обучающим гиперпараметром, который требует тщательного отбора с помощью эмпирического анализа. Одним из измерений качества для оценки предполагаемых анкерных блоков является среднее значение IoU для блоков в каждом кластере. The estimateAnchorBoxes функция использует k-средних значений алгоритм кластеризации с метрикой расстояния IoU, чтобы вычислить перекрытие с помощью уравнения, 1 - bboxOverlapRatio(allBoxes,boxInCluster).

meanIoU
meanIoU = 0.8411

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

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

maxNumAnchors = 15;
meanIoU = zeros([maxNumAnchors,1]);
anchorBoxes = cell(maxNumAnchors, 1);
for k = 1:maxNumAnchors
    % Estimate anchors and mean IoU.
    [anchorBoxes{k},meanIoU(k)] = estimateAnchorBoxes(trainingData,k);    
end

figure
plot(1:maxNumAnchors,meanIoU,'-o')
ylabel("Mean IoU")
xlabel("Number of Anchors")
title("Number of Anchors vs. Mean IoU")

Использование двух анкерных коробок приводит к среднему значению IoU, превышающему 0,65, а использование более 7 анкерных коробок дает лишь незначительное улучшение среднего значения IoU. Учитывая эти результаты, следующим шагом является обучение и оценка нескольких детекторов объектов с использованием значений от 2 до 6. Этот эмпирический анализ помогает определить количество анкерных коробок, необходимых для удовлетворения требований прикладной эффективности, таких как скорость обнаружения или точность.

Входные параметры

свернуть все

Обучающие данные, заданные как datastore, который возвращает массив ячеек или таблицу с двумя или несколькими столбцами. Ограничивающие прямоугольники должны быть в массиве ячеек матриц <reservedrangesplaceholder4>-by-4 в формате [x, y, width, height].

datastore должен быть одним из следующих:

Количество якорей для возвращаемой функции, заданное в виде целого числа.

Выходные аргументы

свернуть все

Якорные коробки, возвращенные как матрица N -by-2, где N - количество анкерных коробок, и каждая запись имеет формат [height, width]. Использование numAnchors для определения количества анкерных коробок.

Метрика расстояния, возвращенная как скалярное значение. Метрика расстояния обеспечивает среднее значение пересечения по соединению (IoU) анкерных блоков в каждом кластере. Чтобы убедиться, что анкерные коробки хорошо перекрываются с коробками в обучающих данных, meanIoU значение должно быть больше 0,5. Алгоритм k-means кластеризации использует метрику расстояния IoU, чтобы вычислить перекрытие с помощью уравнения 1-bboxOverlapRatio(box1,box2).

Введенный в R2019b