首页 > 其他分享 >【保姆级教程】YOLOv8目标检测:训练自己的数据集

【保姆级教程】YOLOv8目标检测:训练自己的数据集

时间:2024-03-24 14:33:50浏览次数:18  
标签:教程 val train YOLOv8 保姆 path txt os dir

一、YOLOV8环境准备

1.1 下载安装最新的YOLOv8代码

 仓库地址: https://github.com/ultralytics/ultralytics

1.2 配置环境

  pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

二、数据准备

2.1 安装labelme标注软件

pip install labelme

2.1.2 打开LabelImg软件

使用Anaconda Prompt启动labeme标注工具

在这里插入图片描述

2.2 标注自己的数据

在这里插入图片描述

2.3 数据处理

2.3.1 运行下面代码,将json格式标签转为txt格式标签

先创建txt文件夹,整体目录如下
在这里插入图片描述

import json
import os

name2id = {
"-":0,
"0":1,
"1":2,
"2":3,
"3":4,
"4":5,
"5":6,
"6":7,
"7":8,
"8":9,
"9":10,
"A":11,
"B":12,
"C":13,
"D":14,
"E":15,
"F":16,
"G":17,
"H":18,
"I":19,
"J":20,
"K":21,
"L":22,
"M":23,
"N":24,
"O":25,
"P":26,
"Q":27,
"R":28,
"S":29,
"T":30,
"U":31,
"V":32,
"W":33,
"X":34,
"Y":35,
"Z":36}
               
def convert(img_size, box):
    dw = 1./(img_size[0])
    dh = 1./(img_size[1])
    x = (box[0] + box[2])/2.0 - 1
    y = (box[1] + box[3])/2.0 - 1
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh

    x = round(x, 3)
    w = round(w, 3)
    y = round(y, 3)
    h = round(h, 3)
    return (x,y,w,h)
 
 
def decode_json(json_floder_path,json_name):
    
    # 需要手动新建下面目录的文件夹,根据自己实际情况而定
    txt_name = 'D:\\data\\slot-number\\wanda\\txt\\' + json_name[0:-5] + '.txt'
    txt_file = open(txt_name, 'w')
 
    json_path = os.path.join(json_floder_path, json_name)
    data = json.load(open(json_path, 'r', encoding='gb2312'))
 
    img_w = data['imageWidth']
    img_h = data['imageHeight']
 
    for i in data['shapes']:
        
        label_name = i['label']
        if (i['shape_type'] == 'rectangle'):
 
            x1 = int(i['points'][0][0])
            y1 = int(i['points'][0][1])
            x2 = int(i['points'][1][0])
            y2 = int(i['points'][1][1])
 
            bb = (x1,y1,x2,y2)
            bbox = convert((img_w,img_h),bb)
            txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')
    
if __name__ == "__main__":
    
    # D:\\data\\slot-number\\wanda\\json存放了labelme标注生成的json文件的文件夹
    json_floder_path = 'D:\\data\\slot-number\\wanda\\json'

    json_names = os.listdir(json_floder_path)
    for json_name in json_names:
        decode_json(json_floder_path,json_name)

查看转换后生成的yolo格式的txt标签文件
在这里插入图片描述
在这里插入图片描述

2.3.2 运行下面代码,划分数据集

在这里插入图片描述
在这里插入图片描述

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
import argparse
 
 
# 检查文件夹是否存在
def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)
 
def main(image_dir, txt_dir, save_dir):
    # 创建文件夹
    mkdir(save_dir)
    images_dir = os.path.join(save_dir, 'images')
    labels_dir = os.path.join(save_dir, 'labels')
 
    img_train_path = os.path.join(images_dir, 'train')
    img_test_path = os.path.join(images_dir, 'test')
    img_val_path = os.path.join(images_dir, 'val')
 
    label_train_path = os.path.join(labels_dir, 'train')
    label_test_path = os.path.join(labels_dir, 'test')
    label_val_path = os.path.join(labels_dir, 'val')
 
    mkdir(images_dir);
    mkdir(labels_dir);
    mkdir(img_train_path);
    mkdir(img_test_path);
    mkdir(img_val_path);
    mkdir(label_train_path);
    mkdir(label_test_path);
    mkdir(label_val_path);
 
    # 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
    train_percent = 0.8
    val_percent = 0.1
    test_percent = 0.1
 
    total_txt = os.listdir(txt_dir)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)
 
    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val
 
    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)
 
    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]
 
        srcImage = os.path.join(image_dir, name + '.png')
        srcLabel = os.path.join(txt_dir, name + '.txt')
 
        if i in train:
            dst_train_Image = os.path.join(img_train_path, name + '.png')
            dst_train_Label = os.path.join(label_train_path, name + '.txt')
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = os.path.join(img_val_path, name + '.png')
            dst_val_Label = os.path.join(label_val_path, name + '.txt')
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = os.path.join(img_test_path, name + '.png')
            dst_test_Label = os.path.join(label_test_path, name + '.txt')
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)
 
 
if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='split datasets to train,val,test params')
    parser.add_argument('--image-dir', type=str,default='D:/data/slot-number/wanda/image', help='image path dir')
    parser.add_argument('--txt-dir', type=str,default='D:/data/slot-number/wanda/txt' , help='txt path dir')
    parser.add_argument('--save-dir', default='D:/study/cnn/yolo/ultralytics/dataset',type=str, help='save dir')
    args = parser.parse_args()
    image_dir = args.image_dir
    txt_dir = args.txt_dir
    save_dir = args.save_dir
 
    main(image_dir, txt_dir, save_dir)

2.3.3 使用脚本,获取训练集,验证集的txt标签的路径

三、配置文件设置

