基于.Net6使用YoloV8的分割模型

前言

在目标检测一文中,我们学习了如何处理Onnx模型,并的到目标检测结果,在此基础上,本文实现基于.Net平台的实例分割任务。
执行YoloV8的分割任务后可以得到分割.pt模型。由于Python基本不用于工业软件的部署,最终还是希望能在.Net平台使用训练好的模型进行预测。我们可以将.pt文件转换成.onnx格式的网络模型,然后使用Microsoft.ML.OnnxRuntime读取、运行模型进行预测。

预测结果


基于.Net6使用YoloV8的分割模型_第1张图片
基于.Net6使用YoloV8的分割模型_第2张图片
基于.Net6使用YoloV8的分割模型_第3张图片

使用环境

NETFramework

  • .Net6.0

Nuget

  • Microsoft.ML.OnnxRuntime.Gpu (1.15.1)
  • OpenCvSharp4(4.7.0.20230115)
  • OpenCvSharp4.Extensions (4.7.0.20230115)
  • OpenCvSharpExtension (2.0.0.2)

model

测试使用coco128数据集训练生成的模型:
yolov8n-seg.onnx
模型下载地址:yolov8n-seg.onnx

解决方案

基于.Net6使用YoloV8的分割模型_第4张图片

预测结果类

/// 
    /// segment result
    /// 
    public class SegPrediction
    {
        /// 
        /// label
        /// 
        public SegClass? Label { get; init; }

        /// 
        /// Box
        /// 
        public Rect Rectangle { get; init; }

        /// 
        /// score
        /// 
        public float Score { get; set; }

        /// 
        /// orginal mask 32
        /// 
        public Mat Mask { get; set; }

        /// 
        /// rgb mask
        /// 
        public Mat RgbMask { get; set; }
    }

实例分割类

基于.Net6使用YoloV8的分割模型_第5张图片
与Detect任务不同的是,Segment任务的模型会输出两个张量,一个是detect的检测结果,另一个是分割Mask的概率。如下图所示:
基于.Net6使用YoloV8的分割模型_第6张图片
ParseOutput方法主要是解析这两个输出结果。
其中:

output0

张量大小:[1,116,8400],1表示batch,116 = 4 + 80 + 32;4表示预测Box的[x,y,cx,cy],80是80类的预测置信度,32是mask的大小。

output1

张量大小:[1,32,160,160],输出的是32张160*160的Mat。

将两个输出结果糅合在一起,即得到了预测结果。

你可能感兴趣的:(YOLO,计算机视觉,深度学习)