Экспорт детектора объектов 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 (Deep Learning Toolbox) функция. Укажите имя файла следующим yolov2.onnx. Функция сохраняет экспортированный файл ONNX в текущую рабочую папку.

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

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

Использование exportONNXNetwork, требует пакета поддержки Deep Learning Toolbox™ и Deep Learning Toolbox Converter для формата модели 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-by- numAnchors-by- 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 Conference on Компьютерное Зрение and Pattern Recognition (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