本地pytorch环境下利用YOLOv5训练自己的数据

本地pytorch环境下利用YOLOv5训练自己的数据

文章目录

    • 本地pytorch环境下利用YOLOv5训练自己的数据
  • 一、制作数据集
    • 1.打标签
    • 2.数据扩充
    • 3.数据格式转换
  • 二、输入网络训练
    • 1.修改配置文件
    • 2.修改训练文件
  • 三、查看GPU训练进展
  • 四、优化训练进程
    • 1.分析原因
    • 2.解决问题
    • 5.最终加速训练进程参数和结果查看
      • 1、最终提速参数
      • 2、tensorboard查看训练结果
  • 五、检测自己的模型
  • 总结



一、制作数据集

1.打标签

确定数据集大小,我用yolov5检测耐张线夹,本地只有数据50张图片,所以需要进行数据扩充。但是我想将原标签一起扩充,这样就能省掉很大一部分工作量,找了很多,测试了很多,就打算使用UP主自己建的数据扩充软件。因此首先对本地的50张图片进行打标签,我使用voc格式(.xml)进行数据集制作,再通过转换格式为txt为YOLO所用。
使用labelimg软件进行打标签。
在这里插入图片描述
本地pytorch环境下利用YOLOv5训练自己的数据_第1张图片

选择图片路径和保存路径,选择标签格式,点击verify image ,查看是否是想要的格式。当然也可以绘制一个去看保存目录格式是否正确。
本地pytorch环境下利用YOLOv5训练自己的数据_第2张图片
接下来就进行繁琐的工作了。
本地pytorch环境下利用YOLOv5训练自己的数据_第3张图片

2.数据扩充

使用UP主的软件进行数据增强。我没有混合操作,仅单次操作,把每次的操作单独保存文件,在软件里每次修改数据增强类型和保存目录以及新开始的文件名。最后进行合并,一次50张。很笨,也很费时间。
本地pytorch环境下利用YOLOv5训练自己的数据_第4张图片
终于50变1200。反正那上面的都来了一遍。
在这里插入图片描述
紧接着就是整合在一起,图片和标签分别整合在一起。

3.数据格式转换

按照up主写的脚本来进行格式转化。只需要把图片和标签都放到对应文件夹里面就行,标签放在下图。
本地pytorch环境下利用YOLOv5训练自己的数据_第5张图片
图片放在下图

本地pytorch环境下利用YOLOv5训练自己的数据_第6张图片
打开划分数据集,没有改动,直接运行,就将1200张图片划分为120张测试集,972张训练集,108张验证集。即0.9的训练集+验证集,再其中的0.9选取训练集。
本地pytorch环境下利用YOLOv5训练自己的数据_第7张图片
再运行数据集打包,根据上一步标签序号划分图片。这个过程需要等待一会儿。等待结束后,图片和标签就全部分好了。数据集也就制作完毕了。
本地pytorch环境下利用YOLOv5训练自己的数据_第8张图片

二、输入网络训练

1.修改配置文件

