Оцените поля привязки для детекторов объектов глубокого обучения
оценивает конкретное количество полей привязки с помощью обучающих данных.anchorBoxes
= estimateAnchorBoxes(trainingData
,numAnchors
)
[
дополнительно возвращает среднее значение пересечения по объединению (IoU) привязки, окружает каждый кластер.anchorBoxes
,meanIoU
] = estimateAnchorBoxes(trainingData
,numAnchors
)
В этом примере показано, как оценить поля привязки с помощью таблицы, содержащей обучающие данные. Первый столбец содержит учебные изображения, и остальные столбцы содержат помеченные ограничительные рамки.
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-средних значений, кластеризирующих алгоритм с метрикой расстояния 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. Этот эмпирический анализ помогает определить количество полей привязки, требуемых удовлетворить требованиям приложений к производительности, таким как скорость обнаружения или точность.
trainingData
— Обучающие данныеОбучающие данные в виде datastore, который возвращает массив ячеек или таблицу с двумя или больше столбцами. Ограничительные рамки должны быть в массиве ячеек M-by-4 матрицами в формате [x, y, width, height].
Datastore должен быть одним из следующего:
boxLabelDatastore
в формате [boxes, labels]
{images, boxes, labels} — объединенный datastore. Например, использование combine
imds
, blds
).
numAnchors
— Количество полей привязкиКоличество полей привязки для функции, чтобы возвратиться в виде целого числа.
anchorBoxes
— Поля привязкиПоля привязки, возвращенные как N-by-2 матрица, где N является количеством полей привязки и каждой записи, имеют формат [height, width]. Используйте numAnchors
задавать количество полей привязки.
meanIoU
— Метрика расстоянияМетрика расстояния, возвращенная как скалярное значение. Метрика расстояния вводит среднее значение пересечения по объединению (IoU) привязки, окружает каждый кластер. Чтобы гарантировать поля привязки перекрываются хорошо с полями в обучающих данных, meanIoU
значение должно быть больше 0.5. k - означает кластеризироваться, алгоритм использует метрику расстояния IoU, чтобы вычислить перекрытие с помощью уравнения 1
- bboxOverlapRatio
(box1,box2
).
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.