学习C#调用Microsoft.ML.OnnxRuntime+OpenCvSharp+YOLO26进行目标检测的基本用法

学习C#调用Microsoft.ML.OnnxRuntime+OpenCvSharp+YOLO26进行目标检测的基本用法 使用ultralytics库将YOLO26模型文件yolo26m.pt转换为onnx格式的模型文件然后调用Microsoft.ML.OnnxRuntime获取模型信息如下图所示yolo26m.onnx模型的输入形状与yolo5相同但输出形状变成了[1,300,6],第一维还是代表一次处理的图片数量第二维为预测框的总数量也即每张图片的预测结果数量第三维为每个预测框的特征向量长度由于YOLO26采用端到端无NMS推理直接输出最终检测结果因此第三维的长度急剧减少主要包括x1, y1, x2, y2, confidence, class_id等6个值前4个值为预测框的左上角和右下角坐标confidence为置信度分数class_id为COCO类别的索引值。基于之前调用Microsoft.ML.OnnxRuntimeOpenCvSharpYOLO5的源码调整模型预测结果的后处理函数及坐标变换函数逻辑如下public(intx,inty,intw,inth)ScaleCoordinatesOfYolo26(floatxl,floatyl,floatxr,floatyr,intoriginalWidth,intoriginalHeight,intinputSize640){// 计算缩放比例floatscaleMath.Min((float)inputSize/originalWidth,(float)inputSize/originalHeight);// 计算填充尺寸intpadX(int)((inputSize-originalWidth*scale)/2);intpadY(int)((inputSize-originalHeight*scale)/2);// 映射回原始图像坐标intscaledX(int)((xl-padX)/scale);intscaledY(int)((yl-padY)/scale);intscaledW(int)((xr-xl)/scale);intscaledH(int)((yr-yl)/scale);return(scaledX,scaledY,scaledW,scaledH);}publicListDetectionResultProcessDetectionsOfYolo26(DenseTensorfloatoutput,intoriginalWidth,intoriginalHeight,floatconfidenceThreshold0.8f){vardetectionsnewListDetectionResult();// 解析输出张量 (1, 300, 6) - 假设80个类别intnumDetectionsoutput.Dimensions[1];for(inti0;inumDetections;i){// 提取对象置信度floatobjectConfidenceoutput[0,i,4];// 获取最高概率类别intclassIdConvert.ToInt32(output[0,i,5]);if(objectConfidenceconfidenceThreshold){// 提取边界框坐标floatpXloutput[0,i,0];floatpYloutput[0,i,1];floatpXroutput[0,i,2];floatpYroutput[0,i,3];// 映射回原始图像坐标var(x,y,w,h)ScaleCoordinatesOfYolo26(pXl,pYl,pXr,pYr,originalWidth,originalHeight);// 创建边界框RectboundingBoxnewRect(x,y,w,h);detections.Add(newDetectionResult{ClassIdclassId,LabelCocoLabels[classId],ConfidenceobjectConfidence,BoundingBoxboundingBox,OriginalCoordinates(x,y,w,h)});}}returndetections;}最后是程序运行效果如下图所示参考文献[1]https://docs.ultralytics.com/zh/models/yolo26/