YOLO V5 训练自定义数据集

请注意:各个文件路径不能有中文

一. 环境搭建

  1. 从github上克隆仓库到本地
    https://github.com/ultralytics/yolov5
    VSCode 克隆仓库需要安装Git
    image.png
    image.png

  2. 搭建Yolo5环境
    项目下requirements.txt文件中为Yolo环境所依赖的外部库
    可通过pip单独安装,也可CMD运行requirements.txt批量安装
    image.png
    image.png
    image.png
    image.png

C:\Users\viarondu>cd C:\Users\viarondu\Desktop\01\YOLO\yolov5
C:\Users\viarondu\Desktop\01\YOLO\yolov5>pip install -r requirements.txt

二. 图像标注

标注方案一 使用labelImg标注(推荐)

  1. 双击运行指定软件
    image.png

  2. 设置文件夹路径
    image.png

  3. 打开自动保存设置
    image.png

  4. 框定对象进行标注
    image.png

  5. 在yolo5的data文件下创建以下文件夹:
    image.png
    images存放所有标注图片
    JPEGImages存放的和images文件的内容一样,也是存放所有标注图片
    Annotations存放标注的xml文件,将labelImg导出文件下生成的标注xml文件拷贝到此文件夹内
    image.png
    image.png

标注方案二 使用VoTT

使用VoTT标注导出的文件可能在Yolo中报错

  1. 下载 VoTT(视觉对象标记工具)。

  2. 打开 VoTT,选择“新建项目”。
    image.png
    image.png

  3. 在“项目设置”中,将“显示名称”更改为项目名称。

  4. 更改安全令牌,以生成新的安全令牌。

  5. 在“源连接”旁边,选择“添加连接”。

  6. 在“连接设置”中,设置图像文件夹。
    image.png

  7. 在“项目设置”中,将“源连接”更改为 刚创建的连接。

  8. 将“目标连接”也更改为 更改为 刚创建的连接,现在应类似于以下屏幕截图:
    image.png

  9. 选择“保存项目”。
    添加标记并为图像添加标签
    现在,你应该会看到一个窗口,其中左侧是所有训练图像的预览图像,中间是所选定图像的预览图像,右侧是标记列。

  10. 选择“标记”工具栏中的第一个(加号形状)图标,以添加新标记。

  11. 将标记命名为“Stop-Sign”,然后在键盘上按 Enter 键。

  12. 单击并拖动鼠标,围绕图像中的每个停车标志绘制一个矩形。 如果无法使用光标绘制矩形,请尝试从顶部的工具栏中选择“绘制矩形”工具,或使用键盘快捷键 R。

  13. 绘制矩形后,选择在前面的步骤中创建的 Stop-Sign 标记,将此标记添加到边界框。

  14. 单击数据集中下一个图像的预览图像,重复此过程。

  15. 继续对每个图像中的每一个停车标志进行标准。

导出Pascal VOC
为所有训练图像添加标签后,可以导出文件,以便 Model Builder 使用它进行训练。

  1. 选择左侧工具栏中的第四个图标(框中包含斜箭头的图标),以转到“导出设置”。

  2. 将“提供程序”保留为Pascal VOC。

  3. 选择“保存导出设置”。
    image.png

  4. 返回到“标记编辑器”(形状类似功能区的左侧工具栏中的第二个图标)。 在顶部工具栏中,选择“导出项目”图标(最后一个图标,形状类似包含箭头的框),或使用键盘快捷键 Ctrl+E。
    此导出操作将在图像资源文件夹下件新建一个名为*****-PascalVOC-export的文件夹,并将在此新文件夹中生成如下标注文件:
    image.png

  5. 将VoTT导出的文件如下:
    image.png
    拷贝到YOLO项目的data文件夹下,并新建images和labels文件夹
    images存放训练照片,需将训练照片拷贝一份存于此文件下
    image.png

三. YOLO项目标注配置文件生成

  1. 生成Yolo标注配置文件

在yolov5的根目录下创建一个trans_txt.py文件,文件代码如下:

import os
import random
trainval_percent = 0.1
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:
    ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
  1. 继续创建voc_label.py文件,代码如下:
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets = ['train', 'test','val']

# classes数组输入打的标签种类
classes = ['heros','soliders','tower','red_buff','blue_buff','pig','wolf','bird','lizards']
def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    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))
    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
        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))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
print(wd)
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('data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()


这个文件需要修改,代码中
classes = [‘heros’,‘soliders’,‘tower’,‘red_buff’,‘blue_buff’,‘pig’,‘wolf’,‘bird’,‘lizards’]这一条语句需要根据你打标签的时候的类别进行修改,有几类写几类;
依次运行trans_txt.py和voc_label.py两个文件,将在:
(1) labels下生成txt文件(显示数据集的具体标注数据)
image.png
(2) ImageSets下生成四个txt文件
image.png
(3)data下生成三个txt文件(带有图片的路径)
image.png

四. YOLO训练参数设置

  1. 设置data文件下coco.yaml文件

image.png

参数说明:

path: ../datasets/coco  # dataset root dir  datasets根路径,这里不使用,不做修改
# 训练图片标注文件
train: C:/Users/viarondu/Desktop/01/YOLO/yolov5/data/train.txt  # train images (relative to 'path') 118287 images
# 验证图片标注文件
val: C:/Users/viarondu/Desktop/01/YOLO/yolov5/data/val.txt  # val images (relative to 'path') 5000 images
#测试文件标注文件
test: C:/Users/viarondu/Desktop/01/YOLO/yolov5/data/test.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794


# Classes  对象标签,有几类就填几类,ID从0开始
names:
  0: Stop-Sign

image.png

  1. models模型文件的修改

image.png
本案例中选择Yolov5m网络结构,此网络结构兼顾了速度和准确率
找到models文件夹下面的yolov5m.yaml,将nc改为识别对象种类的数量即可
image.png

  1. 权重文件配置

在yolov5文件夹下创建一个名为weights的文件夹,然后把data/scripts文件下download_weights.sh放在weights文件下;
权重文件下载地址:

将下载后的权重文件存放于weights文件下:
image.png
4. 设置train.py文件
image.png
1.–weights: 权重文件地址
2.–cfg: 模型文件地址,路径就是models文件夹下面的yolov5s.yaml,如果使用的是其他模型,修改为models文件下的对应模型的yaml文件即可
3.–data: 这个路径就选我们在第四个步骤中自己配置的yaml文件,我的是coco_Aron.yaml
4.–epochs:训练过程中整个数据集将被迭代多少次
5.–batch-size:一次看完多少张图片才进行权重更新,最好是2的倍数,设为-1则根据电脑配置自动调整

五. 训练并测试结果

设置完成后,运行train.py
image.png

训练完成后,在yolov5\runs\train\exp路径下会生成对应权重文件
image.png
image.png
测试结果:
设置detect.py文件
image.png
关键参数说明:
–weights:训练完成后导出的权重文件地址
–source:测试文件路径
–conf-thres:得分阈值
–max-det:单个图像查找到的最大对象数量
运行detect.py文件:
在yolov5\runs\detect\exp
路径下会生成最终识别结果
image.png
andrii-leonov-W_rQAwVRPgg-unsplash.jpg

猜你喜欢

转载自blog.csdn.net/weixin_40671962/article/details/128276933