(2024.10.28)使用YOLOv8训练自己的目标检测模型

收集数据集:

1.使用开源已标记数据集

2.自己网上搜索下载。

 3.可以将图片几何变换,类似翻转、裁剪、旋转和平移,就变成多张图片了

标注数据集 :

常用的标注工具有很多,比如LabelImg(易崩溃)LabelMe(bug)VIA等,但是这些工具都需要安装使用,我这里给大家介绍一款在线标注数据集的工具Make Sense打开即用,非常的便捷,在标注之前,我们来看一下一般情况下遵循的标注规则
  1. 目标框必须框住整个目标物体,不能有遗漏和重叠。
  2. 目标框应该与目标物体尽可能接近,但不能与目标物体重合。
  3. 目标框的宽度和高度应该为正数,不能为零或负数。
  4. 如果一张图片中有多个目标物体,每个目标物体应该用一个独立的目标框进行标注,不允许多个目标共用一个框。
  5. 如果目标物体的形状不规则,可以使用多个框进行标注,但必须框住整个目标物体。
  6. 目标框的坐标必须在数据集中统一。

 中文版网页:

Make Sense - 在线图像标注 - BimAnticon-default.png?t=O83Ahttp://makesense.bimant.com/英文版网页:

Make Senseicon-default.png?t=O83Ahttps://www.makesense.ai/

标注前请确定:

  1. 请将标注的图片的格式全部归为一样,不然后续代码运行不能将png和jpe的格式分开
  2.  请查看项目文件数目和文件命名最后那个数目一样,中间不要纯在相同名称,不同格式,格式也只能有一种

 

注意这里要在右边选上你的标签,不然是空压缩包

全部标记完成后:

我们点击Action -> Export Annotation 导出 yolo 格式的标签文件压缩包解压后是这样的:

0表示第一个标签

 

shuju1是图片

shuju2是解压后的标注文件

但是 YOLOv8 所需要的数据集路径的格式是下面这样子的(YOLOv8支持不止这一种格式),我们接下来要通过脚本来来划分一下数据集: 

├── yolov8_dataset
	└── train
		└── images (folder including all training images)
		└── labels (folder including all training labels)
	└── test
		└── images (folder including all testing images)
		└── labels (folder including all testing labels)
	└── valid
		└── images (folder including all testing images)
		└── labels (folder including all testing labels)

这里使用脚本分类:

# by CSDN 迪菲赫尔曼
import os
import random
import shutil

def copy_files(src_dir, dst_dir, filenames, extension):
    os.makedirs(dst_dir, exist_ok=True)
    missing_files = 0
    for filename in filenames:
        src_path = os.path.join(src_dir, filename + extension)
        dst_path = os.path.join(dst_dir, filename + extension)
        
        # Check if the file exists before copying
        if os.path.exists(src_path):
            shutil.copy(src_path, dst_path)
        else:
            print(f"Warning: File not found for {filename}")
            missing_files += 1

    return missing_files

def split_and_copy_dataset(image_dir, label_dir, output_dir, train_ratio=0.7, valid_ratio=0.15, test_ratio=0.15):
    # 获取所有图像文件的文件名(不包括文件扩展名)
    image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]

    # 随机打乱文件名列表
    random.shuffle(image_filenames)

    # 计算训练集、验证集和测试集的数量
    total_count = len(image_filenames)
    train_count = int(total_count * train_ratio)
    valid_count = int(total_count * valid_ratio)
    test_count = total_count - train_count - valid_count

    # 定义输出文件夹路径
    train_image_dir = os.path.join(output_dir, 'train', 'images')
    train_label_dir = os.path.join(output_dir, 'train', 'labels')
    valid_image_dir = os.path.join(output_dir, 'valid', 'images')
    valid_label_dir = os.path.join(output_dir, 'valid', 'labels')
    test_image_dir = os.path.join(output_dir, 'test', 'images')
    test_label_dir = os.path.join(output_dir, 'test', 'labels')

    # 复制图像和标签文件到对应的文件夹
    train_missing_files = copy_files(image_dir, train_image_dir, image_filenames[:train_count], '.jpg')
    train_missing_files += copy_files(label_dir, train_label_dir, image_filenames[:train_count], '.txt')

    valid_missing_files = copy_files(image_dir, valid_image_dir, image_filenames[train_count:train_count + valid_count], '.jpg')
    valid_missing_files += copy_files(label_dir, valid_label_dir, image_filenames[train_count:train_count + valid_count], '.txt')

    test_missing_files = copy_files(image_dir, test_image_dir, image_filenames[train_count + valid_count:], '.jpg')
    test_missing_files += copy_files(label_dir, test_label_dir, image_filenames[train_count + valid_count:], '.txt')

    # Print the count of each dataset
    print(f"Train dataset count: {train_count}, Missing files: {train_missing_files}")
    print(f"Validation dataset count: {valid_count}, Missing files: {valid_missing_files}")
    print(f"Test dataset count: {test_count}, Missing files: {test_missing_files}")

