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