В этом примере показано, как экспортировать сеть обнаружения объектов YOLO v2 в формат модели ONNX™ (Open Neural Network Exchange). После экспорта сети YOLO v2 можно импортировать сеть в другие платформы глубокого обучения для вывода. В этом примере также представлен рабочий процесс, которому можно следовать для выполнения вывода с использованием импортированной модели ONNX.
Экспортируйте сеть обнаружения в 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];
Экспорт сети обнаружения объектов 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. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки.
После завершения экспорта можно импортировать модель 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.
Модель предсказывает следующее:
Пересечение через соединение (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