Yolov5学习全过程:训练+运行+c#部署(无理论全实操)

Yolov5学习全过程:训练+运行+c#部署(无理论全实操)

  • 1.Yolov5 理论介绍
  • 2.Yolov5下载地址
  • 3.Yolov5使用方法
  • 4.制作训练样本
  • 4.1 labelImg 下载
  • 4.2 labelImg 注意事项
  • 4.3 labelImg 使用
  • 5.C#调用yolo的可用方法
  • 6.C# 部署onnx分类模型(我的学习全过程)
  • 6.1 导出 onnx 模型
  • 6.2 yolov5-net-master使用
  • 6.2.1使用yolov5 5.0导出模型
  • 6.2.2使用yolov5 6.1导出模型
  • 1.Yolov5 理论介绍

          使用一种算法前最好还是先了解它的来龙去脉,这里介绍一篇文章给大家YOLO系列详解

    2.Yolov5下载地址

         我在做项目的时候主要用了两个版本的:Yolov5 5.0 和 Yolov5 6.1,至于为什么要用两种后续会说明(主要是有的问题Yolov5 5.0解决不了改用 Yolov5 6.1)。像图片中更换Tag就可以看到不同的版本啦。
         yolov5下载地址:下载地址
    不同

    3.Yolov5使用方法

         刚开始的时候什么都不会,python基础也不扎实,只能上哔哩哔哩看看有什么好用的资料。分享一个非常好的学习视频yolo实操视频,我就是跟着视频学的。内容包含了如何安装环境、如何打标签、如何训练、如何修改参数等等;而且在评论区留下邮箱,up的爬虫自动发送真的不要太方便!

    4.制作训练样本

           网上也有很多LabelImg的资料,不过我觉得挺杂的,下面就直接分享怎么做的就好,方便大家学习。

    4.1 labelImg 下载

           制作样本我是用的是labelImg,它的选框都是矩形不可调整的,我们课程项目是制作芯片样本,正方形的,所以非常适用。听同学说labelIme也可以适用,而且还能框选一些不规则的图形(还没尝试过)。
    这里分享我的网盘给大家:

    4.2 labelImg 注意事项

           1、我给大家的的 labelImg 是Win 10 exe版本(labelImg网盘:提取码abaa),真的非常方便,网上有的资料是github代码,还要配置环境才能运行。
           2、labelImg的exe文件路径一定要没有中文,不然会报错!报错图忘记留下来了,反正更换个路径,创建快捷方式放在桌面就好了!

    4.3 labelImg 使用

    (1)基本操作
    打开之后进行以下操作:
    ①打开存放大量样本图片的文件
    ②修改文件保存的路径
    使用介绍
           多熟悉上面的快捷键,框选起来才够快。

    (2)一些其他操作
      由于我制作的样本只有一个标签‘chip’,为了以防软件总是弹出让我输入标签名字的窗口,操作②③步之后他就会自动默认所有标签都是‘chip’

    5.C#调用yolo的可用方法

    我们的任务是使用C#语言调用yolo,网上有好几种方法:

    (1)导出onnx模型,c# 部署onnx分类模型。这分享一个github的代码:yolo-net-master。我一直都是在研究这一部分的,下面会详细讲讲。

    (2)opencv中调用,c++转c#。网上有一篇教怎么使用opencv调用yolo onnx 模型.openCV调用YOLOv5 ONNX模型。我们后来也用这种方法,不过需要比较扎实的语言基础,通晓两种语言的转换。这一部分是我同学搞定的,我搞不赢,所以就不放别人的成果啦。感兴趣的可以试一下

    (3)c#中调用python脚本。试过了,非常慢。调用前必须打开pycharm,并且保证python文件是可运行、编译无错的。调用时间大概在20s左右,不符合要求。调用代码如下:

     private void RunPythonScript(string sArgName, string args = "", params string[] teps)
            {
                Process p = new Process();
                //string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + sArgName;// 获得python文件的绝对路径(将文件放在c#的debug文件夹中可以这样操作)
                string path = @"F:\输入自己的路径\detect.py";//"H:\\python_codes\\0331test.py";
                p.StartInfo.FileName = @"F:\输入自己的路径\python.exe";//没有配环境变量的话,可以像我这样写python.exe的绝对路径。如果配了,直接写"python.exe"即可
                string sArguments = path;
                ArrayList arrayList = new ArrayList();
                //arrayList.Add("com4");
                //arrayList.Add(57600);
                //arrayList.Add("password");
                foreach (var param in arrayList)//添加参数
                {
                    sArguments += " " + sigstr;
                }
                p.StartInfo.Arguments = sArguments;//python命令的参数
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();//启动进程
                Console.ReadLine();
                Console.WriteLine("执行完毕!");//查看是否执行了
       
            }
    

    6.C# 部署onnx分类模型(我的学习全过程)

           网上其实有很多参考资料,具体理论我不讲了,仅分享我的实现过程,里面有我踩过的坑,也有成功实现的过程,大家选着看就行。

    6.1 导出 onnx 模型

           打开yolov5 5.0中的 export文件,修改以下代码,选择自己训练出来的模型路径(导出onnx前要提前配置环境,可能要下载很多东西,这部分大家就自己查资料吧~),然后运行就能导出一个onnx模型。

           导出后的模型大概长这样的,是带有切片的。我是下载Netron软件查看的,大家也可以直接到Netron网页查看Netron网页版本

    6.2 yolov5-net-master使用

    6.2.1使用yolov5 5.0导出模型

           这个c#文件本身是能运行的,运行结果:

      于是,我刚开始非常单纯的直接把他的测试图片路径和onnx文件路径改了就直接用了,所以非常顺利地报错了(报错为超出索引)。


      所以,我就读一下代码,改一下主要参数。只要大概学一下yolo框架,改起来就挺简单,就那几个参数。打开其一,使用5.0的改P5,使用6.0+的改P6。由于我刚开始时使用的是yolov5 5.0,所以我下面示范怎么改P5Models


      主要改的参数就这两个,其他都是默认参数,如果在python文件里面修改过其他参数的话这里就要一一对应的。                                            
      改好之后我满怀期待,这次一定能跑了吧!于是——好的,继续报错,超出索引。好家伙,给我整不会了。后面改了好久,都是这个错误,真的要哭了。

      后来看了一篇教程(onnx调用相关问题),不能成功调用的原因在于Pytorch2ONNX不支持对slice对象赋值,所以我就按照教程,修改了yolo中的部分文件,再次导出yolo onnx 模型,导出的模型如下图:

      于是!我再次满心期待调用!依旧超出索引…晕了,这下真没辙了。这项工作也滞后了一段时间,觉得此路不通,所以我们组的其他成员就开始另谋出路,把c++代码硬转成c#来用(前面提到过的,也有放链接,我的小伙伴太强了)。
      后来,听其他组的同学汇报,他们也弄yolov5-net-master这个代码,做出来了,所以我就请教他们。和他们交流的过程中发现,他们改的参数不也和我一样吗?也没什么特别啊。所以我就开始找不同。

    6.2.2使用yolov5 6.1导出模型

    上面报了那么多次错,和同学讨论之后,我就怀疑是不是yolov5 5.0这个版本导出来的模型有问题而不能用在yolov5-net-master。于是我就吭哧吭哧下载yolov5 6.1重新训练。过程步骤都是差不多的,会5.0肯定也能搞定6.1.

      按照常规思路,肯定要像第一次一样,去掉onnx模型中的切片(这些上面都是有讲的)。于是去掉切片后它又又又又报错了!可怕的超出索引,又是他!
       
      后面无意中发现,不切片就能调用!!!!!!(就是不要修改common和yolo代码了,直接用export导出onnx就行!)说的非常轻描淡写,实际探索了好久…至于为什么我也不太清楚,不过现在能用真的是谢天谢地!
    不过这里要提醒一点,yolov5-net-master修改参数过程和上面讲过的是一样的,但是这次要改的是P6模型,不是P5,大家别搞错啦!

      最后还要再改多一个地方,就可以成功调用啦!图片识别效果不太好请见谅,还没有加大轮数训练。

    来源:weixin_49983900

    物联沃分享整理
    物联沃-IOTWORD物联网 » Yolov5学习全过程:训练+运行+c#部署(无理论全实操)

    发表评论