使用一种算法前最好还是先了解它的来龙去脉,这里介绍一篇文章给大家YOLO系列详解
我在做项目的时候主要用了两个版本的:Yolov5 5.0 和 Yolov5 6.1,至于为什么要用两种后续会说明(主要是有的问题Yolov5 5.0解决不了改用 Yolov5 6.1)。像图片中更换Tag就可以看到不同的版本啦。
yolov5下载地址:下载地址
刚开始的时候什么都不会,python基础也不扎实,只能上哔哩哔哩看看有什么好用的资料。分享一个非常好的学习视频yolo实操视频,我就是跟着视频学的。内容包含了如何安装环境、如何打标签、如何训练、如何修改参数等等;而且在评论区留下邮箱,up的爬虫自动发送真的不要太方便!
网上也有很多LabelImg的资料,不过我觉得挺杂的,下面就直接分享怎么做的就好,方便大家学习。
制作样本我是用的是labelImg,它的选框都是矩形不可调整的,我们课程项目是制作芯片样本,正方形的,所以非常适用。听同学说labelIme也可以适用,而且还能框选一些不规则的图形(还没尝试过)。
这里分享我的网盘给大家:
1、我给大家的的 labelImg 是Win 10 exe版本(labelImg网盘:提取码abaa),真的非常方便,网上有的资料是github代码,还要配置环境才能运行。
2、labelImg的exe文件路径一定要没有中文,不然会报错!报错图忘记留下来了,反正更换个路径,创建快捷方式放在桌面就好了!
(1)基本操作
打开之后进行以下操作:
①打开存放大量样本图片的文件
②修改文件保存的路径
多熟悉上面的快捷键,框选起来才够快。
(2)一些其他操作
由于我制作的样本只有一个标签‘chip’,为了以防软件总是弹出让我输入标签名字的窗口,操作②③步之后他就会自动默认所有标签都是‘chip’
我们的任务是使用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("执行完毕!");//查看是否执行了
}
网上其实有很多参考资料,具体理论我不讲了,仅分享我的实现过程,里面有我踩过的坑,也有成功实现的过程,大家选着看就行。
打开yolov5 5.0中的 export文件,修改以下代码,选择自己训练出来的模型路径(导出onnx前要提前配置环境,可能要下载很多东西,这部分大家就自己查资料吧~),然后运行就能导出一个onnx模型。
导出后的模型大概长这样的,是带有切片的。我是下载Netron软件查看的,大家也可以直接到Netron网页查看Netron网页版本。
这个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这个代码,做出来了,所以我就请教他们。和他们交流的过程中发现,他们改的参数不也和我一样吗?也没什么特别啊。所以我就开始找不同。
上面报了那么多次错,和同学讨论之后,我就怀疑是不是yolov5 5.0这个版本导出来的模型有问题而不能用在yolov5-net-master。于是我就吭哧吭哧下载yolov5 6.1重新训练。过程步骤都是差不多的,会5.0肯定也能搞定6.1.
按照常规思路,肯定要像第一次一样,去掉onnx模型中的切片(这些上面都是有讲的)。于是去掉切片后它又又又又报错了!可怕的超出索引,又是他!
后面无意中发现,不切片就能调用!!!!!!(就是不要修改common和yolo代码了,直接用export导出onnx就行!)说的非常轻描淡写,实际探索了好久…至于为什么我也不太清楚,不过现在能用真的是谢天谢地!
不过这里要提醒一点,yolov5-net-master修改参数过程和上面讲过的是一样的,但是这次要改的是P6模型,不是P5,大家别搞错啦!
最后还要再改多一个地方,就可以成功调用啦!图片识别效果不太好请见谅,还没有加大轮数训练。