Оцените поля привязки Используя кластеризацию

Этот пример показывает, как оценить поля привязки от объектного использования данных тренировки детектора, кластеризирующегося [1].

Поля привязки являются важными параметрами детекторов объекта глубокого обучения, такими как Более быстрый R-CNN и YOLO v2. Форма, шкала и количество полей привязки влияют на эффективность и точность детекторов. Этот пример показывает, как оценить поля привязки от обучающего набора данных детектора автомобиля с помощью K-Medoids кластеризирующийся алгоритм.

Смотрите Поля Привязки для Обнаружения объектов, чтобы узнать больше о полях привязки.

Загрузите данные тренировки

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

% Load vehicle training data.
data = load('vehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;

% Add fullpath to the local vehicle data folder.
dataDir = fullfile(toolboxdir('vision'),'visiondata');
vehicleDataset.imageFilename = fullfile(dataDir, vehicleDataset.imageFilename);

% Display dataset summary
summary(vehicleDataset)
Variables:

    imageFilename: 295×1 cell array of character vectors

    vehicle: 295×1 cell

Визуализируйте наземное распределение поля истины

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

% Combine all the ground truth boxes into one array.
allBoxes = vertcat(vehicleDataset.vehicle{:});

Постройте область поля по сравнению с соотношением сторон поля.

% Plot the box area versus box aspect ratio.
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")

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

Кластерные наземные поля истины

Кластеризируйте поля с помощью функции kmedoids с пользовательской метрикой расстояния пересечения по объединению (IoU). Другие функции кластеризации, такие как clusterdata или dbscan могут также использоваться.

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

Выберите количество привязок и оцените поля привязки с помощью kmedoids. Кластерные центры, возвращенные kmedoids, являются оценками поля привязки.

% Select the number of anchor boxes.
numAnchors = 4;

% Cluster using K-Medoids.
[clusterAssignments, anchorBoxes, sumd] = kmedoids(allBoxes(:,3:4),numAnchors,'Distance',@iouDistanceMetric);

% Display estimated anchor boxes. The box format is the [width height].
anchorBoxes
anchorBoxes = 4×2

    59    43
    22    18
    29    23
   109    84

% Display clustering results.
figure
gscatter(area,aspectRatio,clusterAssignments);
title("K-Mediods with "+numAnchors+" clusters")
xlabel("Box Area")
ylabel("Aspect Ratio (width/height)");
grid

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

% Count number of boxes per cluster. Exclude the cluster center while
% counting.
counts = accumarray(clusterAssignments, ones(length(clusterAssignments),1),[],@(x)sum(x)-1);

% Compute mean IoU.
meanIoU = mean(1 - sumd./(counts))
meanIoU = 0.8244

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

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

maxNumAnchors = 15;
for k = 1:maxNumAnchors
    
    % Estimate anchors using clustering.
    [clusterAssignments, anchorBoxes, sumd] = kmedoids(allBoxes(:,3:4),k,'Distance',@iouDistanceMetric);
    
    % Compute mean IoU.
    counts = accumarray(clusterAssignments, ones(length(clusterAssignments),1),[],@(x)sum(x)-1);
    meanIoU(k) = mean(1 - sumd./(counts));
end

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

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

Ссылки

  1. Redmon, Джозеф и Али Фархади. "YOLO9000: лучше, быстрее, более сильный". 2 017 конференций по IEEE по компьютерному зрению и распознаванию образов (CVPR). IEEE, 2017.

Поддерживание функций

function dist = iouDistanceMetric(boxWidthHeight,allBoxWidthHeight)
% Return the IoU distance metric. The bboxOverlapRatio function
% is used to produce the IoU scores. The output distance is equal
% to 1 - IoU.

% Add x and y coordinates to box widths and heights so that
% bboxOverlapRatio can be used to compute IoU.
boxWidthHeight = prefixXYCoordinates(boxWidthHeight);
allBoxWidthHeight = prefixXYCoordinates(allBoxWidthHeight);

% Compute IoU distance metric.
dist = 1 - bboxOverlapRatio(allBoxWidthHeight, boxWidthHeight);
end

function boxWidthHeight = prefixXYCoordinates(boxWidthHeight)
% Add x and y coordinates to boxes.
n = size(boxWidthHeight,1);
boxWidthHeight = [ones(n,2) boxWidthHeight];
end