YOLOv8目标检测:自定义数据集训练与评估

摘要:在本教程中,我们将详细介绍如何使用自定义数据集训练YOLOv8模型,并用Python代码评估模型性能。

正文:

一、准备自定义数据集

为了训练YOLOv8模型,我们需要一个标注好的自定义数据集。数据集应包含图像文件和对应的标注文件,标注文件中包含目标类别和边界框信息。以下是准备自定义数据集的步骤:

编写这些辅助函数后,您可以使用evaluate_model函数评估YOLOv8模型在自定义数据集上的性能。根据评估结果,您可以进一步优化模型配置和训练参数,以提高模型性能。

create_y_true(true_labels, true_boxes, class_id):根据真实标签和边界框创建二进制标签向量。

create_y_pred(pred_labels, pred_boxes, pred_scores, class_id):根据预测标签、边界框和置信度分数创建预测向量。

  1. 收集图像:收集适用于您的任务的图像。图像数量越多,模型的泛化能力越强。确保图像具有多样性,以便模型能在各种场景下表现良好。

  2. 图像标注:使用标注工具(如labelImg)为图像中的目标创建边界框,并指定类别。将标注结果保存为XML或TXT格式。

  3. 划分数据集:将数据集划分为训练集、验证集和测试集。比例可以根据实际情况调整,通常可以采用80%的训练集,10%的验证集和10%的测试集。

  4. 转换标注格式:将标注文件转换为YOLOv8所需的格式。YOLOv8要求每个图像的标注信息存储在一个与图像同名的TXT文件中,每行包含一个目标的类别ID、中心点坐标(x,y)和宽高(w,h),数值归一化到0-1范围。可以编写Python脚本进行转换,如:

    python">import os
    import xml.etree.ElementTree as ET
    
    def convert_annotation(input_path, output_path, class_names):
        tree = ET.parse(input_path)
        root = tree.getroot()
        size = root.find('size')
        width = int(size.find('width').text)
        height = int(size.find('height').text)
    
        with open(output_path, 'w') as f:
            for obj in root.iter('object'):
                class_name = obj.find('name').text
                class_id = class_names.index(class_name)
                bbox = obj.find('bndbox')
                x_min = int(bbox.find('xmin').text)
                y_min = int(bbox.find('ymin').text)
                x_max = int(bbox.find('xmax').text)
                y_max = int(bbox.find('ymax').text)
    
                x_center = (x_min + x_max) / 2.0 / width
                y_center = (y_min + y_max) / 2.0 / height
                w = (x_max - x_min) / width
                h = (y_max - y_min) / height
    
                f.write(f"{class_id} {x_center} {y_center} {w} {h}\n")
    

    骤如下:

  5. 下载YOLOv8源代码:从YOLOv8官方仓库下载源代码,并按照说明安装依赖库。

  6. 修改配置文件:在cfg文件夹中复制一个现有的YOLOv8配置文件(如yolov8.cfg),并根据自定义数据集进行修改。主要需要修改的部分包括:类别数(classes)、锚框数(num)、过滤器数(filters)等。同时,请注意修改网络输入尺寸以适应您的数据集。

  7. 准备数据文件:创建一个包含训练集图像路径的文本文件(如train.txt),以及一个包含验证集图像路径的文本文件(如valid.txt)。确保图像路径与标注文件路径一致。

  8. 修改数据配置文件:复制data文件夹中的coco.data文件,将其重命名为custom.data。修改custom.data,以包含自定义数据集的类别数、类别名文件路径、训练集文件路径和验证集文件路径。

  9. 下载预训练权重:从YOLOv8官方仓库下载适用于您的YOLOv8配置的预训练权重文件(如yolov8.conv.137)。

  10. 开始训练:使用以下命令开始训练YOLOv8模型:

    python">./darknet detector train path/to/custom.data path/to/your_yolov8.cfg path/to/yolov8.conv.137 -dont_show -map
    

    训练过程中,模型的权重将定期保存到backup文件夹。当训练完成时,您可以选择最佳权重文件作为自定义YOLOv8模型。

    三、评估YOLOv8模型性能

    要使用Python代码评估YOLOv8模型性能,我们可以使用mAP(mean Average Precision)指标。可以参考以下步骤:

  11. 导入依赖库:

    python">import cv2
    import numpy as np
    from sklearn.metrics import average_precision_score
    

    编写评估函数:

    python">def evaluate_model(test_image_paths, test_annotation_paths, model_config, model_weights, class_names, confidence_threshold=0.5):
        net = cv2.dnn.readNetFromDarknet(model_config, model_weights)
        layer_names = net.getLayerNames()
        output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    
        input_size = (416, 416)
        scale_factor = 1 / 255.0
    
        ap_scores = []
    
        for image_path, annotation_path in zip(test_image_paths, test_annotation_paths):
            frame = cv2.imread(image_path)
            blob = cv2.dnn.blobFromImage(frame, scale_factor, input_size, swapRB=True, crop=False)
    
            net.setInput(blob)
            detections = net.forward(output_layers)
    
            true_labels, true_boxes = read_annotation(annotation_path)
            pred_labels, pred_boxes, pred_scores = process_detections(detections, frame, confidence_threshold)
    
            for class_id in range(len(class_names)):
                y_true = create_y_true(true_labels, true_boxes, class_id)
                y_pred = create_y_pred(pred_labels, pred_boxes, pred_scores, class_id)
                ap = average_precision_score(y_true, y_pred)
                ap_scores.append(ap)
    
        map_score = np.mean(ap_scores)
        return map_score
    

    在这个函数中,我们首先加载YOLOv8模型及其权重。接着,针对测试集中的每张图像,我们执行目标检测并处理检测结果。随后,我们根据每个类别计算平均精度(AP),并计算mAP作为最终评估结果。

    为了计算AP,我们需要实现以下辅助函数:

  12. read_annotation(annotation_path):从标注文件中读取真实边界框和对应的类别标签。

  13. process_detections(detections, frame, confidence_threshold):从检测结果中提取预测边界框、类别标签和置信度分数。

