主要内容

导出YOLO v2对象检测器到ONNX

这个示例演示了如何将YOLO v2对象检测网络导出到ONNX™(Open Neural network Exchange)模型格式。导出YOLO v2网络后,可以将该网络导入到其他深度学习框架中进行推理。这个示例还展示了使用导入的ONNX模型执行推断时可以遵循的工作流。

导出YOLO v2网络

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

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

输入=负载(“yolov2VehicleDetector.mat”);网= input.detector.Network;

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

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

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

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

anchorBoxes = input.detector.AnchorBoxes;

利用,得到输入网络中最后一个卷积层的激活大小analyzeNetwork函数。

analyzeNetwork(净);

finalActivationSize = [16 16 24];

导出到ONNX模型格式

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

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

exportONNXNetwork函数映射yolov2TransformLayeryolov2OutputLayer在YOLO v2网络中输入基本ONNX算子和身份算子。导出网络后,可以导入yolov2.onnx文件到任何支持ONNX导入的深度学习框架。金宝app

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

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

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

预处理输入图像

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

我= imread (“highway.png”);resizedI = imresize(我inputImageSize (1:2));rescaledI =重新调节(resizedI);

输入并运行ONNX模型

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

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

该模型预测如下:

  • 与地面真值框相交于联合(IoU)

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

  • 每个锚盒的类概率

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

  • numAnchors为锚箱的数量。

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

  • predictionsPerAnchor输出预测的形式为[借据,x, y; w; h类概率].

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

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

  • feature map中的第四和第五行包含了对每个锚框的宽度和高度的预测。

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

计算最终的检测

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

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

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

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

  • 执行nonmaximum抑制。

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

(bboxes、分数、标签)= yolov2PostProcess (featureMap、inputImageSize finalActivationsSize, anchorBoxes);

显示检测结果

Idisp = insertObjectAnnotation (resizedI,“矩形”bboxes,分数);图imshow (Idisp)

参考文献

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

后处理功能

函数(bboxes、分数、标签)= 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、大小(predVal, 1), []);%根据重新排列的预测值计算对象置信度。[confScore, idx] = computeObjectScore (predVal);获得具有高目标置信度分数的预测。[bboxPred, scorePred classPred] = selectMaximumPredictions (confScore, idx predVal);要得到最终的检测,执行重叠阈值为0.5的非最大抑制。(bboxes、分数、标签)= selectStrongestBboxMulticlass (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(大小(xyPred 1) +大小(whPred, 1),大小(锚,1),大小(xyPred, 3),“喜欢”, xyPred);rowIdx = 0: finalActivationsSize (1,1) 1colIdx=0:finalActivationsSize(1,2)-1 ind = rowIdx*finalActivationsSize(1,2)+colIdx+1;anchorIdx = 1:大小(锚盒,1)%计算关于图像的中心。cx = (xyPred(1,anchorIdx,ind)+colIdx)* scaleFactor(1,2);cy = (xyPred(2,anchorIdx,ind)+rowIdx)* scaleFactor(1,1);%计算图像的宽度和高度。bw = whPred(1,主播x,ind)*主播(主播x,1);bh = whPred(2,锚框,ind)*锚框(锚框,2);bBoxes (1 anchorIdx印第安纳州)= (cx-bw / 2);bBoxes (2 anchorIdx印第安纳州)= (cy-bh / 2);bBoxes (3 anchorIdx印第安纳州)= bw;bBoxes (4 anchorIdx印第安纳州)=黑洞;结束结束结束结束
函数[confScore,idx] = computeObjectScore(predVal) iouPred = predVal(5,:);probPred = predVal(6:最后,);[imax, idx] = max (probPred [], 1);confScore = iouPred。* imax;结束
函数[bboxPred, scorePred classPred] = selectMaximumPredictions (confScore、idx predVal)%指定置信度阈值。>= 0.5;%获得大于等于0.5的置信度分数。scorePred = confScore (:, confScoreId);获取置信度大于的预测的类id%或等于0.5。classPred = idx (:, confScoreId);获得具有置信度分数的预测的边界框参数大于或等于0.5的%。: bboxesXYWH = predVal (1:4);bboxPred = bboxesXYWH (:, confScoreId);结束