前言
在目标检测一文中,我们学习了如何处理Onnx模型,并的到目标检测结果,在此基础上,本文实现基于.Net平台的实例分割任务。
执行YoloV8的分割任务后可以得到分割.pt模型。由于Python基本不用于工业软件的部署,最终还是希望能在.Net平台使用训练好的模型进行预测。我们可以将.pt文件转换成.onnx格式的网络模型,然后使用Microsoft.ML.OnnxRuntime读取、运行模型进行预测。
预测结果
使用环境
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
解决方案
预测结果类
/// <summary>
/// segment result
/// </summary>
public class SegPrediction
{
/// <summary>
/// label
/// </summary>
public SegClass? Label { get; init; }
/// <summary>
/// Box
/// </summary>
public Rect Rectangle { get; init; }
/// <summary>
/// score
/// </summary>
public float Score { get; set; }
/// <summary>
/// orginal mask 32
/// </summary>
public Mat Mask { get; set; }
/// <summary>
/// rgb mask
/// </summary>
public Mat RgbMask { get; set; }
}
实例分割类
与Detect任务不同的是,Segment任务的模型会输出两个张量,一个是detect的检测结果,另一个是分割Mask的概率。如下图所示:
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。
将两个输出结果糅合在一起,即得到了预测结果。