exponenta event banner

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 коробок в каждом кластере. estimateAnchorBoxes функция использует алгоритм кластеризации k-means с метрикой расстояния 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. Этот эмпирический анализ помогает определить количество анкерных ящиков, необходимых для удовлетворения требований к производительности приложения, таких как скорость обнаружения или точность.

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

свернуть все

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

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

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

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

свернуть все

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

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

Представлен в R2019b