exponenta event banner

Экспорт детектора объектов YOLO v2 в ONNX

В этом примере показано, как экспортировать сеть обнаружения объектов YOLO v2 в формат модели ONNX™ (Open Neural Network Exchange). После экспорта сети YOLO v2 можно импортировать сеть в другие платформы глубокого обучения для вывода. В этом примере также представлен рабочий процесс, которому можно следовать для выполнения вывода с использованием импортированной модели ONNX.

Экспорт сети YOLO v2

Экспортируйте сеть обнаружения в ONNX и собирайте метаданные, необходимые для создания результатов обнаружения объектов.

Сначала загрузите предварительно подготовленный детектор объектов YOLO v2 в рабочее пространство.

input = load('yolov2VehicleDetector.mat');
net = input.detector.Network;

Затем получите метаданные детектора YOLO v2, которые будут использоваться для вывода. Метаданные детектора включают в себя размер сетевого входного изображения, поля привязки и размер активации последнего слоя свертки.

Считывайте размер сетевого входного изображения из входной сети YOLO v2.

inputImageSize = net.Layers(1,1).InputSize;

Считывайте якорные ящики, используемые для обучения, с входного детектора.

anchorBoxes = input.detector.AnchorBoxes;

Получение размера активации последнего уровня свертки во входной сети с помощью analyzeNetwork функция.

analyzeNetwork(net);

finalActivationSize = [16 16 24];

Экспорт в формат модели ONNX

Экспорт сети обнаружения объектов YOLO v2 в формате ONNX с помощью exportONNXNetwork функция. Укажите имя файла как yolov2.onnx. Функция сохраняет экспортированный файл ONNX в текущую рабочую папку.

filename = 'yolov2.onnx';
exportONNXNetwork(net,filename);

exportONNXNetwork функция отображает yolov2TransformLayer (инструментарий компьютерного зрения) и yolov2OutputLayer (Computer Vision Toolbox) во входной сети YOLO v2 к базовому оператору ONNX и оператору идентификации соответственно. После экспорта сети можно импортировать yolov2.onnx в любую среду глубокого обучения, поддерживающую импорт ONNX.

Использование exportONNXNetwork, требуется пакет поддержки Deep Learning Toolbox™ и конвертер Deep Learning Toolbox для формата модели ONNX. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки.

Обнаружение объектов с помощью экспортированной сети YOLO v2

После завершения экспорта можно импортировать модель ONNX в любую среду глубокого обучения и использовать следующий рабочий процесс для обнаружения объектов. Наряду с сетью ONNX этот рабочий процесс также требует метаданных детектора YOLO v2 inputImageSize, anchorBoxes, и finalActivationSize получено из рабочей области MATLAB. Следующий код является реализацией потока операций MATLAB, который необходимо перевести в эквивалентный код для выбранной инфраструктуры.

Входное изображение предварительной обработки

Предварительная обработка изображения, используемого для вывода. Изображение должно быть RGB-изображением и должно быть изменено на размер сетевого входного изображения, а его значения пикселов должны лежать в интервале [0 1].

I = imread('highway.png');
resizedI = imresize(I,inputImageSize(1:2));
rescaledI = rescale(resizedI);

Передача входных данных и выполнение модели ONNX

Запустите модель ONNX в выбранной вами среде глубокого обучения с предварительно обработанным изображением в качестве входных данных для импортированной модели ONNX.

Извлечение прогнозов из выходных данных модели ONNX

Модель предсказывает следующее:

  • Пересечение через соединение (IoU) с полями истинности земли

  • x, y, w, и h параметры ограничивающей рамки для каждой опорной рамки

  • Вероятности классов для каждого якорного ящика

Выходные данные модели ONNX представляют собой карту характеристик, которая содержит прогнозы и имеет размер predictionsPerAnchorоколо-numAnchorsоколо-numGrids.

  • numAnchors - количество анкерных ящиков.

  • numGrids - количество сеток, вычисленное как произведение высоты и ширины последнего слоя свертки.

  • predictionsPerAnchor - выходные прогнозы в форме [IoU;x;y;w;h;class probabilities].

  • Первая строка на карте элементов содержит прогнозы IoU для каждого поля привязки.

  • Вторая и третья строки карты элементов содержат прогнозы для координат центроида (x, y) каждого якорного ящика.

  • Четвертая и пятая строки на карте элементов содержат прогнозы ширины и высоты каждого якорного ящика.

  • Шестая строка на карте элементов содержит прогнозы вероятностей классов для каждого поля привязки.

Вычисление окончательных обнаружений

