В этом примере показано, как экспортировать сеть обнаружения объектов 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
функция. Укажите имя файла следующим yolov2.onnx
. Функция сохраняет экспортированный файл ONNX в текущую рабочую папку.
filename = 'yolov2.onnx';
exportONNXNetwork(net,filename);
The exportONNXNetwork
функция сопоставляет yolov2TransformLayer
(Computer Vision Toolbox) и yolov2OutputLayer
(Computer Vision Toolbox) во входной сети YOLO v2 к базовому оператору ONNX и тождествам, соответственно. После экспорта сети можно импортировать yolov2.onnx
файл в любую среду глубокого обучения, которая поддерживает импорт ONNX.
Использование exportONNXNetwork
, требует пакета поддержки Deep Learning Toolbox™ и Deep Learning Toolbox Converter для формата модели 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
-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