YOLOv10没想到出来的如此之快,作为一名YOLO的爱好者,以YOLOv5和YOLOv8的经验,打算出一套从数据集装备->环境配置->训练->验证->目标追踪全系列教程。请大家多多点赞和收藏!!!
YOLOv5和YOLOv8亲测全都适用
废话不多说,直接开搞!!!
系列文章:
YOLOv10最详细全面讲解2- 目标检测-环境搭建、训练自己的数据集
1.准备图片文件
这里也没什么好说的,关键要提一点就是,将所有图片文件先放入到一个目录文件夹中,便于后续划分训练集,测试集和验证集,同时不能有重复文件名,每一张图片最好取一个合适的名字,例如下图,我的每个图片前缀fish1
表示来自fish1视频,后缀000001表示第一帧画面。图片文件jpg、png都可以,我这里是.jpg
2.准备labels标签文件
这里很关键,很多同学可能之前用的另外的模型训练,用的labels是coco格式或者其他格式,但是这里需要统一转成YOLO格式的labels。
准备一个目录,准备存放所有的labels标签文件。如下图,我的文件夹中已经准备好了所有的标签文件,可以看到,文件名与上述的图片文件名是一一对应的,只是这里都是.txt文件。
我们再来看每个txt文件里面到底是什么?下面是我的fish1_000001.txt文件内容:
0 0.441753 0.815461 0.061021 0.042763
0 0.395895 0.759868 0.066198 0.046053
0 0.497781 0.744737 0.060651 0.039474
0 0.575629 0.787171 0.059541 0.042763
0 0.566568 0.727303 0.059911 0.059868
0 0.561206 0.691447 0.058802 0.096053
0 0.523669 0.681908 0.054734 0.042763
0 0.549741 0.648355 0.061760 0.038816
0 0.622411 0.646382 0.051775 0.069079
0 0.700999 0.786184 0.056583 0.080263
0 0.688425 0.724671 0.041050 0.091447
0 0.679734 0.651974 0.062870 0.040789
0 0.669009 0.602632 0.044379 0.053947
0 0.614645 0.605263 0.049556 0.040789
0 0.568047 0.573355 0.049556 0.051974
0 0.529216 0.597697 0.052515 0.057237
0 0.470969 0.637171 0.057322 0.061184
0 0.452663 0.610197 0.063609 0.050658
0 0.396820 0.694408 0.054734 0.055921
0 0.340843 0.636322 0.053254 0.044737
0 0.280325 0.584211 0.051775 0.046053
0 0.346339 0.583553 0.057322 0.048684
0 0.711169 0.438158 0.024408 0.080263
0 0.681583 0.399342 0.023669 0.063158
0 0.367973 0.515132 0.036243 0.076316
0 0.353365 0.551645 0.042530 0.050658
0 0.296783 0.542763 0.029956 0.082895
0 0.249815 0.515461 0.024038 0.075658
0 0.286612 0.434868 0.035503 0.075000
0 0.286428 0.404276 0.019601 0.059868
0 0.375899 0.377303 0.040680 0.059868
0 0.560466 0.312171 0.030695 0.053289
0 0.538092 0.280592 0.011095 0.034868
0 0.543454 0.226316 0.028476 0.040789
0 0.357618 0.301974 0.017751 0.061842
0 0.386280 0.271711 0.037352 0.032895
0 0.397374 0.195395 0.040311 0.030263
0 0.280695 0.127632 0.035503 0.044737
0 0.338203 0.103289 0.041050 0.032895
0 0.405141 0.130263 0.043269 0.028947
0 0.429364 0.150987 0.043639 0.032237
0 0.429179 0.469079 0.038831 0.077632
0 0.427885 0.563158 0.048077 0.061842
0 0.482618 0.563487 0.064349 0.037500
0 0.551960 0.517105 0.051405 0.061842
0 0.549001 0.501316 0.040311 0.035526
0 0.718565 0.525329 0.028107 0.083553
0 0.655695 0.468750 0.023669 0.082237
0 0.697115 0.466776 0.025148 0.078289
0 0.526759 0.414306 0.034834 0.074178
0 0.533284 0.438158 0.039941 0.088158
0 0.506102 0.464145 0.029956 0.086184
0 0.477905 0.518336 0.045632 0.035868
0 0.387759 0.472039 0.049186 0.050658
0 0.381074 0.085451 0.036084 0.032638
0 0.394362 0.080737 0.032274 0.035539
0 0.323364 0.128533 0.037740 0.021592
0 0.435300 0.400431 0.040496 0.046112
0 0.372879 0.218283 0.038384 0.046645
0 0.337794 0.199641 0.031705 0.033257
0 0.291575 0.334826 0.022722 0.063849
0 0.245625 0.194227 0.015614 0.058296
0 0.644136 0.353197 0.014138 0.071395
0 0.589170 0.371263 0.016498 0.079026
0 0.627219 0.565461 0.063609 0.044079
0 0.626233 0.482260 0.031350 0.051836
0 0.630899 0.382102 0.019793 0.078401
0 0.561601 0.367086 0.024320 0.070987
0 0.585442 0.457530 0.034834 0.066480
0 0.255194 0.422036 0.016150 0.083941
0 0.314734 0.420063 0.017419 0.091270
0 0.268748 0.304063 0.033887 0.059151
0 0.266533 0.270260 0.033251 0.067046
0 0.326387 0.277299 0.022485 0.063099
0 0.318628 0.231951 0.022167 0.060283
0 0.258423 0.212891 0.034530 0.047336
0 0.274588 0.165941 0.032992 0.045776
0 0.358741 0.198010 0.014479 0.047928
0 0.367082 0.158563 0.041420 0.032928
0 0.601516 0.529605 0.061021 0.040789
0 0.301596 0.261954 0.022874 0.055553
0 0.312095 0.159832 0.032837 0.040757
0 0.334209 0.162372 0.036901 0.040559
0 0.367411 0.122694 0.033750 0.026086
0 0.411428 0.278618 0.014423 0.037500
0 0.389238 0.328289 0.026257 0.056579
可以看到里面是一行一行的数据组成,那么每行数据的每个数据分别表示什么意思呢?
以第一行数据0 0.441753 0.815461 0.061021 0.042763
为例,第一个0表示目标框框住物体的类别,我的数据集中只有鱼一个类别,因此都是每一行的第一个数据都是0,如果你自己的数据集有四类,假设有猫,狗,人,鱼,那么你可以将0-猫,1-狗,2-人,3-鱼。
再看后面几个小数, 0.441753 0.815461
表示的目标框的中心点,0.061021 0.042763
表示的是目标框的长和宽。这里又有同学要问了,为什么中心点和长宽都是小数?这就和YOLO创始人定义的labels格式有关了,这是人家定义的规则,我们照着做就行。那么具体是什么规则呢?
解释如下:
因此请各位自己根据自己标注的目标框转换成对应的YOLO目标框格式数据。上述我的该label文件中有87行数据,表示的是这一张图片中有87个目标框,每个目标框对应的类别都是0-鱼。如果有不知道如何转数据的同学,点赞收藏该博客然后关注我私聊,单独一对一教学
3.按比例划分数据集
在各位同学按照前三步准备好了图片和labels标签的前提下,按照YOLO系列的官方推荐比例训练集:验证集:测试集=7:2:1划分。
首先提前定义好存放训练集、验证集和测试集的空文件夹:
文件夹目录如下:
train、valid和test目录中都是如下结构:
提供以下脚本:
import os
import random
import shutil
# 设置目录路径
image_dir = 'D:/ModelsDatas/test/allimgs' # 改成你自己的原图片目录
label_dir = 'D:/ModelsDatas/test/alllables' # 改成你自己的原标签目录
# 获取图片和txt文件列表
images = os.listdir(image_dir)
labels = os.listdir(label_dir)
# 随机打乱图片列表
random.shuffle(images)
# 计算训练集、验证集和测试集的数量
total_images = len(images)
train_count = int(total_images * 0.7)
val_count = int(total_images * 0.2)
test_count = total_images - train_count - val_count
# 分配文件到训练集、验证集和测试集
train_images = images[:train_count]
val_images = images[train_count:train_count + val_count]
test_images = images[train_count + val_count:]
# 移动文件到对应的目录
for image in train_images:
# 移动图片和标签到训练集目录
shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/train/images') # 请改成你自己的训练集存放图片的文件夹目录
shutil.move(os.path.join(label_dir, image[:-4]+'.txt'), 'D:/ModelsDatas/YOLO_datasets/train/labels')# 请改成你自己的训练集存放标签的文件夹目录
for image in val_images:
# 移动图片和标签到验证集目录
shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/valid/images')# 请改成你自己的验证集存放图片的文件夹目录
shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/valid/labels')# 请改成你自己的验证集存放标签的文件夹目录
for image in test_images:
# 移动图片和标签到测试集目录
shutil.move(os.path.join(image_dir, image), 'D:/ModelsDatas/YOLO_datasets/test/images')# 请改成你自己的测试集存放图片的文件夹目录
shutil.move(os.path.join(label_dir, image[:-4] + '.txt'), 'D:/ModelsDatas/YOLO_datasets/test/labels')# 请改成你自己的测试集存放标签的文件夹目录
4.准备yaml文件,用于后续训练
文件命名为data.yaml,建议先放在与train、test和valid同级目录下,如下所示:
data.yaml中文件内容和说明如下:
names: # class names
- 0:fish # 类别号: 类别名称 (需要改成自己的)
#-1:cat #如果还有其他类别,以此往下加就行了,类别号请认真和自己当时目标框labels文件中的一一对应
#-2:dog
nc: 1 # number of classes 数据集中一共有几个类别,参考上面说的
path: ultralytics/datasets/det/fish2 # 数据集路径(需要改成自己的,也就是train、test和valid目录的上级目录)
train: train/images # 训练集路径(相对于数据集路径)
val: valid/images # 验证集路径(相对于数据集路径)
test: test/images # 测试集路径(相对于数据集路径)
如上,YOLO需要的自己数据集就构建完成了,接下来就是训练啦!!!还请各位同学多多点赞收藏,你们的认可是我继续更新更好文章的最大动力!!!