编写这些辅助函数后,您可以使用evaluate_model函数评估YOLOv8模型在自定义数据集上的性能。根据评估结果,您可以进一步优化模型配置和训练参数,以提高模型性能。

在上述评估函数中,我们需要补充实现以下辅助函数,以便正确计算mAP。

详细

YOLOv8目标检测:自定义数据集训练与评估

  1. 读取标注文件:
    python">def read_annotation(annotation_path):
        with open(annotation_path, "r") as f:
            lines = f.readlines()
        
        true_labels = []
        true_boxes = []
        
        for line in lines:
            data = line.strip().split()
            label = int(data[0])
            box = [float(x) for x in data[1:]]
            
            true_labels.append(label)
            true_boxes.append(box)
        
        return true_labels, true_boxes
    

  2. 处理检测结果:
    python">def process_detections(detections, frame, confidence_threshold):
        height, width, _ = frame.shape
        pred_labels = []
        pred_boxes = []
        pred_scores = []
    
        for detection in detections:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
    
            if confidence > confidence_threshold:
                x_center, y_center, w, h = detection[:4] * np.array([width, height, width, height])
    
                x_min = int(x_center - w / 2)
                y_min = int(y_center - h / 2)
                x_max = int(x_center + w / 2)
                y_max = int(y_center + h / 2)
    
                pred_labels.append(class_id)
                pred_boxes.append([x_min, y_min, x_max, y_max])
                pred_scores.append(confidence)
    
        return pred_labels, pred_boxes, pred_scores
    

  3. 创建二进制标签向量:
    python">def create_y_true(true_labels, true_boxes, class_id):
        y_true = []
    
        for label, box in zip(true_labels, true_boxes):
            if label == class_id:
                y_true.append(box)
            else:
                y_true.append([0, 0, 0, 0])
    
        return y_true
    

  4. 创建预测向量:
    python">def create_y_pred(pred_labels, pred_boxes, pred_scores, class_id):
        y_pred = []
    
        for label, box, score in zip(pred_labels, pred_boxes, pred_scores):
            if label == class_id:
                y_pred.append(np.concatenate((box, [score])))
            else:
                y_pred.append([0, 0, 0, 0, 0])
    
        return y_pred
    

    现在我们已经补充了上述辅助函数,可以顺利地使用evaluate_model函数来评估YOLOv8模型在自定义数据集上的性能。在进行评估时,请确保您已经正确地设置了测试集图像路径和标注文件路径。

    通过不断优化模型配置和训练参数,您可以提高YOLOv8模型在自定义数据集上的性能。在实际应用中,您还可以使用训练好的模型进行实时目标检测

