【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

相关推荐
“抚琴”的人15 小时前
【机械视觉】C#+VisionPro联合编程———【六、visionPro连接工业相机设备】
c#·工业相机·visionpro·机械视觉
你觉得20516 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
hyshhhh16 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
FAREWELL0007517 小时前
C#核心学习(七)面向对象--封装(6)C#中的拓展方法与运算符重载: 让代码更“聪明”的魔法
学习·c#·面向对象·运算符重载·oop·拓展方法
Listennnn17 小时前
优雅的理解神经网络中的“分段线性单元”,解剖前向和反向传播
人工智能·深度学习·神经网络
CodeCraft Studio18 小时前
Excel处理控件Spire.XLS系列教程:C# 合并、或取消合并 Excel 单元格
前端·c#·excel
向上的车轮18 小时前
NOA是什么?国内自动驾驶技术的现状是怎么样的?
人工智能·机器学习·自动驾驶
你觉得20519 小时前
浙江大学朱霖潮研究员:《人工智能重塑科学与工程研究》以蛋白质结构预测为例|附PPT下载方法
大数据·人工智能·机器学习·ai·云计算·aigc·powerpoint
勘察加熊人19 小时前
forms实现连连看
c#
hvinsion19 小时前
PPT助手:一款集计时、远程控制与多屏切换于一身的PPT辅助工具
c#·powerpoint·ppt·ppt助手·ppt翻页