# 使用例子
image_dir = 'datasets/coco128/images/train2017'//可以使用根本路径
label_dir = 'datasets/coco128/labels/train2017'
output_dir = './my_dataset'//自己建一个文件夹,输出结构文件夹

split_and_copy_dataset(image_dir, label_dir, output_dir)

这个脚本是处理jpg格式的图片文件。如果需要处理其他格式自己修改代码中出现JPG的地方,处理完后的格式为下图所示,

 训练模型 

在yolo v8的项目文件下建一个新建一个数据集yaml文件

# moncake
train: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\train //路径
val: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\valid 
test: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\test
nc:1   //这里是下面标签总数
# Classes
names:
  0: MoonCake

配置完成后: 在yolov8下打开cmd

 激活你配置好的prtorch环境:

 使用下面三个命令中一个进行负责到cmd窗口

这里注意将data的参数用根路径索引出来,

yolo train data=D:\Desktop\yolov8\ultralytics-main\datasets\yangdujun.yaml model=yolov8n.pt epochs=100 lr0=0.01 训练

# 从YAML构建一个新模型,从头开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml epochs=100 imgsz=640

# 从预训练的*.pt模型开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.pt epochs=100 imgsz=640

# 从YAML中构建一个新模型,将预训练的权重转移到它并开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640

等待完成--------------------------------------------------------------------------------------------------

 

------------------------------------------------------------------------------------------------------------------

测试模型:在  D:\Desktop\yolov8\ultralytics-main\runs\detect路径下会有模型生成,

训练结果文件说明

weights文件夹
best.pt:损失值最小的模型文件
last.pt:训练到最后的模型文件
args.yaml

        模型训练的配置参数

confusion_matrix.png - 混淆矩阵

        这张图展示了分类模型的性能。每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。

confusion_matrix_normalized.png - 标准化混淆矩阵:

        与普通混淆矩阵类似,但这里的值显示的是每个类别的预测正确比例。这有助于比较不同类别的预测准确性,尤其是在类别样本数量不平衡的情况下。

F1_curve.png - F1-置信度曲线

        此曲线显示了F1得分随着置信度阈值的变化。F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。

labels.jpg - 标签分布图和边界框分布图

        柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。

labels_correlogram.jpg - 标签相关图

        相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。

P_curve.png - 精确度-置信度曲线

        这张曲线图展示了模型预测的精确度随着置信度阈值的变化。精确度是模型预测正确正例与预测为正例总数的比值。

PR_curve.png - 精确度-召回曲线

        这张曲线图展示了模型的精确度与召回率之间的关系。理想情况下,模型应在精确度和召回率之间保持良好的平衡。

R_curve.png - 召回-置信度曲线

        此曲线图显示了模型的召回率随置信度阈值的变化。召回率是模型正确预测的正例与实际正例总数的比值。

results.png 和 results.csv - 训练结果图表和数据

        这些图表和数据文件展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。

验证模型:

这里我使用命令测试:

yolo predict model=runs/detect/train5/weights/best.pt source=datasets/yangdujun/test/images/1(8).jpg       测试

model=runs/detect/train5/weights/best.pt是训练完成损失度最小的模型

source=datasets/yangdujun/test/images/1(8).jpg      是你要测试的图片跟路径

然后可以在D:\Desktop\yolov8\ultralytics-main\runs\detect\predict 路径下找到你的识别完成的图片

导出模型 :

CLI 指令导出方式:

yolo task=detect mode=export model=runs/detect/train/weights/best.pt

python 指令导出方式: 

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # load an official model
model = YOLO('path/to/best.pt')  # load a custom trained

# Export the model
model.export(format='onnx')

猜你喜欢

转载自blog.csdn.net/qq_64919823/article/details/143305729