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