主要内容

导出YOLO v2对象检测器到ONNX

这个例子展示了如何将YOLO v2对象检测网络导出为ONNX™(开放神经网络交换)模型格式。导出YOLO v2网络后,可以将网络导入到其他深度学习框架中进行推理。此示例还展示了使用导入的ONNX模型执行推理时可以遵循的工作流。

导出YOLO v2网络

导出检测网络到ONNX,收集生成对象检测结果所需的元数据。

首先,将预先训练好的YOLO v2对象检测器加载到工作区中。

输入=负载(“yolov2VehicleDetector.mat”);net = input.detect . network;

接下来,获取用于推理的YOLO v2检测器元数据。检测器元数据包括网络输入图像大小、锚框和最后一层卷积的激活大小。

从输入YOLO v2网络读取网络输入图像大小。

inputImageSize = net.Layers(1,1).InputSize;

从输入检测器读取用于训练的锚框。

anchorBoxes = input.detect . anchorBoxes;

函数获取输入网络中最后一个卷积层的激活大小analyzeNetwork函数。

analyzeNetwork(净);

finalActivationSize = [16 16 24];

导出到ONNX模型格式

将YOLO v2对象检测网络导出为ONNX格式文件exportONNXNetwork(深度学习工具箱)函数。指定文件名为yolov2.onnx.该功能将导出的ONNX文件保存到当前工作文件夹中。

文件名=“yolov2.onnx”;exportONNXNetwork(净、文件名);

exportONNXNetwork函数映射yolov2TransformLayer而且yolov2OutputLayer在输入YOLO v2网络中分别输入基本ONNX算子和标识算子。导出网络后,可以导入yolov2.onnx文件导入到任何支持ONNX导入的深度学习框架。

使用exportONNXNetwork,需要深度学习工具箱™和ONNX模型格式的深度学习工具箱转换器支持包。如果没有安装此支持包,则该函数将提供下载链接。

使用导出的YOLO v2网络进行对象检测

导出完成后,您可以将ONNX模型导入到任何深度学习框架中,并使用以下工作流执行对象检测。除了ONNX网络,这个工作流还需要YOLO v2检测器元数据inputImageSizeanchorBoxes,finalActivationSize得到的MATLAB工作空间。以下代码是工作流的MATLAB实现,您必须将其转换为您选择的框架的等效代码。

预处理输入图像

预处理用于推断的图像。该图像必须为RGB图像,且必须调整为网络输入图像大小,其像素值必须在区间[0 1]内。

I = imread(“highway.png”);resizei = imresize(I,inputImageSize(1:2));rescaledI = rescale(resizedI);

传递输入并运行ONNX模型

在您选择的深度学习框架中运行ONNX模型,并将预处理过的图像作为导入的ONNX模型的输入。

从ONNX模型的输出中提取预测

该模型预测如下:

  • 在联合(IoU)与地面真相盒子的交叉

  • xyw,h每个锚框的包围框参数

  • 每个锚框的类概率

ONNX模型的输出是一个包含预测和大小的特征图predictionsPerAnchor——- - - - - -numAnchors——- - - - - -numGrids

  • numAnchors是锚盒的数量。

  • numGrids是作为最后一个卷积层的高度和宽度的乘积计算的网格数。

  • predictionsPerAnchor是否为[]表格中的输出预测借据,x, y; w; h类概率]。

  • 特征图的第一行包含每个锚框的IoU预测。

  • 特征图的第二行和第三行包含每个锚框的质心坐标(x,y)的预测。

  • 特征图中的第四行和第五行包含每个锚框的宽度和高度的预测。

  • 特征图的第六行包含每个锚框的类概率的预测。

计算最终检测

要计算预处理测试图像的最终检测,必须:

  • 根据网络输入层的大小重新缩放边界框参数。

  • 根据预测计算对象置信度分数。

  • 获得具有较高对象置信度分数的预测。

  • 执行非最大抑制。

作为实现指南,使用的代码yolov2PostProcess函数后处理功能

[bboxes,scores,labels] = yolov2PostProcess(featureMap,inputImageSize,finalActivationsSize,anchorBoxes);

显示检测结果

Idisp = insertObjectAnnotation(重新大小的i,“矩形”bboxes,分数);图imshow (Idisp)

参考文献

雷蒙,约瑟夫和阿里·法哈蒂。“YOLO9000:更好、更快、更强。”2017年IEEE计算机视觉与模式识别会议(CVPR), 6517 - 25所示。檀香山,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。

后处理功能

函数[bboxes,scores,labels] = yolov2PostProcess(featureMap,inputImageSize,finalActivationsSize,anchorBoxes)从特征图中提取预测值。iouPred = featureMap(1,:,:);xyPred = featureMap(2:3,:,:);whPred = featureMap(4:5,:,:);probPred = featureMap(6,:,:);重新缩放包围框参数。bBoxes = rescaleBbox(xyPred,whPred,anchorBoxes,finalActivationsSize,inputImageSize);将特征图重新排列为二维矩阵,以便高效处理。predVal = [bBoxes;iouPred;probPred];predVal =重塑(predVal,size(predVal,1),[]);根据重新排列的预测值计算对象置信度分数。[confScore,idx] = computeObjectScore(predVal);获得具有高对象置信度分数的预测。[bboxPred,scorePred,classPred] = selectmaximumforecasts (confScore,idx,predVal);为了获得最终检测,执行重叠阈值为0.5的非最大抑制。[bboxes,scores,labels] = selectstronggestbboxmulticlass (bboxPred', scorePred', classPred',“RatioType”“联盟”“OverlapThreshold”, 0.5);结束
函数bBoxes = rescaleBbox(xyPred,whPred,anchorBoxes,finalActivationsSize,inputImageSize)要重新缩放边界框参数,请使用网络参数inputImageSize和finalActivationSize计算缩放因子。scaleY = inputImageSize(1)/finalActivationsSize(1);scaleX = inputImageSize(2)/finalActivationsSize(2);scaleFactor = [scaleY scaleX];bBoxes = 0 (size(xyPred,1)+size(whPred,1),size(anchors,1),size(xyPred,3),“喜欢”, xyPred);rowIdx = 0: finalActivationsSize (1,1) 1colIdx=0:finalActivationsSize(1,2)-1 ind = rowIdx*finalActivationsSize(1,2)+colIdx+1;anchorIdx = 1: size(anchorBoxes,1)计算关于图像的中心。cx = (xyPred(1,anchorIdx,ind)+colIdx)* scaleFactor(1,2);cy = (xyPred(2,anchorIdx,ind)+rowIdx)* scaleFactor(1,1);计算相对于图像的宽度和高度。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;结束结束结束结束
函数[confScore,idx] = computeObjectScore(prevval) iouPred = prevval (5,:);probPred = preval (6:end,:);[imax,idx] = max(probPred,[],1);confScore = iouPred.*imax;结束
函数[bboxPred,scorePred,classPred] = selectmaximumforecasts (confScore,idx,predVal)指定置信度分数的阈值。confScoreId = confScore >= 0.5;%获得大于或等于0.5的置信度分数。scorePred = confScore(:,confScoreId);获取置信度得分大于的预测类别id%或等于0.5。classPred = idx(:,confScoreId);获得带有置信度分数的预测的边界框参数%大于或等于0.5。bboxesXYWH = predVal(1:4,:);bboxPred = bboxesXYWH(:,confScoreId);结束
Baidu
map