yolov8训练自己的数据集以及应用

环境配置

前文

github获取yolov8

github链接

https://github.com/ultralytics/ultralytics.git

环境配置

pip install ultralytics

CUDA配置

如果没有安装英伟达驱动你需要安装nvidia驱动建议最新版

https://www.nvidia.cn/geforce/drivers/

安装好驱动后需要安装一个工具CUDA TOOLKIT

https://developer.nvidia.com/cuda-toolkit

 需要用到CUDA训练所以需要下载一个CUDA的另一个工具cuDNN

这里具体引用别人的方法

Cuda和cuDNN安装教程(超级详细)-CSDN博客

数据集的准备

这里我们需要创建dataset文件夹,yolov8.yaml和dataset.yaml

其中dataset文件夹下面需要再建立2个文件一个是images和labels

dataset文件夹资源分布

├─images
│  ├─train
|  |  ├─ 001.jpg #用于训练的图片
|  |  ├─ 002.jpg
|  |  └─ ......
│  └─val
└─labels
    ├─train
    |  ├─ 001.txt #导出的标记数据
    |  ├─ 002.txt
    |  └─ ......
    └─val

数据标记

这里运用的是X-AnyLabeling

标记数据工具

建议是git到pycharm里面运行

命令行输入

 python anylabeling/app.py

打开文件,选择视频文件

框的部分是选择获取的频率,建议越大越好,越大图片越清晰

框完后需要创建一个txt文件里面放置标签

按标记的顺序发放至置

软件会自动生成一个

labels文件

里面包含图片文件和文本文件

图片文件复制到images里面的train里面文本文件放到val文件里面

再把images文件里面的train文件和val文件复制到labels文件里面

配置yaml文件

dataset.yaml文件、# 这里的路径是相对与运行目录(一般为train.py程序)的路径,如不清楚如何填写,建议填写绝对路径,参考如下:
# train: C:/Users/your_username/PycharmProjects/yolov5/source/images/train
# val: C:/Users/your_username/PycharmProjects/yolov5/source/images/val
train: ./source/images/train
val: ./source/images/val
# nc为种类数量
nc: 1
# 名称,classes.txt,X-AnyLabeling中的群组编号顺序对应
names:  
  0: 'A meng'  
#   1: 'other'
#     2: ......

训练

先下载你需要的预训练模型

Releases · ultralytics/assets · GitHub

在pycharm命令行输入

yolo task=detect mode=train model=yolov8.pt data=dataset.yaml epochs=1000 batch=16

以上参数解释如下:

task:选择任务类型,可选['detect', 'segment', 'classify', 'init']

mode: 选择是训练、验证还是预测的任务蕾西 可选['train', 'val', 'predict']

model: 选择yolov8不同的模型配置文件,可选yolov8s.pt、yolov8m.pt、yolov8l.pt、yolov8x.pt

data: 选择生成的数据集配置文件

epochs:指的就是训练次数,训练次数过多会过拟合,同时过多也会导致训练时间增加
batch:差不多是通道的意思,一次性加载图片的数量如果过大会导致电脑死机黑屏

使用训练好的模型

训练完成得到.pt文件这文件就是模型文件

import cv2 as cv
from ultralytics import YOLO
import time


class yzh_detect:
    class __results__:
        def __init__(self):
            self.name = []
            self.x = []
            self.y = []
            self.confidence = []
            self.image = None

    def __init__(self, model_path):
        # 加载模型
        self.model = YOLO(model_path)
        print(f"Model loaded from: {model_path}")
        self.is_detecting = False

    def detect(self, image):
        '''
        检测图像中的物体
        :param image: 输入图像
        :return: 结果类结构
                  result.name: 物体名称列表
                  result.x: 物体中心点x坐标列表
                  result.y: 物体中心点y坐标列表
                  result.confidence: 物体置信度列表
                  result.image: 检测后的图像
        '''
        if self.is_detecting:
            return None
        self.is_detecting = True

        results = self.model(image, augment=True)

        # 存储检测结果的列表
        result = self.__results__()

        # 遍历检测结果
        try:
            for *xyxy, conf, cls in results[0].boxes.data:
                label = f'{self.model.names[int(cls)]} {conf:.2f}'
                # 画出矩形框
                cv.rectangle(image, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 0, 255), 2)
                cv.putText(image, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255),
                           2)

                # 计算中心点坐标
                center_x = int((xyxy[0] + xyxy[2]) / 2)
                center_y = int((xyxy[1] + xyxy[3]) / 2)
                # 画出中心点
                cv.circle(image, (center_x, center_y), 5, (255, 0, 0), -1)

                # 存储中心点坐标,物体名称,置信度和图像
                result.name.append(self.model.names[int(cls)])
                result.x.append(center_x)
                result.y.append(center_y)
                result.confidence.append(float(conf))

            result.image = image
        except Exception as e:
            print("未检测到物体或发生错误:", e)

        self.is_detecting = False

        return result


if __name__ == "__main__":
    # 加载自定义训练的YOLOv8模型
    model_path = 'best.pt'
    detector = yzh_detect(model_path)

    # 打开摄像头
    cap = cv.VideoCapture(1)  ##打开摄像头

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        # 检测物体
        results = detector.detect(frame)

        # 显示结果图像
        if results and results.image is not None:
            cv.imshow('YOLOv8 Real-time Object Detection', results.image)

        # 退出条件
        if cv.waitKey(1) & 0xFF == ord('q'):
            break

    # 清理工作
    cap.release()
    cv.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值