首页 > 编程语言 >机器视觉-使用C#进行Yolov8推理

机器视觉-使用C#进行Yolov8推理

时间:2024-02-17 19:22:57浏览次数:31  
标签:C# yolov8 WinFormsApp1 YoloV8 source var using Yolov8 推理

Windows 窗体应用可以使用一些现成的C#类库实现yolov8的predict功能, 本文使用https://github.com/dme-compunet/YoloV8 项目的nuget包.
集成方法非常简单, 但发现这种方式预测准确度下降了很多, 看来还是使用Python API预测更好一些.

GPU版环境准备

  1. 选定 Onnx runtime 版本, https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements
  2. 参考Onnx runtime 版本, 安装兼容的 CUDA 版本, 推荐 v11.x
  3. 参考Onnx runtime 版本, 安装兼容的 cuDNN 版本
  4. 如果需要检测视频, 需要下载 FFMPEG, 安装后需要将 FFmpeg 和 ffprobe 加到Path环境变量中.
  5. nuget 安装 Microsoft.ML.OnnxRuntime.Gpu
  6. nuget 安装 YoloV8.Gpu

CPU版环境准备

  1. nuget 安装 Microsoft.ML.OnnxRuntime
  2. nuget 安装 YoloV8

Onnx 模型导出

Onnx runtime 当前仅支持 Opset 15版, 所以导出时需要增加 --Opset=15 参数.

yolo export model=yolov8m.pt format=onnx opset=15  
yolo export model=yolov8m.pt format=onnx opset=15 simplify=False dynamic=False imgsz=640

代码

使用 yolo.exe 推理的代码:

yolo predict model=D:\my_workspace\py_code\yolo8\Scripts\yolov8m.pt source=D:\my_workspace\source\opencv\yolov8\WinFormsApp1\bus.jpg   
yolo predict model=D:\my_workspace\source\opencv\yolov8\WinFormsApp1\yolov8m.onnx  source=D:\my_workspace\source\opencv\yolov8\WinFormsApp1\bus.jpg  

使用 OnnxRuntime 的 C# 代码:

using Compunet.YoloV8;
using Compunet.YoloV8.Data;
using Compunet.YoloV8.Metadata;
using Compunet.YoloV8.Plotting;
using SixLabors.ImageSharp;
using System.Diagnostics;

namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var imageFile = "D:\\my_workspace\\source\\opencv\\yolov8\\WinFormsApp1\\bus.jpg";
            var newImageFile = "D:\\my_workspace\\source\\opencv\\yolov8\\WinFormsApp1\\bus_onnx_csharp.jpg";
            var modelFile = "D:\\my_workspace\\source\\opencv\\yolov8\\WinFormsApp1\\yolov8m.onnx";

            //创建模型并预测
            using var predictor = new YoloV8(modelFile);
            DetectionResult result = predictor.Detect(imageFile);

            //展现预测结果对象中的信息
            foreach (BoundingBox box in result.Boxes)
            {
                SixLabors.ImageSharp.Rectangle rect = box.Bounds;
                var confidence = box.Confidence;
                YoloV8Class yoloV8Class = box.Class;
                Debug.WriteLine("====================");
                Debug.WriteLine(yoloV8Class.Id);
                Debug.WriteLine(yoloV8Class.Name);
                Debug.WriteLine(confidence);
                Debug.WriteLine(rect);
            }

            //plot label
            using var image = SixLabors.ImageSharp.Image.Load(imageFile);
            using var ploted = result.PlotImage(image);
            ploted.Save(newImageFile);
        }
    }
}

准确度对比

Yolo使用原生PT预测准确度和Yolo使用Onnx相当, 但 OnnxRuntime+C#准确度下降很多. 下面都是使用yolov8m模型的结果,

更详细的安装和使用说明可参考下面.net 项目

https://github.com/dme-compunet/YoloV8
https://github.com/sstainba/Yolov8.Net
https://github.com/NickSwardh/YoloDotNet

标签:C#,yolov8,WinFormsApp1,YoloV8,source,var,using,Yolov8,推理
From: https://www.cnblogs.com/harrychinese/p/18018235

