学习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/

相关推荐
梦想三三15 小时前
YOLOv5 口罩目标检测实战(一):项目整体介绍与数据准备
人工智能·yolo·目标检测
江畔柳前堤2 天前
重新理解“方差“:从统计学到LLM的七个维度
人工智能·深度学习·神经网络·目标检测·机器学习·自然语言处理·语音识别
探物 AI2 天前
YOLO 目标检测中的特征是如何流动的
yolo·目标检测·目标跟踪
FriendshipT4 天前
Ultralytics:简要解读YOLOv8 → YOLO11 → YOLO26网络架构
人工智能·pytorch·python·深度学习·yolo·目标检测
jay神4 天前
基于YOLOv8行人车辆检测系统
深度学习·yolo·目标检测·计算机视觉·毕业设计
学到头秃的suhian5 天前
Super Mamba feature enhancement framework for small object detection
目标检测
m沐沐6 天前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer
生命涌现6 天前
生命涌现的小龙虾技能之【Human Pose Recognition Skill | 人体姿态识别技能】简介
人工智能·目标检测·计算机视觉·多模态大模型·openclaw小龙虾技能
深度学习lover6 天前
<数据集>yolo 小麦麦穗识别<目标检测>
人工智能·yolo·目标检测·计算机视觉·数据集·小麦麦穗识别
动物园猫7 天前
人群密度目标检测数据集:8,000张图像 | 目标检测
人工智能·目标检测·计算机视觉