В этом примере показано, как экспортировать сеть обнаружения объектов 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] 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