boxLabelDatastore

Datastore для ограничительной рамки помечает данные

Описание

Используйте boxLabelDatastore возразите, чтобы считать помеченные данные об ограничительной рамке для обнаружения объектов.

Чтобы считать ограничительную рамку помечают данные из boxLabelDatastore, используйте read функция. Эта функция возвращает таблицу, которая содержит ограничительные рамки в первом столбце и метки во втором столбце. Можно создать datastore, который комбинирует boxLabelDatastore с ImageDatastore использование combine функция. Используйте объединенный datastore, чтобы обучить детекторы объектов с помощью учебных функций, таких как trainYOLOv2ObjectDetector и trainFasterRCNNObjectDetector.

Создание

Создайте boxLabelDatastore объект с помощью boxLabelDatastore функция. После того, как вы создадите объект, можно использовать функции, чтобы получить доступ и управлять данными. Используйте запись через точку, чтобы изменить ReadSize свойство.

Описание

пример

blds = boxLabelDatastore(tbl) создает boxLabelDatastore объект из таблицы tbl содержа помеченные данные об ограничительной рамке.

blds = boxLabelDatastore(tbl1,tbl2,...) создает boxLabelDatastore объект с помощью нескольких таблиц.

Входные параметры

развернуть все

Помеченные данные об ограничительной рамке, заданные как таблица с одним или несколькими столбцами. Учебная таблица может быть в одном из двух форматов:

Таблица с одним или несколькими столбцами:

  • Все столбцы содержат ограничительные рамки. Каждый столбец должен быть вектором ячейки, содержащим anM-4 матрицы, которые представляют класс отдельного объекта, такой как stopSign, carRear или carFront. Столбцы содержат двойные массивы с 4 элементами ограничительных рамок M в формате [x, y, width, height]. Формат задает местоположение верхнего левого угла и размер ограничительной рамки в соответствующем изображении.

  • Таблица с двумя столбцами:

    • Первый столбец содержит ограничительные рамки и должен быть вектором ячейки. Каждый элемент в векторе ячейки содержит M-by-4 матрицы в формате [x, y, width, height].

    • Второй столбец должен быть вектором ячейки, который содержит имена метки, соответствующие каждой ограничительной рамке. Каждым элементом в векторе ячейки должен быть M-by-1 категориальный или вектор строки.

Чтобы составить таблицу основной истины, используйте приложение Image Labeler или приложение Video Labeler. Чтобы составить таблицу обучающих данных от сгенерированной основной истины, используйте objectDetectorTrainingData функция.

Типы данных: table

Свойства

развернуть все

Это свойство доступно только для чтения.

Помеченные данные об ограничительной рамке, заданные как N-by-2 матрица ячейки.

  • Первый столбец должен быть вектором ячейки, который содержит ограничительные рамки. Каждый элемент в векторе ячейки содержит M-by-4 матрицы в формате [x, y, width, height].

  • Второй столбец должен быть вектором ячейки, который содержит имена метки, соответствующие каждой ограничительной рамке. M-by-1 категориальный вектор представляет каждое имя метки.

Максимальное количество строк данных о метке, чтобы читать в каждом вызове read функция, заданная как положительное целое число.

Функции объекта

combineОбъедините данные от нескольких datastores
countEachLabelСчитайте вхождение меток поля или пикселя
hasdataОпределите, доступны ли данные, чтобы читать из datastore
numpartitionsКоличество разделов для datastore
partitionРазделите datastore метки
progressПроцент данных считан из datastore
readСчитайте данные из datastore
readallСчитывайте все данные в datastore
resetСброс Datastore к начальному состоянию
transformПреобразуйте datastore

Примеры

свернуть все

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

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]

Визуализируйте сеть с помощью сетевого анализатора.

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

Введенный в R2019b