Для вычисления окончательных обнаружений для предварительно обработанного тестового образа необходимо:

  • Масштабируйте параметры ограничивающей рамки относительно размера входного уровня сети.

  • Вычислите оценки достоверности объекта из прогнозов.

  • Получение прогнозов с высокими показателями достоверности объектов.

  • Выполните подавление без максимума.

В качестве руководства по внедрению используйте код для yolov2PostProcess функция в функциях постобработки.

[bboxes,scores,labels] = yolov2PostProcess(featureMap,inputImageSize,finalActivationsSize,anchorBoxes);

Показать результаты обнаружения

Idisp = insertObjectAnnotation(resizedI,'rectangle',bboxes,scores);
figure
imshow(Idisp)

Ссылки

[1] Редмон, Джозеф и Али Фархади. «YOLO9000: лучше, быстрее, сильнее». В 2017 году Конференция IEEE по компьютерному зрению и распознаванию образов (CVPR), 6517-25. Гонолулу, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.690.

Функции постобработки

function  [bboxes,scores,labels] = yolov2PostProcess(featureMap,inputImageSize,finalActivationsSize,anchorBoxes)

% Extract prediction values from the feature map.
iouPred = featureMap(1,:,:);
xyPred = featureMap(2:3,:,:);
whPred = featureMap(4:5,:,:);
probPred = featureMap(6,:,:);

% Rescale the bounding box parameters.
bBoxes = rescaleBbox(xyPred,whPred,anchorBoxes,finalActivationsSize,inputImageSize);

% Rearrange the feature map as a two-dimensional matrix for efficient processing.
predVal = [bBoxes;iouPred;probPred];
predVal = reshape(predVal,size(predVal,1),[]);

% Compute object confidence scores from the rearranged prediction values.
[confScore,idx] = computeObjectScore(predVal);

% Obtain predictions with high object confidence scores.
[bboxPred,scorePred,classPred] = selectMaximumPredictions(confScore,idx,predVal);

% To get the final detections, perform nonmaximum suppression with an overlap threshold of 0.5.
[bboxes,scores,labels] = selectStrongestBboxMulticlass(bboxPred, scorePred, classPred,'RatioType','Union','OverlapThreshold',0.5);

end
function bBoxes = rescaleBbox(xyPred,whPred,anchorBoxes,finalActivationsSize,inputImageSize)

% To rescale the bounding box parameters, compute the scaling factor by using the network parameters inputImageSize and finalActivationSize.
scaleY = inputImageSize(1)/finalActivationsSize(1); 
scaleX = inputImageSize(2)/finalActivationsSize(2);
scaleFactor = [scaleY scaleX];

bBoxes = zeros(size(xyPred,1)+size(whPred,1),size(anchors,1),size(xyPred,3),'like',xyPred);
for rowIdx=0:finalActivationsSize(1,1)-1
    for colIdx=0:finalActivationsSize(1,2)-1
        ind = rowIdx*finalActivationsSize(1,2)+colIdx+1;
        for anchorIdx = 1 : size(anchorBoxes,1)
              
            % Compute the center with respect to image.
            cx = (xyPred(1,anchorIdx,ind)+colIdx)* scaleFactor(1,2);
            cy = (xyPred(2,anchorIdx,ind)+rowIdx)* scaleFactor(1,1);
              
            % Compute the width and height with respect to the image.
            bw = whPred(1,anchorIdx,ind)* anchorBoxes(anchorIdx,1);
            bh = whPred(2,anchorIdx,ind)* anchorBoxes(anchorIdx,2);
              
            bBoxes(1,anchorIdx,ind) = (cx-bw/2);
            bBoxes(2,anchorIdx,ind) = (cy-bh/2);
            bBoxes(3,anchorIdx,ind) = w;
            bBoxes(4,anchorIdx,ind) = h;
        end
    end
end
end
function [confScore,idx] = computeObjectScore(predVal)
iouPred = predVal(5,:); 
probPred = predVal(6:end,:); 
[imax,idx] = max(probPred,[],1); 
confScore = iouPred.*imax;
end
function [bboxPred,scorePred,classPred] = selectMaximumPredictions(confScore,idx,predVal)
% Specify the threshold for confidence scores.
confScoreId = confScore >= 0.5;
% Obtain the confidence scores greater than or equal to 0.5.
scorePred = confScore(:,confScoreId);
% Obtain the class IDs for predictions with confidence scores greater than
% or equal to 0.5.
classPred = idx(:,confScoreId);
% Obtain the bounding box parameters for predictions with confidence scores
% greater than or equal to 0.5.
bboxesXYWH = predVal(1:4,:);
bboxPred = bboxesXYWH(:,confScoreId);
end

См. также

Функции

Связанные темы