学习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.OnnxRuntime+OpenCvSharp+YOLO5的源码,调整模型预测结果的后处理函数及坐标变换函数逻辑如下:

csharp 复制代码
public (int x, int y, int w, int h) ScaleCoordinatesOfYolo26(
    float xl, float yl, float xr, float yr,
    int originalWidth, int originalHeight,
    int inputSize = 640)
{
    // 计算缩放比例
    float scale = Math.Min((float)inputSize / originalWidth, (float)inputSize / originalHeight);

    // 计算填充尺寸
    int padX = (int)((inputSize - originalWidth * scale) / 2);
    int padY = (int)((inputSize - originalHeight * scale) / 2);

    // 映射回原始图像坐标            
    int scaledX = (int)((xl - padX) / scale);
    int scaledY = (int)((yl - padY) / scale);
    int scaledW = (int)((xr-xl) / scale);
    int scaledH = (int)((yr-yl) / scale);

    return (scaledX, scaledY, scaledW, scaledH);
}

public List<DetectionResult> ProcessDetectionsOfYolo26(
   DenseTensor<float> output,
   int originalWidth,
   int originalHeight,
   float confidenceThreshold = 0.8f)
{
    var detections = new List<DetectionResult>();

    // 解析输出张量 (1, 300, 6) - 假设80个类别
    int numDetections = output.Dimensions[1];

    for (int i = 0; i < numDetections; i++)
    {
        // 提取对象置信度
        float objectConfidence = output[0,i,4];

        // 获取最高概率类别
        int classId = Convert.ToInt32(output[0, i, 5]);

        if (objectConfidence > confidenceThreshold)
        {
            // 提取边界框坐标
            float pXl = output[0, i, 0];
            float pYl = output[0, i, 1];
            float pXr = output[0, i, 2];
            float pYr = output[0, i, 3];

            // 映射回原始图像坐标
            var (x, y, w, h) = ScaleCoordinatesOfYolo26(
                pXl, pYl, pXr, pYr,
                originalWidth, originalHeight);

            // 创建边界框
            Rect boundingBox = new Rect(x, y, w, h);

            detections.Add(new DetectionResult
            {
                ClassId = classId,
                Label = CocoLabels[classId],
                Confidence = objectConfidence,
                BoundingBox = boundingBox,
                OriginalCoordinates = (x, y, w, h)
            });
        }
    }

    return detections;
}

  最后是程序运行效果,如下图所示:

参考文献:

1https://docs.ultralytics.com/zh/models/yolo26/

相关推荐
YOLO数据集集合4 小时前
大模型融合YOLO铁路要素缺陷分析系统 | 铁路缺陷检测 YOLO DeepSeek 大语言模型 智能巡检 9141期
人工智能·yolo·目标检测·语言模型·铁路缺陷·轨道缺陷
晚风醉蝶9 小时前
YOLO11图标点选验证码识别实战
python·目标检测·验证码识别·yolo11
xailorliu1 天前
SLIC_超像素算法
c++·opencv·目标检测·机器学习·计算机视觉
YOLO数据集集合1 天前
无人机视角行人与车辆检测数据集 | 无人机航拍 行人检测 车辆检测 智慧城市 公共安全9140期
人工智能·目标检测·无人机·智慧城市·车辆识别·无人机视角
YOLO_DATA1 天前
YOLO27防震锤缺陷检测数据集 防震锤数据集 1000张 防震锤 带标注 voc yolo 2 类 目标检测
人工智能·深度学习·yolo·目标检测·计算机视觉·数据集·无人机
企业数字化笔记1 天前
视觉智能体怎么选技术?目标检测、跟踪、分割、OpenCV和FFmpeg的职责划分
opencv·目标检测·ffmpeg
YOLO数据集集合1 天前
红外多类型无人机检测数据集 | 红外检测 无人机识别 多类型分类 低空安防 反无人机 9139期
yolo·目标检测·分类·数据挖掘·无人机·无人机检测·红外无人机
YOLO数据集集合2 天前
无人机桥梁损伤目标检测数据集 | 桥梁损伤 无人机巡检 结构健康监测 多类别检测9135期
人工智能·目标检测·无人机
YOLO数据集集合2 天前
电力设备目标检测数据集 | 电力设备 变电站巡检 部件识别 目标检测 YOLO格式 9127期
人工智能·yolo·目标检测·计算机视觉·目标跟踪·电力设备
YOLO数据集集合2 天前
水表刻度识别数据集 | 水表读数 指针识别 关键点检测 字符识别 OCR9138期
目标检测·视觉检测·关键点检测·指针识别·水表刻度