<h1 style="font-size: 32px; font-weight: bold; border-bottom: 2px solid rgb(204, 204, 204); padding: 0px 4px 0px 0px; text-align: left; margin: 0px 0px 10px;">YOLOv5 C#中进行模型预测(.net版)</h1><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">1、说明</span></p><p> 在C#中进行模型预测,目前博主使用的是Yolov5Net.Scorer库,该库貌似只支持.net环境下的调用,不支持winform和wpf。并且Yolov5Net.Scorer库只支持矩形检测,不支持实例分割训练出来的模型,这点大伙要注意了。至于实例分割的模型预测和winform、wpf环境下的使用,博主后续会继续研究。</p><p> 模型训练博主目前在yolov5-master、yolov5 6.1,这两个版本的yolo中都得到了验证,可行。如果采用的是yolov5 6.1版本进行训练,环境安装会稍微有点坑爹,在博客的后面博主会专门做说明。目前博主将采用yolov5-master版本来做演示。</p><p><br/></p><p>当前工程源码下载:</p><p>链接:<a href="https://pan.baidu.com/s/13V8qkzxYjkKuLTwou08oFA" target="_blank">https://pan.baidu.com/s/13V8qkzxYjkKuLTwou08oFA</a></p><p>提取码:afav</p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">2、准备工作</span></p><p>参考博客:<a href="https://blog.csdn.net/weixin_49983900/article/details/124866704" target="_blank" title="Yolov5学习全过程:训练+运行+c#部署(无理论全实操)">Yolov5学习全过程:训练+运行+c#部署(无理论全实操)</a></p><p>yolov5下载:<a href="https://github.com/ultralytics/yolov5" target="_blank">https://github.com/ultralytics/yolov5</a></p><p><img src="/upload/image/6381889246120638047877401.jpg" title="QQ截图20230505140737.jpg" alt="QQ截图20230505140737.jpg"/></p><p>如果想下载yolov5其他版本,可以选择旁边的Tags选项卡进行下载。</p><p><img src="/upload/image/6381889252839389858711369.jpg" title="QQ截图20230505140850.jpg" alt="QQ截图20230505140850.jpg"/></p><p>yolov5-net-master下载,里面包含了Yolov5Net.Scorer库源码和官方demo:<a href="https://github.com/nihevix/yolov5-net-master" target="_blank">https://github.com/nihevix/yolov5-net-master</a></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">3、YOLO环境安装</span></p><p> yolov5的环境安装请参考博客:《<a href="/Course?id=5987479000234" target="_blank" title="YOLOv5 安装开发环境">YOLOv5 安装开发环境</a>》</p><p> 如果使用的是yolov5 6.1版本,在搭建虚拟环境时,推荐Python版本为3.8,博主尝试过用3.10,好像没搭建成功,有兴趣的同学可以试试。</p><p> GPU的安装方法可以参考下面两个博客:《<a href="/Course?id=3556056000339" target="_blank" title="Windows11下安装cuda">Windows11下安装cuda</a>》《<a href="/Course?id=0075580000334" target="_blank" title="YOLOv5 GPU训练方法">YOLOv5 GPU训练方法</a>》</p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">4、YOLO训练</span></p><p> yolov5-master模型训练请参考这两个博客:《<a href="/Course?id=0513425000328" target="_blank" title="YOLOv5 自定义数据集训练方法">YOLOv5 自定义数据集训练方法</a>》《<a href="/Course?id=5568496000344" target="_blank" title="Labelme安装与运行">Labelme安装与运行</a>》</p><p> 训练完之后,我们就得到了yolo的pt模型文件了。<br/></p><p> 训练命令:</p><pre class="brush:python;toolbar:false">python train.py --img 640 --batch 16 --epochs 300 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --device 0</pre><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">5、pt转onnx文件</span> </p><p> 进行模型转换时,需要安装一些库,安装完之后,才能执行换行命令,不过yolov5-master可以不必手动安装,程序在进行转换时,如果未检测到onnx,会自动安装,但是yolov5 6.1需要手动安装才行,安装命令如下:</p><pre class="brush:python;toolbar:false">pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime openvino-dev tensorflow-cpu</pre><p> 1、生成静态模型</p><pre class="brush:python;toolbar:false">python export.py --weights runs/train/exp/weights/best.pt --include onnx</pre><p> 2、生成动态模型</p><pre class="brush:python;toolbar:false">python export.py --weights runs/train/exp/weights/best.pt --include onnx --dynamic</pre><p> 从生成效果看,动态模型会比静态模型小一点</p><p><img src="/upload/image/6381889512859564684028145.jpg" title="QQ截图20230505145205.jpg" alt="QQ截图20230505145205.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">6、Yolov5Net.Scorer C#集成与预测</span></p><p>目前Yolov5Net.Scorer库只支持.net环境,不支持winfrom,这个有点坑,博主后续会研究一下如何在winform中进行模型预测。<br/></p><p>Yolov5Net.Scorer提供了两个预测模型YoloCocoP5Model和YoloCocoP6Model,yolov5-master和yolov5 6.1转换的onnx模型在P5和P6中都能运行,博主测试过了,我们这边直接使用默认的P5模型来进行演示。</p><p>1、修改Yolov5Net.Scorer/Models/YoloCocoP5Model.cs文件:</p><p><img src="/upload/image/6381889589608020453568042.jpg" title="QQ截图20230505150449.jpg" alt="QQ截图20230505150449.jpg"/></p><p>按如下进行修改调整</p><p><img src="/upload/image/6381889561431521704697820.jpg" title="QQ截图20230505145955.jpg" alt="QQ截图20230505145955.jpg"/></p><p><img src="/upload/image/6381889571373599438427242.jpg" title="QQ截图20230505150153.jpg" alt="QQ截图20230505150153.jpg"/></p><p><br/></p><p>Program.cs文件的测试代码如下:</p><pre class="brush:c#;toolbar:false">using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using Yolov5Net.Scorer;
using Yolov5Net.Scorer.Models;
using var image = await Image.LoadAsync<Rgba32>("Assets/000055.jpg");
{
using var scorer = new YoloScorer<YoloCocoP5Model>("Assets/Weights/best-yibiao-d.onnx");
{
var predictions = scorer.Predict(image);
var font = new Font(new FontCollection().Add("C:/Windows/Fonts/consola.ttf"), 16);
foreach (var prediction in predictions) // draw predictions
{
var score = Math.Round(prediction.Score, 2);
var (x, y) = (prediction.Rectangle.Left - 3, prediction.Rectangle.Top - 23);
image.Mutate(a => a.DrawPolygon(new Pen(prediction.Label.Color, 1),
new PointF(prediction.Rectangle.Left, prediction.Rectangle.Top),
new PointF(prediction.Rectangle.Right, prediction.Rectangle.Top),
new PointF(prediction.Rectangle.Right, prediction.Rectangle.Bottom),
new PointF(prediction.Rectangle.Left, prediction.Rectangle.Bottom)
));
image.Mutate(a => a.DrawText($"{prediction.Label.Name} ({score})",
font, prediction.Label.Color, new PointF(x, y)));
}
await image.SaveAsync("Assets/result.jpg");
}
}</pre><p><br/></p><p>最终效果如下:</p><p><img src="/upload/image/6381889574911758384494413.jpg" title="result.jpg" alt="result.jpg"/></p><p><br/></p><p><span style="font-style: italic; font-weight: bold; color: rgb(51, 153, 204); line-height: 18px; font-size: 20px;">7、yolov5 6.1版本避坑说明</span></p><p>1、Python版本推荐使用3.8,博主尝试过用3.10,好像没搭建成功,有兴趣的同学可以试试。</p><p><br/></p><p>2、训练时如果报下面这个错误,多半原因是numpy版本问题,yolo官方给的是大于等于1.18.5,当你执行pip install -r requirements.txt命令时,他默认安装为1.24,但是在numpy版本更新时numpy.int在NumPy 1.20中已弃用,在NumPy 1.24中已删除。下面给2个解决方案:</p><p><img src="/upload/image/6381889616081008524270982.jpg" title="QQ截图20230505150922.jpg" alt="QQ截图20230505150922.jpg"/></p><p>方案1:重新安装numpy</p><pre class="brush:python;toolbar:false">pip uninstall numpy
pip install numpy==1.22</pre><p>方案2:改代码(不太推荐)</p><p>找到报错地方,将numpy.int更改为numpy.int_</p><p><br/></p><p>3、如果出现下面这个问题:</p><p>RuntimeError: result type Float can‘t be cast to the desired output type long int</p><p><img src="/upload/image/6381889624393746511273426.jpg" title="QQ截图20230505151043.jpg" alt="QQ截图20230505151043.jpg"/></p><p>解决方案如下:</p><p>参考博客:<a href="https://blog.csdn.net/Thebest_jack/article/details/125649451" target="_blank">https://blog.csdn.net/Thebest_jack/article/details/125649451</a></p><p><br/></p>
YOLOv5 C#中进行模型预测(.net版) 1、说明
在C#中进行模型预测,目前博主使用的是Yolov5Net.Scorer库,该库貌似只支持.net环境下的调用,不支持winform和wpf。并且Yolov5Net.Scorer库只支持矩形检测,不支持实例分割训练出来的模型,这点大伙要注意了。至于实例分割的模型预测和winform、wpf环境下的使用,博主后续会继续研究。
模型训练博主目前在yolov5-master、yolov5 6.1,这两个版本的yolo中都得到了验证,可行。如果采用的是yolov5 6.1版本进行训练,环境安装会稍微有点坑爹,在博客的后面博主会专门做说明。目前博主将采用yolov5-master版本来做演示。
当前工程源码下载:
链接:https://pan.baidu.com/s/13V8qkzxYjkKuLTwou08oFA
提取码:afav
2、准备工作
参考博客:Yolov5学习全过程:训练+运行+c#部署(无理论全实操)
yolov5下载:https://github.com/ultralytics/yolov5
如果想下载yolov5其他版本,可以选择旁边的Tags选项卡进行下载。
yolov5-net-master下载,里面包含了Yolov5Net.Scorer库源码和官方demo:https://github.com/nihevix/yolov5-net-master
3、YOLO环境安装
yolov5的环境安装请参考博客:《YOLOv5 安装开发环境 》
如果使用的是yolov5 6.1版本,在搭建虚拟环境时,推荐Python版本为3.8,博主尝试过用3.10,好像没搭建成功,有兴趣的同学可以试试。
GPU的安装方法可以参考下面两个博客:《Windows11下安装cuda 》《YOLOv5 GPU训练方法 》
4、YOLO训练
yolov5-master模型训练请参考这两个博客:《YOLOv5 自定义数据集训练方法 》《Labelme安装与运行 》
训练完之后,我们就得到了yolo的pt模型文件了。
训练命令:
python train.py --img 640 --batch 16 --epochs 300 --data ./data/coco128.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --device 0
5、pt转onnx文件
进行模型转换时,需要安装一些库,安装完之后,才能执行换行命令,不过yolov5-master可以不必手动安装,程序在进行转换时,如果未检测到onnx,会自动安装,但是yolov5 6.1需要手动安装才行,安装命令如下:
pip install -r requirements.txt coremltools onnx onnx-simplifier onnxruntime openvino-dev tensorflow-cpu 1、生成静态模型
python export.py --weights runs/train/exp/weights/best.pt --include onnx 2、生成动态模型
python export.py --weights runs/train/exp/weights/best.pt --include onnx --dynamic 从生成效果看,动态模型会比静态模型小一点
6、Yolov5Net.Scorer C#集成与预测
目前Yolov5Net.Scorer库只支持.net环境,不支持winfrom,这个有点坑,博主后续会研究一下如何在winform中进行模型预测。
Yolov5Net.Scorer提供了两个预测模型YoloCocoP5Model和YoloCocoP6Model,yolov5-master和yolov5 6.1转换的onnx模型在P5和P6中都能运行,博主测试过了,我们这边直接使用默认的P5模型来进行演示。
1、修改Yolov5Net.Scorer/Models/YoloCocoP5Model.cs文件:
按如下进行修改调整
Program.cs文件的测试代码如下:
using SixLabors.Fonts;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Drawing.Processing;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;
using Yolov5Net.Scorer;
using Yolov5Net.Scorer.Models;
using var image = await Image.LoadAsync<Rgba32>("Assets/000055.jpg");
{
using var scorer = new YoloScorer<YoloCocoP5Model>("Assets/Weights/best-yibiao-d.onnx");
{
var predictions = scorer.Predict(image);
var font = new Font(new FontCollection().Add("C:/Windows/Fonts/consola.ttf"), 16);
foreach (var prediction in predictions) // draw predictions
{
var score = Math.Round(prediction.Score, 2);
var (x, y) = (prediction.Rectangle.Left - 3, prediction.Rectangle.Top - 23);
image.Mutate(a => a.DrawPolygon(new Pen(prediction.Label.Color, 1),
new PointF(prediction.Rectangle.Left, prediction.Rectangle.Top),
new PointF(prediction.Rectangle.Right, prediction.Rectangle.Top),
new PointF(prediction.Rectangle.Right, prediction.Rectangle.Bottom),
new PointF(prediction.Rectangle.Left, prediction.Rectangle.Bottom)
));
image.Mutate(a => a.DrawText($"{prediction.Label.Name} ({score})",
font, prediction.Label.Color, new PointF(x, y)));
}
await image.SaveAsync("Assets/result.jpg");
}
}
最终效果如下:
7、yolov5 6.1版本避坑说明
1、Python版本推荐使用3.8,博主尝试过用3.10,好像没搭建成功,有兴趣的同学可以试试。
2、训练时如果报下面这个错误,多半原因是numpy版本问题,yolo官方给的是大于等于1.18.5,当你执行pip install -r requirements.txt命令时,他默认安装为1.24,但是在numpy版本更新时numpy.int在NumPy 1.20中已弃用,在NumPy 1.24中已删除。下面给2个解决方案:
方案1:重新安装numpy
pip uninstall numpy
pip install numpy==1.22 方案2:改代码(不太推荐)
找到报错地方,将numpy.int更改为numpy.int_
3、如果出现下面这个问题:
RuntimeError: result type Float can‘t be cast to the desired output type long int
解决方案如下:
参考博客:https://blog.csdn.net/Thebest_jack/article/details/125649451