3.1 修改coco8.yaml

修改ultralytics\ultralytics\cfg\datasets\coco8.yaml配置文件内容:(建议使用绝对路径)

path: D:/data/slot-number/
train: images/train
val: images/val
test:


names:
  0: sign -
  1: nubmer 0
  2: nubmer 1
  3: nubmer 2
  4: nubmer 3
  5: nubmer 4
  6: nubmer 5
  7: nubmer 6
  8: nubmer 7
  9: nubmer 8
  10: nubmer 9
  11: A
  12: B
  13: C
  14: D
  15: E
  16: F
  17: G
  18: H
  19: I
  20: J
  21: K
  22: L
  23: M
  24: NN
  25: O
  26: P
  27: Q
  28: R
  29: S
  30: T
  31: U
  32: V
  33: W
  34: X
  35: YY
  36: Z

四、训练

4.1 下载预训练权重

在YOLOv8 github上下载预训练权重:yolov8n.pt,ultralytics\ultralytics\路径下,新建weights文件夹,预训练权重放入其中。
在这里插入图片描述

4.2 训练

步骤一:修改ultralytics\ultralytics\cfg\default.yaml文件中的训练参数(根据自己的实际情况决定)
步骤二:执行下面代码:(建议使用绝对路径)

在这里插入图片描述

五、验证

#验证目标检测代码
from ultralytics import YOLO

# Load a model
model = YOLO('D:/study/cnn/yolo/ultralytics/runs/detect/train3/weights/best.pt')

# Train the model
results = model.val(data='D:/study/cnn/yolo/ultralytics/ultralytics/cfg/datasets/coco8.yaml', epochs=700, imgsz=640)

在这里插入图片描述
查看模型验证的其中一张图片结果
在这里插入图片描述

六、推理

根据自己实际的情况,修改路径(建议使用绝对路径)

# YOLOv8目标检测推理代码
from ultralytics import YOLO

# Load a model
model = YOLO('D:/study/cnn/yolo/ultralytics/runs/detect/train3/weights/best.pt')

# Predict with the model
results = model('D:/study/cnn/yolo/ultralytics/slot-number/images/train/1.png',save=True)  # predict on an image

在这里插入图片描述
在这里插入图片描述

标签:教程,val,train,YOLOv8,保姆,path,txt,os,dir
From: https://blog.csdn.net/m0_51579041/article/details/136975529

相关文章

  • 【保姆级教程】YOLOv8_Track多目标跟踪,快速运行
    一、YOLOV8环境准备1.1下载安装最新的YOLOv8代码仓库地址:https://github.com/ultralytics/ultralytics1.2配置环境pipinstall-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple二、下载测试视频,预训练权重测试视频链接:https://pan.baidu.c......
  • MATLAB 2024a安装包下载及安装教程
    下载链接:https://docs.qq.com/doc/DUllzRVRSZ2VZcWxO1.选中下载的安装包,右键选择解压到"MATLABR2024a"文件夹2.双击打开“setup”文件夹3.找到并选中“setup.exe”鼠标右键选择以管理员身份运行4.点击“是”,点击“下一步”5.复制"21471-07182-41807-00726-......
  • 26版SPSS操作教程(初级第七章)
    前言#由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次第六章的学习笔记,希望能得到一些指正和帮助~#第七章一些学习笔记SPSS中集中趋势的描述指标(位置统计量)有算术均数(ArithmeticMean)、中位数(Median)、截尾均数(TrimmedM......
  • YoloV8改进策略:Block改进|ECA-Net:用于深度卷积神经网络的高效通道注意力|ECA+压缩膨胀
    摘要arxiv.org/pdf/1910.03151.pdf最近,通道注意机制已被证明在改善深度卷积神经网络(CNN)的性能方面具有巨大潜力。然而,大多数现有方法致力于开发更复杂的注意模块以实现更好的性能,这不可避免地会增加模型的复杂性。为了克服性能和复杂性折衷之间的矛盾,本文提出了一种有效......
  • SQL-Labs靶场“34-35”关通关教程
    君衍.一、34关POST单引号宽字节注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入二、35关GET数字型报错注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入SQL-Labs靶场通关教程:SQL注入第一课SQL注入思路基础SQL无......
  • [ROS 系列学习教程] rqt可视化工具箱 - 日志工具
    ROS系列学习教程(总目录)本文目录零、rqt可视化工具箱一、rqt_console二、rqt_logger_level零、rqt可视化工具箱rqt是ROS的一个软件框架,以插件的形式实现各种GUI工具。可以在rqt中将所有现有的GUI工具作为子窗口运行,也可以以独立方法运行,但rqt可以更轻松地同......
  • AlpineTerm使用教程
    AlpineTerm使用教程上一篇文章介绍了如何使用termux和qemu来搭建alpine虚拟机进而使用docker,而alpineterm是GitHub上面的大神做的封装,使用更加方便安装alpineterm可以从GitHub上面进行下载,由于许久没有更新,请下载最新release即可,大概500MB左右使用升级内核并更新系统通过......
  • RTL8812au网卡安装驱动教程
    购买网卡:https://item.jd.com/10083411831503.html使用说明上没有Linux系统的驱动安装教程,于是根据使用说明上面的下载链接下载了驱动的安装教程和驱动(网卡盒子里面有光盘,但是我没有用),但是下载出的驱动层层套娃,最后使用了Ubuntu12.04才安装完成下面是具体教程:首先,你需要安装......
  • .net core 实例教程(一)新建项目
    本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V本实例教程将开发一个角色管理系统。主要包http://www.80cxy.com/Blog/ArticleView?arId=20240319151......
  • 基于springboot的线上买菜系统(含源码+sql+视频导入教程)
    ......