赞
踩
这是我第二次用YOLO v5进行图像识别,中间间隔时间有些长,忘记了流程,于是今天准备写一个文章以便进行总结,也供大家参考
YOLO v5的网址:一键直达,YOLO v5
点击code
点击Download ZIP
点击解压,建议解压到D盘,根目录。
这是我的路径
首先打开 Anaconda prompt
随后在命令行中输入
conda create -n yolov5 python==3.9
yolov5是你新建环境的名字,你也可以替换成其他名字
查看环境
conda env list
删除虚拟环境
conda remove -n yolov5 --all
yolov5同样是你环境的名字。
如果不想把环境安装到c盘,想要安装到d盘。可以查询其他博客教程。如果需要,评论区留言我后续会补充上
如果显示出来的有你新建的环境,那么就建立环境成功了
我这里用的cpu进行训练,如果你要用gpu可以在网上查一下其他的博客。如果需要,评论区留言我后续会补充上
我用的pycharm编辑器,在这个文件夹中随便打开一个.py文件,选择信任该项目。随后就会打开该文件。
在右下角选择解释器,例如我现在添加新的解释器
我选择的是conda环境,选择使用现有环境的选项,在下拉列表中找到你刚才创建的环境
然后在编辑器内找到终端,在终端内激活环境**(如果命令行的开头是base就需要激活)**,
激活方法,yolov5是环境的名字,你可以换成你的环境名字
conda activate yolov5
输入所需要的包。(因为所需要的包都已经在requirment.txt内,所以只需要把这个文件引入即可)
pip install -r requirements.txt
Labelimg是一款开源的数据标注工具,可以标注三种格式。
1 VOC标签格式,保存为xml文件。
2 yolo标签格式,保存为txt文件。
3 createML标签格式,保存为json格式。
首先在yolov5-master 文件夹下简历VOC2007文件夹(都是什么建立的,默认存储你的图片数据,如果你看别的博客,有的会写成VOCData什么的,都差不多这样)在文件夹下建立train和valid,分别存放你的训练集和验证集。
在训练集和验证集文件夹里分别建立images和labels(图片里没有加s,必须加上,很重要,要不那个报错能恶心你一整天文件夹,images用来存放图片,label用来存放labelimg输出的txt文件。
另外在train文件夹下建立一个predefined_classes.txt 这个文件的作用是提前把你的类分好
我这里只有一个分类,因为我要识别花生叶片,如果你是要识别很多种物品,你可以在这个txt文件内输入你所有的类别。注意,一行只能输入一个类!!!!
这段很重要,我写的时候也掉坑了。找了好久才明白,哈哈哈哈哈哈
首先打开anaconda里面的命令行,Anaconda prompt
在里面激活你的环境
conda activate yolov5
如果不知道你的环境的名字,可以通过
conda env list
查看你的环境
进入到你的环境之后会显示成这个样子如下:
有过修改,图片配错了,应该是yolov5
最前边不再是base,而是你的环境名字。这时候就算进入环境成功
首先运行以下命令,进行labelimg的安装
//下载labelimg
pip install labelimg
//运行labelimg
labelimg
打开程序之后长这个样子,这是每一个图标的含义
首先打开Change save Dir,这是为了确定,你标注好后保存的文件的位置。
其次打开Open Dir ,这是你原本图片的文件夹
再其次,使用之前,可在View中勾选Auto Save mode自动保存
最后就是yolo格式(.txt)还是voc(.xml)格式和creatML格式
笔者用的yolo格式
以下是labelimg的快捷键,笔者主要用a和d
随后就可以开始标注了,
注意:标注的框要大小正好框住所要识别的物体,这有利于进行训练。
如果在上边你没有报错,你可以忽略这一段!!!
如果你出现这类问题,很可能是你用的你之前的环境,没按照上面的要求来,首先可以排查一下你的Python版本是不是过高,笔者就是因为Python版本过高,导致用了全网的方法都没用。
看一下你的Python版本是不是比3.9要高。如果是的话
可以进行以下操作。
打开Anaconda prompt ,创建一个新的环境(叫他labelimg,以后标注也能分得清)且Python版本为3.9
conda create-n labelimg python==3.9
随后输入y。创建环境
激活:创建好环境后在命令行中输入
conda activate labelimg
当开头括号是你的环境名字时,就表明激活成功。如下
在这个环境中下载labelimg,并打开。如果不会的,可以往上翻一翻。
第二个问题就是在我们使用labelimg的时候我们所选的yolo格式,等到我们第二次在进行标注时候发生了闪退,原因是因为在labelimg标注yolo格式的时候生成的classes.txt里面的类别名字是有顺序的,当我们二次打开的时候他的顺序发生了改变,所以就会进行闪退,最好的解决办法就是打classes.txt自己根据自己的标注顺序重新排序类别名字,每次选好标签存放位置以后都需要对classes.txt按照我们自己的顺序进行重新标注。
预训练模型和数据集都准备好了,就可以开始训练自己的yolov5目标检测模型了,训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件,一个是model目录文件下的相应的yaml文件。
修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件。如下图所示,建议都使用绝对路径,不容易出错
train:是上文所提到的训练train的图片
val:是上文提到的验证集valid的图片
nc:是你标签的数目
name:是你标签的名字,数字从0开始
主要修改的:
weights:权重文件路径,看你想使用的yolov5的什么模型有s,l,n,x这样的,选其中一个就行。运行之后会自动下载,如果下载的比较慢,可以自己从网上查找
cfg:存储模型结构的配置文件,一般不用管。如果有报错说这里有错误的话,你就找你用的什么模型,在models文件夹里找到对应的.yaml文件。改一下对应的nc。就是你的标签有多少。
data:存储训练、测试数据的文件。就是上文中提到的修改的.yaml文件
epochs:指的就是训练过程中整个数据集将被迭代(训练)了多少次,显卡不行你就调小点。
batch-size:训练完多少张图片才进行权重更新,显卡不行就调小点。
img-size:输入图片宽高,显卡不行就调小点。
device:cuda device, i.e. 0 or 0,1,2,3 or cpu。选择使用GPU还是CPU
workers:线程数。默认是8。
其他:
noautoanchor:不自动检验更新anchors
rect:进行矩形训练
resume:恢复最近保存的模型开始训练
nosave:仅保存最终checkpoint
notest:仅测试最后的epoch
evolve:进化超参数
bucket:gsutil bucket
cache-images:缓存图像以加快训练速度
name: 重命名results.txt to results_name.txt
adam:使用adam优化
multi-scale:多尺度训练,img-size +/- 50%
single-cls:单类别的训练集
没有按照要求做,把label改成labels
依赖没有安装完全,回到本篇文章最开始处,重新安装一下依赖
鼠标右键此电脑,选择属性**(有的同学点击的是快捷方式,所以没用)**
点击高级系统设置
点击高级
点击性能,设置
点击高级
点击更改
对勾取消,选择D盘,自定义大小10240,10240
内存超了,减小 --batch-size 试试,如果还不行降低 --epoch
重复训练的话,你也许需要将.cache缓存清除掉。在train文件夹和vaild文件夹下。不报错就没事
训练时或者训练后可以利用 tensorboard 查看训练可视化
首先进入你的环境进入yolov5文件夹,运行以下代码
tensorboard --logdir=runs
经过漫长的等待,如下图所示
从上述图片中可以看到的信息是:
我总共训练了500次,共花费3.739个小时。
最新的训练结果是:last.pt,文件位置如图所示,文件大小是92.9MB
最好的训练结果是:best.pt,文件位置如图所示,文件大小是92.9MB
结果保存在runs/train/exp14
打开该文件,如下图所示
检测速度
前传耗时(ms): 从输入一张图像到输出最终结果所消耗的时间,包括前处理耗时(如图像归一化)、网络前传耗时、后处理耗时(如非极大值抑制)
每秒帧数FPS (Frames Per Second): 每秒钟能处理的图像数量
浮点运算量(FLOPS): 处理一-张图像所需要的浮点运算数量,跟具体软硬件没有关系,可以公平地比较不同算法之间的检测速度
如下图,因为我的只用了一个标签,所以不太能够展现混淆矩阵等一系列其他的图,所以这里我用参考资料的图进行说明。
这里用了参考资料的一张图
学过机器学习的应该很熟悉,真正率、假正率。
在机器学习领域和统计分类问题中,混淆矩阵是可视化工具,用于监督学习,在无监督学习一般叫做匹配矩阵。矩阵的每一列代表一个类的实例预测,而每一行表示一个实际的类的实例。之所以如此命名,是因为通过这个矩阵可以方便地看出机器是否将两个不同的类混淆了(比如说把一个类错当成了另一个)。
混淆矩阵的每一列代表了预测类别,每一行是预测类别。每一列是真实类别。
矩阵中Aij的含义是:第j个类别被预测为第i个类别的概率。
准确率(查准率)和置信率
准确率和置信度的关系图。
意思就是,当我设置置信度为某一数值的时候,各个类别识别的准确率。可以看到,当置信度越大的时候,类别检测的越准确。这也很好理解,只有confidence很大,才被判断是某一类别。但也很好想到,这样的话,会漏检一些置信度低的类别。
recall(真实为positive的准确率),即正样本有多少被找出来了(召回了多少)。
召回率(查全率)和置信度的关系图。
意思就是,当我设置置信度为某一数值的时候,各个类别查全的概率。可以看到,当置信度越小的时候,类别检测的越全面。
mAP 是 Mean Average Precision 的缩写,即 均值平均精度。可以看到:精度越高,召回率越低。
但我们希望我们的网络,在准确率很高的前提下,尽可能的检测到全部的类别。所以希望我们的曲线接近(1,1)点,即希望mAP曲线的面积尽可能接近1。
F1分数(F1-score)是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0。
对于某个分类,综合了Precision和Recall的一个判断指标,F1-Score的值是从0到1的,1是最好,0是最差。
第一个图是训练集得数据量,每个类别有多少个
第二个是框的尺寸和数量
第三个是center点的位置。可以看到花生数据集中花生叶片的位置大多分布在图像的中心。
第四个是labeld的高宽。花生叶片一般相比于整个图片比较小,所以看到样本大多分布在(0-0.05)。
labels_correlogram是一张颜色矩阵图,它展示了目标检测算法在训练过程中预测标签之间的相关性。
矩阵的行列分别代表了模型训练时使用的标签(classes),而每个单元格则代表了对应标签的预测结果之间的相关性。
矩阵中的颜色越深,表示对应标签之间的相关性越强;颜色越浅,表示相关性越弱。对角线上的颜色表示每个标签的自身相关性,通常都是最深的。
通过这张图,我们可以看出哪些标签之间具有较强的相关性,从而有助于优化模型的训练和预测效果。例如,如果我们发现某些标签之间的相关性过强,可以考虑将它们合并成一个标签,从而简化模型并提高效率。(我也是查的,不是很懂)
定位损失box_loss:预测框与标定框之间的误差(CIoU),越小定位得越准;
置信度损失obj_loss:计算网络的置信度,越小判定为目标的能力越准;
分类损失cls_loss:计算锚框与对应的标定分类是否正确,越小分类得越准;
mAP@0.5:0.95(mAP@[0.5:0.95]):表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP;
mAP@0.5:表示阈值大于0.5的平均mAP
results.csv中最后三列是验证集结果,前面的是训练集结果,全部列分别是:
训练次数,GPU消耗,边界框损失,目标检测损失,分类损失,total,targets,图片大小,P,R,mAP@.5, mAP@.5:.95, 验证集val Box, 验证集val obj, 验证集val cls
这里我设置的一个batchsize是8,所以一次读了8张照片
val_batchx_labels:验证集第x轮的实际标签
val_batchx_pred:验证集第x轮的预测标签
首先经过上面的学习,你已经完成了主要步骤,接下来就是验证你结果的时刻。
打开你的文件目录,找到detect.py文件,打开。
修改 --weights 为 runs/train/exp8/weights/best.pt 修改使用模型的位置,我们使用的是刚才训练好的模型
修改 --source 为 0 修改调用摄像头0,如果有多个可以改1、2、3
有的可能会报错,是因为你安装了OBSstudio,需要你卸载。(别问我怎么知道的,u呜呜呜呜呜)
至此,文章结束,这是我写的第一篇篇幅较长的文章,如有错误的地方希望大家指正。谢谢大家
最后附上参考资料!!!
Yolov5训练自己的数据集(详细完整版)
目标检测—教你利用yolov5训练自己的目标检测模型
目标检测—利用labelimg制作自己的深度学习目标检测数据集
【目标检测算法】YOLO-V5训练结果的分析与评价
【机器学习】yolov5训练结果分析
【学习总结】win10下yolov5使用GPU训练自己的模型,同时调用网络摄像头识别目标、学习指南与踩坑经验
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。