来自一个小白的视角,使用labelimg标记,训练数据集,含label的功能使用,yolov5数据集训练容易产生的错误及解决方式
----纯小白,如有遗漏或错误,欢迎大家改正
关于Anaconda环境配置,yolov5的下载可以看我之前的博客:
通过Yolov5使用ip摄像头实时监测(CPU)_yolo5控制台cmd检测网络摄像头-CSDN博客
下载和使用labelimg工具
下载labelimg
进入我们的yolov5环境
在anaconda prompt 的base环境键入
conda activate yolov5
进入yolov5环境后,键入:
conda install labelimg
开始在该环境下下载labelimg工具
使用labelimg
建立数据文件夹
首先我们先新建一个文件夹Ameng_dataser:
分别包含这三部分(当然,可以使用其他名字,不要对.yaml产生惊慌,把它当作一个文本文档来对待就好了)
images:储存图片
labels:储存标记后数据
.yaml:主要是指明路径,类数,类名
对Ameng.yaml编辑:
#path为自己数据集的文件夹名称,要根据的数据集放置自己项目路径下的哪个位置进行更改
path: .../Ameng_dataset
#train是训练时加载的图片或者标签的路径
train: ./train.txt
#val是验证时加载的图片或者标签的路径
val: ./val.txt
#test是测试时加载的图片或者标签的路径
test: ./test.txt
nc: 1 # 只有一个类别
names:
0: 'Ameng'
不要担心,先把这个模板复制上,之后会说明的
label的简单介绍
在yolov5环境下键入(简单粗暴),即可打开labelimg:
labelimg
这里我们先做如下设置:
在view里勾选这些(英语字面意思,很好理解),会对接下来的数据划分有所帮助
左侧栏分别对应:
Open:打开文件
Open Dir:打开文件夹-->对应先前创建好的images
Change Save Dir:打开储存标记数据的文件夹-->对应先前创建好的labels
Next Image:下一张(a)
Prev Image:上一张(d)
Save:保存(view勾选后默认保存)(s)
Yolo/... :模式(我们使用Yolo)
Create RectBox : 创建一个标记框(w)
使用labelimg来标记
w+拉开矩形框即可,选中我们需要的目标区域,输入目标名称即可
右键可以编辑名称
在最右侧的栏里有目前所有的标签名称
示例:
通常这一步需要大量的图片数据来标注,在标注过程中也是很有意思的
标记完成后,我们打开label文件夹可以看到这些txt文档,
第一个数代表类型数,这里的0代表第1个类型(1的话代表第2个类型)
后面的四个数字表示在图片中的位置
对数据集进行划分
这部分主要依赖于这段代码(可以自己写,网上也有很多,这个也是我在网上找到的),将.yaml里的未填的三个部分train,val,test划分出来(直接运行即可)
这里我把它写在了Ameng_dataset目录下
import os
import random
root_path = "E:\Ameng_dataset"
## 这里的root_path换成你的数据集路径,其他的不变即可
train_precent = 0.8
val_percent = 0.1
test_percent = 0.1
img_path = os.path.join(root_path,'images')
txt_path = os.path.join(root_path,'labels')
imgname_list = os.listdir(img_path)
nums = len(imgname_list)
train_num = int(nums * train_precent)
val_num = int(nums * val_percent)
test_num = int(nums * test_percent)
train_index = random.sample(range(nums), train_num)
vt_index = set(range(nums)) - set(train_index)
val_index = random.sample(list(vt_index), val_num)
test_index = list(set(vt_index) - set(val_index))
with open(os.path.join(root_path,'train.txt'),'w') as f:
for i in train_index:
name = imgname_list[i]
path = os.path.join(img_path, name)
f.write(path)
f.write('\n')
with open(os.path.join(root_path,'val.txt'),'w') as f:
for i in val_index:
name = imgname_list[i]
path = os.path.join(img_path, name)
f.write(path)
f.write('\n')
with open(os.path.join(root_path,'test.txt'),'w') as f:
for i in test_index:
name = imgname_list[i]
path = os.path.join(img_path, name)
f.write(path)
f.write('\n')
划分出来是这样的:
训练数据集
现在我们把已经划分好了的Ameng_dataset复制到yolov5-master/data下(可以不要split.py):
移动文件后,Ameng.yaml应该是这样的:
#path为自己数据集的文件夹名称,要根据的数据集放置自己项目路径下的哪个位置进行更改 path: data/Ameng_dataset #train是训练时加载的图片或者标签的路径 train: ./train.txt #val是验证时加载的图片或者标签的路径 val: ./val.txt #test是测试时加载的图片或者标签的路径 test: ./test.txt nc: 1 # 只有一个类别 names: 0: 'Ameng'
在pycharm里打开整个yolov5项目,打开train.py
这里,我们主要关注这一部分代码即可(我的因为训练过有所改动):
简单介绍:
--weights : 指定了用于训练的预训练模型权重文件(例如,yolov5s.pt)
--cfg:指定模型的配置文件路径(通常是 .yaml格式的配置文件)
--data:指定数据集配置文件的路径(通常是
.yaml
格式的配置文件)--epochs:指定训练的总轮数(即迭代次数)
--batch-size:指定训练时每个批次的样本数量
第一次使用train.py的一些提醒(如果之前顺利运行过train.py直接看第二部分)
一:初始时epochs是100,我使用的是CPU跑的大概跑了一个半小时,挺慢的
二:容易遇到的错误:
1.
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.
解决措施:在文件开头import后,加入:
os.environ[“KMP_DUPLICATE_LIB_OK”]=“TRUE”
2.
RuntimeError : CUDA out of memory
解决措施:
主要是因为内存溢出,电脑带不动了,适当减小epochs
顺利运行过train.py
如上面的简介:
在这里,我们的
权重文件:yolov5s.pt
模型配置:使用
yolov5s.pt
权重文件,YOLOv5 会自动使用yolov5s.yaml
数据集配置:使用我们处理好了的Ameng.yaml
训练轮数:设置为5(这里只做简单的尝试)
每批次处理的图像数量:设置为5
有一个小问题需要注意的是:
目前yolov5s.yaml里的nc(类数)跟我们的不匹配:修改为我们训练的类数即可
接下来就可以直接运行train.py文件了,最后所有的结果被储存在了runs\train\expn里
标签:index,yolov5,val,标记,train,labelimg,test,path,txt From: https://blog.csdn.net/2301_80282532/article/details/145062331包括了PR Curve 曲线、Confusion matric (混淆矩阵)、results.png/txt ,训练好的模型的权重(weights)等