Оцените якорные коробки для детекторов объектов глубокого обучения
оценивает заданное количество якорей, используя обучающие данные.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 для блоков в каждом кластере. The 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, который возвращает массив ячеек или таблицу с двумя или несколькими столбцами. Ограничивающие прямоугольники должны быть в массиве ячеек матриц <reservedrangesplaceholder4>-by-4 в формате [x, y, width, height].
datastore должен быть одним из следующих:
A 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-means кластеризации использует метрику расстояния IoU, чтобы вычислить перекрытие с помощью уравнения 1
-bboxOverlapRatio
(box1,box2
).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.