目的
目的是要有滴,写这篇博客的目的是为了记录炼丹过程,把这些过程中使用模型、使用方法、以及遇到的错误进行记录,到后续使用或者改进时有一个更好的指引。同时,也分享给需要这篇博客的友友们。博主能力有限,还请轻喷!!!!!!!!!!!!
一、环境配置
源代码文件夹中会有requirements.txt文件,里面包含了运行YOLOv8的最低环境配置。此处加了pip清华源镜像,能提高下载速度!!!!!!!!不需要的可以把-i和后面的删掉。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
先这样安装吧,出问题再说。
例外还要安装ultralytics ,运行YOLOv8代码需要这个依赖包里面(虽然不知道为什么本地有源代码了还要通过pip安装,总之先装了就是了),可通过以下命令安装:
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
其实,torch可以单独装,因为通过pip安装真的太慢了,这次就不写torch的安装了,有需要的话可私,然后可以写一写。。
二、代码下载及验证
下载作者使用的YOLOv8源码
三、数据集制作
YOLOv8采用YOLO格式的数据集,如果使用Labelimg标注的格式就是YOLO格式的可以不看本节。如果不是YOLO格式的话可以参照一下步骤进行转换(转换软件可私,功能还不完善,后期会更新):
1、打开格式转换器
1、选择模式,根据当前数据集格式和转换成需要的数据集格式选择当前模式。
2、填写类别;其中txt2xml、txt2json等模式转换时需要按照txt中的类别顺序填写类别栏,同时使用英文的分号(;)进行分割。
3、图片地址;选择与标签名字对应的图片的文件路径,数量与标签文件数量一致
4、标签地址;选择与图片名字对应的标签路径,注意,json转其他模式时标签地址为json的文件路径。
5、保存地址;尽量选择空文件夹作为保存路径,在该目录下会生成images和lables文件夹,其中images中存放格式转换后的图片文件,注意,这里只是将图片按存在的标签文件进行了复制,并没有对图片进行任何操作;labels中存放转换后的标注文件信息。
6、点击开始转换,并等待。这里若出现错误,可在评论区提出或撕信解决!!!!!
7、结果展示!
2、数据集划分
第一种情况:上一步前数据集没有划分过,即图片和标签都分别在一个文件夹中,如下图:
在images下训练的图片,没有划分train和val,在labels也是如此,注意,images和lables中的文件数量和名字要匹配。
此时,经过第一步的转换后需要使用下面代码进行数据集划分:
import os
import random
import shutil
from tqdm import tqdm
def split_datasets(img_path, label_path, save_path, ratio, is_shuffle):
assert sum(ratio)==1,"训练集、验证集、测试集的比例总和应该为1"
assert img_path and label_path and save_path,"路径不能为空,请检查路径!"
assert len(img_path) and len(label_path),"数据集中图片或标签为空!"
label_set=[i.split(".")[0] for i in os.listdir(label_path)]
img_set={i.split(".")[0]:i for i in os.listdir(img_path) if i.split(".")[0] in label_set}
random.shuffle(label_set) if is_shuffle else None
set_name=["train","val","test"] if ratio[-1] else ["train","val"]
for folder in ["images","labels"]:
for name in set_name:
path="/".join([save_path,folder,name])
if not os.path.exists(path):
os.makedirs(path)
else:
shutil.rmtree(path)
os.makedirs(path)
num_sample=len(label_set)
img_num=0
for i,mode in enumerate(set_name):
chocie_num = int(ratio[i]*num_sample)
sample = random.sample(label_set,chocie_num)
bar=tqdm(sample,f"正在处理{mode}文件数据...",total=chocie_num)
for j,k in enumerate(bar):
shutil.copy(os.path.join(img_path,img_set[k]),"/".join([save_path,"images",mode,img_set[k]]))
shutil.copy(os.path.join(label_path,k+".txt"),"/".join([save_path,"labels",mode,k+".txt"]))
label_set.remove(k)
bar.update(1)
pass
img_num+=chocie_num
pass
print(f"处理完成!一共{img_num}张图片和标注文件")
pass
if __name__=="__main__":
img_path="D:\yiwu\labels\images/train/"
label_path="D:\yiwu\labels\labels//train/"
save_path="D:\yiwu\labels\save/"
ratio = [0.8, 0.1, 0.1] # train,val,test
is_shuffle=True
split_datasets(img_path, label_path, save_path, ratio,is_shuffle)
pass
代码说明:上述代码功能仅仅是划分yolo格式的数据集。其中img_path,label_path,save_path后面需要加上斜杠,is_shuffle的值用于规定是否将数据集打乱,运行上述代码会在save_path下产生两个文件夹,分别是images和labels,每个文件夹下面会产生train,val,test(可选)三个文件夹,并且存放了划分好的图片和标注文件。
第二种情况:在使用格式转换器前已经划分好数据集,只需多次执行格式转换即可
四、开始训练
第一步:
images和labels中存放上一步划分好的train,val,test(可选)三个文件夹。
第二步
在yolov8目录下新建mydata.yaml(名字可变),输入与数据集相关的信息:
path: data # datasets里的data(和上面自定义的名字要一样)文件夹
train: images/train #data目录下的images文件夹
val: images/val
# test: images/test 可选
# number of classes
nc: 3 #修改类别数,和namse大小一致
# class names
names: #按照自己类别按转换顺序更改
0: person
1: car
2: stone
在yolov8目录下新建mytrain.py(名字可变),输入以下内容:
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO("ultralytics/models/v8/yolov8.yaml")
model.train(data="mydata.yaml", workers=0, epochs=5, batch=2)
这里需要注意,如果data参数不是和mytrain.py在同一目录下的话需要修改为相对路径,后面的workers、epochs、batch等参数按电脑配置更改。 如需更改更多的配置参数可以在目录:ultralytics\yolo\cfg\default.yaml中进行修改,右键运行即可开始训练。
以上就是训练的过程
五、验证和预测展示
1、验证
修改mytrain.py中代码为
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO("runs\detect/train3/weights/best.pt")#修改为训练后产生的权重文件路径
# model.train(data="mydata.yaml", workers=0, epochs=5, batch=2)
model.val(data="mydata.yaml",workers=0, batch=2)
右键运行即可,本文截图仅作为流程参考,不代表v8的检测能力。
2、预测过程
修改mytrain.py中代码为
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO("runs\detect/train3/weights/best.pt")
# model.train(data="yw.yaml", workers=0, epochs=5, batch=2)
# model.val(data="yw.yaml",workers=0, batch=2)
model.predict(data="path/to/your/img")
注意,预测时data参数可以是一张图片、一个文件夹等,详细可查看https://docs.ultralytics.com/zh/modes/predict/#inference-sources