Экспортируйте детектор объектов 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);

exportONNXNetwork функционируйте сопоставляет yolov2TransformLayer и yolov2OutputLayer во входе 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) с основными блоками истинности

  • xYW, и 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] Redmon, Джозеф и Али Фархади. “YOLO9000: Лучше, Быстрее, Более сильный”. На 2 017 Конференциях по 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) = bw;
            bBoxes(4,anchorIdx,ind) = bh;
        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