YOLOv8训练自己的数据集+常用传参说明_yolov8 names

深度学习环境搭建就不再重复了,可以查看上篇文章:如何安装 Anaconda,安装好之后使用conda命令创建一个新的环境,此环境还需包含PyTorch>=1.8,命令如下:

-- 创建环境
conda create -n yolov8 python=3.8

-- 激活环境
conda activate yolov8

安装依赖:

pip install ultralytics

--验证环境是否安装成功
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

安装完ultralytics之后就可以通过命令使用yolov8进行目标检测了,使用命令可以参考YOLO官网的快速开始教程:YOLO官网快速开始教程,但我们并不只是想用官方的模型权重,而是要训练和改进为自己的数据集,所以要下载下来源码进行运行改进

Yolov8 的源代码下载:

https://github.com/ultralytics/ultralytics

在这里插入图片描述
可见我这里环境已配置好,运行结果正常,并且运行结果保存在D:\git\ai\yolov8\ultralytics\runs\detect\predict

二、制作自己的数据集

2.1 准备工作

在ultralytics目录下新建data文件夹,下再新建四个文件夹,先说明这四个文件夹分别是用来干什么的,后面会往里面一一加入需要添加的内容。

  • Annotations文件夹:用来存放使用labelimg给每张图片标注后的xml文件,后面会讲解如何使用labelimg进行标注。
  • Images文件夹:用来存放原始的需要训练的数据集图片,图片格式为jpg格式。
  • ImageSets文件夹:用来存放将数据集划分后的用于训练、验证、测试的文件。
  • Labels文件夹:用来存放将xml格式的标注文件转换后的txt格式的标注文件。

先在根目录下创建好对应的文件夹,最终效果如图所示:
在这里插入图片描述

2.2 准备数据集

我做的是关于小麦病害的检测,根据采集的数据集将小麦病害划分为7个种类,分别为白粉病、赤霉病、叶锈病、条锈病、颖枯病、正常麦穗、正常麦叶。下图为数据集的一部分,共准备了四千多张原始图片,大约每个种类600张。此处会用到一个非常高效的重命名方式,就不用一张一张图片的进行重命名。批量重命名的代码如下。4000张图片准备好后就放在images文件夹中即可。
在这里插入图片描述

python批量重命名:

import os
class BatchRename():
    '''
    批量重命名文件夹中的图片文件
    '''
    def __init__(self):
        self.path = 'D:\git\ultralytics\data\images'   #表示需要命名处理的文件夹
        self.new\_path='D:\git\ultralytics\data\images\new'
    def rename(self):
        filelist = os.listdir(self.path)    #获取文件夹中文件的所有的文件
        total_num = len(filelist)           #获取文件长度(个数)
        i = 1  #表示文件的命名是从1开始的
        for item in filelist:
            if 1:  #初始的图片的格式为jpg格式的(或者源文件是png格式及其他格式,后面的转换格式就可以调整为自己需要的格式即可)
                src = os.path.join(os.path.abspath(self.path), item)     #连接两个或更多的路径名组件
                # dst = os.path.join(os.path.abspath(self.new\_path), ''+str(i) + '.jpg')#处理后的格式也为jpg格式的,当然这里可以改成png格式
                dst = os.path.join(os.path.abspath(self.path), 'wheat' + format(str(i), '0>3s') + '.jpg')    #这种情况下的命名格式为0000000.jpg形式,可以自主定义想要的格式
                try:
                    os.rename(src, dst)    #src – 要修改的目录名 dst – 修改后的目录名
                    print('converting %s to %s ...' % (src, dst))
                    i = i + 1
                except:
                    continue
        print ('total %d to rename & converted %d jpgs' % (total_num, i))
 
if __name__ == '\_\_main\_\_':
    demo = BatchRename()
    demo.rename()

2.3 使用labelimg进行标注

labelimg的安装很简单,直接使用pip命令安装就可以

安装labelimg

pip install labelimg

启动
labelimg


Labelimg是一个图像标注工具,软件使用非常简单,安装成功后直接输入labelimg就可以直接启动
labelimg
使用说明:

