YOLOv8训练自己数据集

目的

目的是要有滴,写这篇博客的目的是为了记录炼丹过程,把这些过程中使用模型、使用方法、以及遇到的错误进行记录,到后续使用或者改进时有一个更好的指引。同时,也分享给需要这篇博客的友友们。博主能力有限,还请轻喷!!!!!!!!!!!!

一、环境配置

源代码文件夹中会有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源码

三、数据集制作

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

  • 26
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
YOLOv8(You Only Look Once version 8)是一种实时物体检测算法,它在YOLO系列中属于较新的版本。训练自己的数据集主要是为了让你的模型能够识别特定场景下的物体。以下是训练YOLOv8自定义数据集的一般步骤: 1. 数据准备:收集或创建包含目标类别及其标注的图像数据集。每个图片应该有对应的目标框位置信息和类别标签。 2. 数据预处理:使用YOLOv8提供的工具,如darknet的数据转换脚本(data_generator.py),将图片和标签转换成Darknet所需的文件格式,通常为`.txt`和`.cfg`配置文件。 3. 定制配置文件:修改`yolov8.cfg`配置文件,更改网络结构、锚点和其他超参数以适应你的数据集特性。 4. 准备Darknet库:确保安装了正确的版本,并设置环境变量指向darknet源码目录。 5. 搭建训练环境:如果你是在GPU环境下,可以使用CUDA和cuDNN加速训练过程。如果使用CPU,则需调整batch size以适应计算资源。 6. 开始训练:运行命令行工具,例如`./darknet train data/your_dataset cfg/yolov8.cfg yolov8.weights`,这里`your_dataset`是你的数据集路径,`yolov8.weights`是初始权重文件(可以选择预训练模型或从头开始训练)。 7. 监控和调整:训练过程中会生成日志,观察损失函数和mAP等指标,根据需要调整学习率、批次大小等参数。 8. 评估和验证:定期保存训练进度,使用验证集测试模型性能并优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值