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]

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

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

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

  • boxLabelDatastore в формате [boxes, labels]

  • {images, boxes, labels} — объединенный datastore. Например, использование combineimds , blds).

Количество полей привязки для функции, чтобы возвратиться, заданный как целое число.

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

свернуть все

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

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

Введенный в R2019b