完全按照[https://blog.csdn.net/Sir666888/article/details/122689893(https://blog.csdn.net/Sir666888/article/details/122689893)这个来。
修改数据集目录,我只检测一种物体,nc为1,下同。
本地pytorch环境下利用YOLOv5训练自己的数据_第9张图片
修改训练模型
本地pytorch环境下利用YOLOv5训练自己的数据_第10张图片

2.修改训练文件

本地pytorch环境下利用YOLOv5训练自己的数据_第11张图片
运行
本地pytorch环境下利用YOLOv5训练自己的数据_第12张图片
本地pytorch环境下利用YOLOv5训练自己的数据_第13张图片
出现报错
本地pytorch环境下利用YOLOv5训练自己的数据_第14张图片
需要修改batch-size,原来是16,改为12试试。
本地pytorch环境下利用YOLOv5训练自己的数据_第15张图片可以运行了。完美。

三、查看GPU训练进展

本地pytorch环境下利用YOLOv5训练自己的数据_第16张图片
当然也可以调出cmd,输入nvidia-smi即可。

四、优化训练进程

由上图也可以看到,GPU在等CPU传数据过来才执行计算,所以GPU利用率不高,且GPU未达到最佳计算能力。训练起来很慢很慢,一个epoch要17分钟,300个就要300*17/60=85小时,我卒。所以绝对有必要加快训练速度,让GPU完全跑起来。

1.分析原因

1、主要原因我觉得就是cpu分配任务能力太弱了,就是GPU计算需要等CPU来分配数据,CPU本来读取数据就很慢,还要分配过去,所以就很慢。
2、cpu通过内存条读取数据能力有限,数据在机械硬盘里面,cpu再怎么牛,也读取不是很快。
3、模型有些参数配置不正确,可能跟多线程有关。
以上原因都是我看了一些博客自己总结的,一些大佬的博客就是解读的很好。附上几个链接:
train.py文件代码注解1
train.py文件代码注解2
Dataloader问题

2.解决问题

1、我把数据集和整个项目都放在了固态硬盘里面,以加快数据读取写入的能力,但不能根本性加速,依旧很慢。
2、我修改train.py中几个参数如下,batch_size是为了极大利用显卡显存,cache是为了将图片缓冲到ram中使用,workes是为了打开多线程计算。
本地pytorch环境下利用YOLOv5训练自己的数据_第17张图片
经过测试,这里改动之后还是没有快起来,于是,我开始寻找这个dataloader这个函数,发现他是把utils/datasets.py文件打包成了dataloader,如下。本地pytorch环境下利用YOLOv5训练自己的数据_第18张图片于是找原来这个datasets文件,看到了num_workers,pip_memory参数,好像上面那个博主提到多线程要跟这个num_workers配合使用,就是num_workers也要给值,直接给cpu的线程数,我是12线程,就设置12。如下。
本地pytorch环境下利用YOLOv5训练自己的数据_第19张图片
经过测试。报错了:OSError: [WinError 1455] 页面文件太小,无法完成操作,按照这个博主的解决办法,我设置了最小51200,最大102400,记住要点设置,应用后再次开始训练。
本地pytorch环境下利用YOLOv5训练自己的数据_第20张图片现在一轮是2分钟左右,原来是16分钟,变快了。查看gpu利用率,cuda在90以上了,但是仍然不是连续的,cpu满载运行,说明仍然是cpu给传数据,只是cpu数据读取快了起来,可能是我的cpu不太行,带不动这3060。虽然还是有点小慢,gpu没有用到最佳,但是这个速度已经不错了。
本地pytorch环境下利用YOLOv5训练自己的数据_第21张图片
查看后台,nvidia-smi,多次输入查看,gpu是在反复波动。基本上运行时都是在80以上。先就这样,起码比原来快很多了。我是cpu12核在跑,电脑做别的事,就有点一卡一卡的,但只是卡那么一下下,可以将num_workers设置小一点。
本地pytorch环境下利用YOLOv5训练自己的数据_第22张图片

5.最终加速训练进程参数和结果查看

1、最终提速参数

我后续又做了改变,适当减小num_workers=10, 让cpu在它训练时我可以做别的事。batch-size=10,为了训练完能够完成其他图像的绘制与保存。 workers=16,这个修改为8或者16,gpu就很稳了,不是跳动的了,但是训练时间仍然需要2个多小时,我估计也是上限了吧,毕竟gpu基本都是满载运行了。
至此,就算训练完了。摸清了训练加速的几个关键参数,但具体细节有待大家一起交流探讨啊。
最后附上训练结果以及结果保存目录文件。
本地pytorch环境下利用YOLOv5训练自己的数据_第23张图片
本地pytorch环境下利用YOLOv5训练自己的数据_第24张图片

2、tensorboard查看训练结果

在tensorboard中查看时需要把当前运行目录下的日志目录打开到tensorboard中,如下图就是训练日志。
本地pytorch环境下利用YOLOv5训练自己的数据_第25张图片
在终端运行 tensorboard --logdir runs\train 就行了,记得要关闭所有之前的这个操作,ctrl+c是无法关闭上一个进程的,只需要点×关闭后,重新进入终端就行,然后点击终端的链接就可以看到了。其中各指标含义见这些博主链接,点击1,点击2。
本地pytorch环境下利用YOLOv5训练自己的数据_第26张图片

五、检测自己的模型

修改你训练好的模型地址,修改你需要检测的数据目录,修改你想要保存结果的目录。如下图。就运行,等待检测完成去结果保存目录查看即可。
本地pytorch环境下利用YOLOv5训练自己的数据_第27张图片



总结

1、我用的代码就是YOLOv5官方源代码。这个是在下载源代码后,配置好pytorch版GPU运行环境后,测试运行成功后,才进行训练自己的数据集的。
2、成功train,但前期很慢。一轮要16分钟。
3、找到了成功快速train的方法,速度提升了,现在跑50轮,1200张大型图片(4864*3648),需要两个多小时。

你可能感兴趣的:(pytorch,目标检测,深度学习,人工智能,python)