【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工具拉取
dotnet add package IntptrMax.YoloSharp --version 1.0.0
或者
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
其中任意一个即可。
环境配置完成后,调用方法如下:
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这个类结构如下:
public class PredictResult
{
public int ClassID;
public float Score;
public int X;
public int Y;
public int W;
public int H;
}
得到的结果以图片形式展示并保存:
// 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