C#调用yolov5模型转化onnx模型实现C#模型部署

本文介绍了如何使用C#语言结合yolov5进行目标检测,包括模型训练、转换为ONNX格式以及在C#项目中集成Yolov5Net进行实时预测的过程。
摘要由CSDN通过智能技术生成

一、yolov5是深度学习的一个目标检测算法,具有很强的实现能力。本篇文章主要是讲如何用C#读取yolov5模型做目标检测

二、首先C#+yolov5肯定是要训练模型

         1.选用yolov5-7.0

          2.有几个包需要注意  除此之外的其他包都可pip

                  opencv-4.7.0

                  torch-1.13.0  torchaudio-0.13.0  torchvision-0.14.0   cuda-11.7  cudnn只要和cuda对应就行cudnn-windows-x86_64-8.7.0.84_cuda11-archive

               注意torch我装的是cuda版本的调用的是gpu 所以如果你要用gpu需要配置cuda和cudnn

      三、至于yolo的训练不用我多说了吧

             配置好环境然后标注训练,就行,如果你的设备不行,并且电脑的内存还够看那就可以用内存跑   用pycharm打开终端 然后输入 :

    

python   train.py --cache

   回车就行。

有些人打开终端可能是这个问题,

点击加号旁边的下标,然后选择cmd Prompt就行了,但是这需要确保你的环境导入正确

如果有环境的问题可以再评论区或者私信我,我出一期针对pycharm关联anaconda的文章

yolov5-7.0训练完成后直接用export.py 文件就可以转化onnx了

转化好的onnx模型用Netron打开查看一些输入和输出 确保能正常调用

点击images查看  这样就是转化成功了

四、对于经常玩深度的人来说前面的可以忽略了,下面开始yolov5net+C#

      首先我们去官网上下载  yolov5-net源码文件

     然后用vs2022打开.sln文件,最好是vs2022

    

     点开modls文件夹里的P5文件

       

改类别  这个类别要和源码类别的维度相同才行,比如说你有5个类别那你就得在你的类别上加5就是10

这个地方是你改的类别名

上面那个output0是你onnx模型输出,注意这个必须要对应

因为Yolov5Net.Scorer本身是个库类  所以你更改后需要重新生成dll库 这个库会出现再你的src\Yolov5Net.Scorer\bin\Debug\netstandard2.0这个路径中

 你还需要下载几个包再NuGet工具包里下载

C# 项目编译环境为>=.NET5.0,案例使用的是.NET6.0
需要安装以下库:
Microsoft.ML.OnnxRuntime 
OpenCvSharp4.Extensions 
OpenCvSharp4.Windows 

2、打开这个文件Yolov5Net.App

               

     然后更改

这些就可以了

2、在创建一个winfrem net6.0
然后导入:Yolov5Net.Scorer.dll

生成的dll库放入你编写的桌面应用程序的bin/debug里

打开form1代码

写入注意需要把你转化的的模型放到你的winform控件的bin/debug中

using OpenCvSharp;
using Yolov5Net.Scorer;
using Yolov5Net.Scorer.Models;
using Point = OpenCvSharp.Point;

namespace YOLO_WinformDemo
{
    /// <summary>
    /// 此项目使用.NET6编译
    /// </summary>


    public partial class Form1 : Form
    {
        YoloScorer<YoloCocoP5Model> scorer;

        string filePath = "";
        public Form1()
        {
            InitializeComponent();

            //加载模型地址
            scorer = new YoloScorer<YoloCocoP5Model>(Application.StartupPath + "bestnewutd8.onnx");

        }

        private void btn_selectFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFile = new OpenFileDialog();
            if (openFile.ShowDialog() == DialogResult.OK)
            {
                filePath = openFile.FileName;
                using var image = Image.FromFile(openFile.FileName);

                picbox_Display.BackgroundImage = AddInfoToImage(image);


            }

        }
        /// </summary>
        /// <param name="inputImage"></param>
        /// <returns></returns>
        public Image AddInfoToImage(Image inputImage)
        {

            DateTime start = DateTime.Now;
            List<YoloPrediction> predictions = scorer.Predict(inputImage);

            if (predictions.Count == 0)
            {

                return inputImage;

            }
            else
            {

                Mat inputMat = Cv2.ImRead(filePath, ImreadModes.Color);
                foreach (YoloPrediction prediction in predictions)
                {

                    Point p1 = new Point(prediction.Rectangle.X, prediction.Rectangle.Y);//矩形左上顶点
                    Point p2 = new Point(prediction.Rectangle.X + prediction.Rectangle.Width, prediction.Rectangle.Y + prediction.Rectangle.Height);//矩形右下顶点
                    Point p3 = new Point(prediction.Rectangle.X, prediction.Rectangle.Y - 60);
                    Scalar scalar = new Scalar(0, 0, 255);
                    Cv2.Rectangle(inputMat, p1, p2, scalar, 7);
                    Cv2.PutText(inputMat, prediction.Label.Name + " " + Math.Round(prediction.Score, 2), p3, HersheyFonts.HersheyDuplex, 2, scalar, 4);

                }

                DateTime end = DateTime.Now;
                label1.Text = "耗时:" + (end - start).TotalMilliseconds.ToString();

                return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);


            }

        }






    }
}

然后就可以了,

有问题评论区提问

Yolov5 是一个基于 Pytorch 的目标检测模型,将其转换为 ONNX 格式可以方便地在各种平台上部署。如果你想在 C# 中使用 ONNX 格式的 Yolov5 分类模型,可以按照以下步骤进行: 1. 使用 Pytorch 将 Yolov5 模型转换为 ONNX 格式。可以使用以下命令: ``` python models/export.py --weights yolov5s.pt --img-size 640 --batch-size 1 ``` 其中,`yolov5s.pt` 是 Yolov5 模型的权重文件,`--img-size` 是输入图片的尺寸,`--batch-size` 是批量处理的图片数量。执行该命令后,会在 `models` 文件夹下生成一个 `yolov5s.onnx` 文件,即转换后的模型。 2. 在 C# 中使用 ONNXRuntime 运行 Yolov5 模型。可以使用以下代码: ```csharp using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; // 创建 ONNXRuntime 执行器 var options = new SessionOptions(); var session = new InferenceSession("models/yolov5s.onnx", options); // 预处理输入图片 var image = Image.Load<Rgb24>("test.jpg"); var resized = image.Resize(new ResizeOptions { Size = new Size(640, 640), Mode = ResizeMode.Max }); var buffer = resized.SavePixelData(); // 将输入图片转换为 Tensor var tensor = new DenseTensor<float>(new[] { 1, 3, 640, 640 }); for (int i = 0; i < buffer.Length; i += 3) { tensor[0, 0, i / 3 % 640, i / 3 / 640] = buffer[i]; tensor[0, 1, i / 3 % 640, i / 3 / 640] = buffer[i + 1]; tensor[0, 2, i / 3 % 640, i / 3 / 640] = buffer[i + 2]; } // 执行模型推理 var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("input", tensor) }; var outputs = session.Run(inputs); var result = outputs.FirstOrDefault()?.AsTensor<float>().ToArray(); // 处理模型输出 // TODO ``` 在上述代码中,`test.jpg` 是输入图片的路径,`options` 是 ONNXRuntime 的配置选项,`session` 是 ONNXRuntime 的执行器,`tensor` 是将输入图片转换为的 Tensor,`inputs` 是执行模型推理时的输入参数,`outputs` 是执行模型推理后的输出结果。你需要根据具体的 Yolov5 模型结构和输出结果进行相应的处理。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

该醒醒了~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值