导出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检测器元数据inputImageSize
,anchorBoxes
,finalActivationSize
得到的MATLAB工作空间。以下代码是工作流的MATLAB实现,您必须将其转换为您选择的框架的等效代码。
预处理输入图像
预处理用于推断的图像。该图像必须为RGB图像,且必须调整为网络输入图像大小,其像素值必须在区间[0 1]内。
I = imread(“highway.png”);resizei = imresize(I,inputImageSize(1:2));rescaledI = rescale(resizedI);
传递输入并运行ONNX模型
在您选择的深度学习框架中运行ONNX模型,并将预处理过的图像作为导入的ONNX模型的输入。
从ONNX模型的输出中提取预测
该模型预测如下:
在联合(IoU)与地面真相盒子的交叉
x
,y
,w
,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) 1为colIdx=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);结束