C#调用yolov5模型转化onnx模型实现C#模型部署
该醒醒了~ 2024-06-16 17:05:02 阅读 80
一、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); } } }}
然后就可以了,
有问题评论区提问
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。