更多内容及优化:YOLOv8目标检测:自定义数据集训练与评估


http://www.niftyadmin.cn/n/204157.html

相关文章

【Java版oj】day31美国节日、分解因数

目录 一、美国节日 (1)原题再现 (2)问题分析 (3)完整代码 二、分解因数 (1)原题再现 (2)问题分析 (3)完整代码 三、DFS深度优先…

全排列的价值 python实现 蓝桥杯 2137

问题描述 对于一个排列 A(a1​,a2​,⋯,an​), 定义价值 ci​ 为 a1​ 至 ai−1​ 中小于 ai​ 的数 的个数, 即 ci​∣{aj​∣j<i,aj​<ai​}∣。 ​ 定义 A 的价值为 ∑i1n​ci​ 。 给定 n, 求 1 至 n 的全排列中所有排列的价值之和。 输入格式 输入一行包含一个…

某vm加壳分析

背景 早上哥们儿那里发了一个样本过来&#xff0c;让弟弟简单的看看这是个什么东西&#xff0c;好嘛&#xff01;点开就是vm警告&#xff0c;右键回收站。 还是得给好哥哥一点面子&#xff0c;在看看&#xff0c;放进虚拟机之后直接运行&#xff0c;现象就是闪一下&#xff0c…

扩展到三维的超像素分割算法

超像素分割是一种图像分割方法&#xff0c;其将相邻像素组合成更大的区域&#xff0c;以减少图像噪声和冗余信息。在三维图像分割领域中&#xff0c;超像素分割也被广泛应用。以下是一些超像素分割算法的扩展到三维图像的示例&#xff1a; SLIC3D算法&#xff1a;SLIC&#xff…

AOP原理 - 分析AnnotationAwareAspectJAutoProxyCreator源码

文章目录一、回顾EnableAspectJAutoProxy二、AbstractAutoProxyCreator类三、AbstractAdvisorAutoProxyCreator类四、AspectJAwareAdvisorAutoProxyCreator类五、AnnotationAwareAspectJAutoProxyCreator类一、回顾EnableAspectJAutoProxy 在上一章中&#xff0c;通过查看Enabl…

传感器主要分类依据

传感器&#xff08;英文名称&#xff1a;transducer/sensor&#xff09;是一种检测装置&#xff0c;能感受到被测量的信息&#xff0c;并能将感受到的信息&#xff0c;按一定规律变换成为电信号或其他所需形式的信息输出&#xff0c;以满足信息的传输、处理、存储、显示、记录和…

XXL-JOB的使用(详细教程)

概述 首先我们要知道什么是XXL-JOB&#xff1f; ​ 官方简介&#xff1a;XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用 ​ 使用 首先从GitHub上面将项目…

QML和Qt Quick

什么是 QML&#xff1f; Qt Meta-Object Language&#xff0c;Qt元对象语言&#xff0c;是一种用于描述应用程序用户界面的声明式编程语言&#xff0c;使用一些可视组件以及这些组件之间的交互来描述用户界面。QML是一种高可读性的语言&#xff0c;可以使组件以动态方式进行交…