相关文章

  • P5155 [USACO18DEC] Balance Beam P
    假设有一个长度为\(L\)的木块。定义\(f_i\)从\(i\)走到\(L\)的概率,有\(f_i=\dfrac{f_{i+1}+f_{i-1}}{2}\)。由\(f_1=0,f_L=1\)可以递推得出\(f_i=\dfrac{i}{L}\)。若一个节点移动的期望收益比当前点停止的收益低,则设这个点为关键点。从\(i\)出发开始移动,期望收益......
  • Skywalking-Aop Docker单机环境搭建
    本次搭建是基于MySQL进行持久化,因此需要提前准备好一个MySQL容器(MySQL容器部署略过)。如有错误还请指正。OAP服务搭建拉取skywalking-oap镜像dockerpullapache/skywalking-oap-server:8.9.0接下来可以进行一个简单的启动,目的是拷贝出config目录到宿主机后进行挂载(docke......
  • C++——数据类型笔记
    在C++编程中,了解各类数据类型也是至关重要的。下面我会总结一下C++中的数据类型,包括基本类型,符合类型和自定义类型。方便自己整理和理解。1,基本类型C++中的基本类型是构建其他数据类型的基础,常见的基础类型包括整型,浮点型,字符型和布尔型:整型:用于表示整数,如int、short......
  • Qt实用技巧:QCustomPlot做北斗GPS显示绝对位置运动轨迹和相对位置运动轨迹图的时,使图按
    需求  使用QCustomPlot绘制多个目标的北斗运行轨迹图,包括累计绝对位置图和记录时刻的相对位置图。  当前绘制存在问题:    交付客户前,公司内部自测流程发现的问题。  实际预期效果为:   原因  QCustomPlot加入数据是按照x轴排列,也可以按照y轴排列,使用图层......
  • 配置springcloud 网关gateway 转发websocket请求
    网关是整个项目的统一入口这是直接访问消息服务的请求路径端口号是20007WebSocketService.init("ws://127.0.0.1:20007/ws/"+用户id)显然这样是不符合微服务的方案,所有请求必须经过网关处理,转发到各个服务之中所以我们需要在网关中的yml或者nacos中添加以下配置spring:......
  • python的xlrd读取Excel数据失败: raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_form
    使用xlrd读取Excel的xlsx格式表格里的数据,读取失败,报错:raiseXLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+';notsupported')xlrd.biffh.XLRDError:Excelxlsxfile;notsupported原因,xlrd为2.0.1版本,更新版本后,xlrd不支持xlsx格式数据的读取了,果断减低版本先卸载2.0......
  • Codeforces 解题报告(202402)
    CodeforcesRound926D-SashaandaWalkintheCitydp,主要难点在于设状态。发现子树内一旦存在一个点,到当前子树的根节点路径上有两个危险点,那么除了那条链所属的子树,其他的点就都不能选了。所以把这个性质放进状态,设\(f_{u,0/1}\)表示以\(u\)为根的子树内,是否存在一......
  • CF1540E Tasty Dishes
    Description初始有\(n\)个数\(a_i\),以及若干条有向边\((u_i,v_i)\),保证\(u_i<v_i\)。一轮操作会形如下面两个过程:首先\(\foralli,a_i:=\max(a_i,ia_i)\)。然后\(\foralli,a'_i:=a_i+\sum\limits_{(i,j)\inE}\max(a_j,0)\),最后\(\foralli,a_i:=a'_i\)。......
  • 华硕推出首款ROG NUC迷你主机:酷睿Ultra+RTX 4070
    华硕今日推出了首款ROGNUC迷你主机,设计十分小巧,并且配有标志性的ROGRGB徽标。据了解,新款迷你主机最高可选英特尔酷睿Ultra9185H处理器和英伟达RTX4060/4070显卡。同时支持双通道DDR5内存,速度达5600MT/s,最大容量128GB。这款主机附带一个支架,可以水平或垂直放置,采用高性能......
  • 三维偏序 cdq
    Describe:有\(n\)个元素,第\(i\)个元素有\(a_i、b_i、c_i\)三个属性,设\(f(i)\)表示满足\(a_j\leqa_i\)且\(b_j\leqb_i\)且\(c_j\leqc_i\)的\(j\)的数量。对于\(d\in\left[0,n\right)\),求\(f(i)=d\)的\(i\)的数量。Solution:终于理解CDQ。首先......