(1)Open就是打开图片,我们不需要一张一张的打开,太麻烦了,使用下面的Open Dir

(2)Open Dir就是打开需要标注的图片的文件夹,这里就选择images文件夹

(3)change save dir就是标注后保存标记文件的位置,选择需要保存标注信息的文件夹,这里就选择Annotations文件夹

(4)特别注意需要选择好所需要的标注文件的类型。有yolo(txt), pascalVOC (xml)两种类型。yolo需要txt文件格式的标注文件,但是这里我们选择pascalVOC,后面再将xml格式的标注文件转化为所需的txt格式。

(5)按W键或点击Create\nRectBox开始创建矩形框,把要进行识别训练的区域标记出来就行,选好框后我们选是什么类别(predefined_classes文件,在里面提前写好要训练的类型的原因),整张图片的所有目标都标记好了之后按Ctrl+S或点击Save保存 ,然后切换下一张继续,快捷键为按D键,每一张图片标记后都要保存,这个过程是一个比较繁琐的过程

在这里插入图片描述
整张图片的所有目标都标记好了之后按Ctrl+S或点击Save保存 ,然后切换下一张继续,快捷键为按D键,每一张图片标记后都要保存,这个过程是一个比较繁琐的过程.

标注之后的效果如下图所示,会在目标目录生成对应的xml文件
在这里插入图片描述

2.4 4.数据集的划分

在ultralytics的根目录下创建一个脚本,创建一个split_train_val.py文件,运行文件之后会在imageSets文件夹下将数据集划分为训练集、验证集、测试集,里面存放的就是用于训练、验证、测试的图片名称。代码内容如下:

import os
import random
 
 
trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
 
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
 
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
 
for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

2.5 5.转换数据集格式

创建voc_label.py文件,他的作用:(1)就是把Annoctions里面的xml格式的标注文件转换为txt格式的标注文件,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height。

(2)就是运行后除了会生成转换后labels文件夹下的60张图片的txt文件,还会在data文件夹下得到三个包含数据集路径的txt文件,train.tx,tes.txt,val.txt这3个txt文件为划分后图像所在位置的绝对路径,如train.txt就含有所有训练集图像的绝对路径。

 
import xml.etree.ElementTree as ET
import os
from os import getcwd
 
sets = ['train', 'val', 'test']
# 改成你自己的分类
classes = ['Powdery Mildew','Scab','Leaf Rust','Stripe Rust','Glume Blotch','Wheat Ear','Wheat Leaf']
abs_path = os.getcwd()
print(abs_path)
 
def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h
 
def convert_annotation(image_id):
    in_file = open('data/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('data/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        # difficult = obj.find('difficult').text
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
 out\_file.write(str(cls\_id) + " " + " ".join([str(a) for a in bb]) + '\n')
 
wd = getcwd()
for image\_set in sets:
 if not os.path.exists('data/labels/'):
 os.makedirs('data/labels/')
 image\_ids = open('data/ImageSets/%s.txt' % (image\_set)).read().strip().split()
    list_file = open('data/%s.txt' % (image_set), 'w')
    for image\_id in image_ids:
        list_file.write(abs_path + '/data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

2.6 编写数据集配置文件

创建 wheat.yaml
内容如下,其文件路径正是上文生成的划分配置集文件
nc代表类别数量,比如我这里是7个分类
names是每个分类名称

train: D:\git\ai\yolov8\data\train.txt
val: D:\git\ai\yolov8\data\val.txt
test: D:\git\ai\yolov8\data\test.txt


### 刷面试题

刷题的重要性,不用多说。对于应届生或工作年限不长的人来说,刷面试题一方面能够尽可能地快速自己对某个技术点的理解,另一方面在面试时,有一定几率被问到相同或相似题,另外或多或少也能够为自己面试增加一些自信心,可见适当的刷题是很有必要的。



* **前端字节跳动真题解析**  

  ![](https://img-blog.csdnimg.cn/img_convert/8d27500df7b25342f252bca635ca0ab3.png)

* **【269页】前端大厂面试题宝典**  

  ![](https://img-blog.csdnimg.cn/img_convert/eac3322374bd31596de9bf548f6ce47f.png)


最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值