【C#深度学习之路】如何使用C#实现Yolo5/8/11全尺寸模型的训练和推理

【C#深度学习之路】如何使用C#实现Yolo5/8/11全尺寸模型的训练和推理

本文为原创文章,若需要转载,请注明出处。

原文地址:https://blog.csdn.net/qq_30270773/article/details/144918684

项目对应的Github地址:https://github.com/IntptrMax/YoloSharp

C#深度学习之路专栏地址:https://blog.csdn.net/qq_30270773/category_12829217.html

关注我的Github,可以获取更多资料,请为你感兴趣的项目送上一颗小星星:https://github.com/IntptrMax

另外本人已经在多平台上发现了不做任何修改直接照抄就发布我的文章的盗版行为,还将我的开源免费资源当成付费资源发布的行为,对此表示强烈的不满。这种"盗窃知识"的行为严重损害了开源项目作者的个人利益以及开源共享精神。

项目背景

本人已经在Github及CSDN上连续发布了Yolov5,Yolov8,Yolov11模型的训练及推理的源码及实现方法介绍,这些项目成功实现了Yolo模型在C#平台上的训练。不过仍有一些小伙伴表示项目用起来还是存在一定的困难。因此我将几个项目进行了封装,实现了调用方法的统一,以方便小伙伴们使用。

如果该资料对你有帮助,请在我的Github上送我一颗小星星。该项目的Github链接为https://github.com/IntptrMax/YoloSharp

项目实现

对于单独的Yolov5、Yolov8、Yolov11的实现原理及代码,请参考C#深度学习之路专栏内的相关文章。

建立一个Predictor类,用来统一Yolov5、Yolov5u、Yolov8、Yolov11的调用。其中Yolov5的Detect和Loss与Yolov8、Yolov11有很大的差异。Ultralytics为了将Yolov5统一进模型中,故又提供了Yolov5u模型。Predictor中提供了Train和Predict方法,以方便调用。

调用方法

可以直接从Github或CSDN上下载源码进行编译,生成dll以方便在其他项目中调用。另外还在Nuget中发布了这个包,使用包管理器搜索IntptrMax.YoloSharp,也可以使用.net cli工具拉取

csharp 复制代码
dotnet add package IntptrMax.YoloSharp --version 1.0.0

或者

csharp 复制代码
PM> NuGet\Install-Package IntptrMax.YoloSharp -Version 1.0.0

另外还需要一个环境依赖,仍旧是在Nuget中拉取依赖包。根据使用环境不同,可以选用

libtorch-cpu, libtorch-cuda-12.1, libtorch-cuda-12.1-win-x64 或

libtorch-cuda-12.1-linux-x64 version 2.5.1.0

其中任意一个即可。

环境配置完成后,调用方法如下:

csharp 复制代码
string trainDataPath = @"..\..\..\Assets\coco128"; // Training data path, it should be the same as coco dataset.
string valDataPath = @"..\..\..\Assets\coco128"; // If valDataPath is "", it will use trainDataPath as validation data.
string outputPath = "result";    // Trained model output path.
string preTraindModelPath = @"..\..\..\Assets\PreTrainedModels\yolov8n.bin"; // Pretrained model path.
string predictImagePath = @"..\..\..\Assets\TestImage\zidane.jpg";
int batchSize = 8;
int sortCount = 80;
int epochs = 100;
float predictThreshold = 0.5f;
float iouThreshold = 0.5f;

YoloType yoloType = YoloType.Yolov8;
DeviceType deviceType = DeviceType.CUDA;
ScalarType dtype = ScalarType.Float32;
YoloSize yoloSize = YoloSize.n;

Bitmap inputBitmap = new Bitmap(predictImagePath);

// Create predictor
Predictor predictor = new Predictor(sortCount, yoloType: yoloType, deviceType: deviceType, yoloSize: yoloSize, dtype: dtype);

// Train model
predictor.LoadModel(preTraindModelPath);
predictor.Train(trainDataPath, valDataPath, outputPath: outputPath, batchSize: batchSize, epochs: epochs);

// Predict image
predictor.LoadModel(Path.Combine(outputPath, "best.bin"));
var results = predictor.ImagePredict(inputBitmap, predictThreshold, iouThreshold);

results保存了推理的结果。result这个类结构如下:

csharp 复制代码
public class PredictResult
{
	public int ClassID;
	public float Score;
	public int X;
	public int Y;
	public int W;
	public int H;
}

得到的结果以图片形式展示并保存:

csharp 复制代码
// Draw results
Graphics g = Graphics.FromImage(inputBitmap);
foreach (var result in results)
{
	Point point = new Point(result.X - result.W / 2, result.Y - result.H / 2);
	string str = string.Format("Sort:{0}, Score:{1:F1}%", result.ClassID, result.Score * 100);
	g.DrawRectangle(Pens.Red, new Rectangle(point, new Size(result.W, result.H)));
	g.DrawString(str, new Font(FontFamily.GenericMonospace, 10), new SolidBrush(Color.Red), point);
	Console.WriteLine(str);
}
g.Save();
inputBitmap.Save("pred.jpg");

这样就完成了该项目的使用,使用完整的训练+推理,核心代码只有5行,真正简化了项目的使用。

项目效果如下

项目展望

目前已经实现了Yolov5、Yolov8、Yolov11的训练和推理方法,并且已经可以成功加载官方的预训练模型进行,或作为训练的基础权重。

目前本人正在适配Segment方法,过段时间估计会有新的进展。

写在最后

使用C#深度学习项目是很多人所希望的。不过在该方向上资料很少,开发难度大。常规使用C#进行深度学习项目的方法为使用Python训练,转为Onnx模型再用C#调用。

目前我希望能够改变这一现象,希望能用纯C#平台进行训练和推理。这条路还很长,也很困难,希望有兴趣的读者能跟我一起让让C#的深度学习开发环境更为完善,以此能帮助到更多的人。

另外随着项目的关注度增多,已经开始有人盗版我的项目并将免费开源的项目当成付费项目在卖了。这种行为极其恶劣,请各位小伙伴积极抵制这种行为,还开源项目一片干净的环境,也让开源项目开发者有动力继续贡献更多的项目。

我在Github上已经将完整的代码发布了,项目地址为:https://github.com/IntptrMax/YoloSharp,期待你能在Github上送我一颗小星星。在我的Github里还GGMLSharp这个项目,这个项目也是C#平台下深度学习的开发包,希望能得到你的支持。

项目下载链接

https://download.csdn.net/download/qq_30270773/89969923

相关推荐
AIM0862 分钟前
稀疏子空间聚类 SSC(Sparse Subspace Clustering)
人工智能·深度学习·机器学习·数学建模·数据挖掘·聚类
孤独且没人爱的纸鹤29 分钟前
【机器学习】无监督学习麾下 K-means 聚类如何智能划分,解锁隐藏结构,为市场细分、图像分割、基因聚类精准导航
人工智能·深度学习·机器学习·支持向量机·ai·kmeans·聚类
笔写落去1 小时前
统计学习方法(第二版) 第六章 逻辑斯特回归
人工智能·深度学习·机器学习
埃菲尔铁塔_CV算法1 小时前
Matlab 数据处理与可视化的多元拓展应用(具体代码分析)
人工智能·机器学习·计算机视觉·matlab·信息可视化·数据分析
bug终结者10241 小时前
WPF连接USB相机,拍照,视频 示例
数码相机·c#·wpf
tpen2 小时前
C# WinForm 检查目标主机的端口是否可连接
c#
JxHillMan2 小时前
C# 多线程
c#
snow每天都要好好学习2 小时前
From Orthogonal Time Frequency Space to Affine Frequency Division Multiplexing
深度学习
cufewxy20182 小时前
深度学习中的卷积和反卷积(二)——反卷积的介绍
深度学习·反卷积
深度混淆3 小时前
C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序
算法·c#·图论