【CV】如何使用 YOLOv8 进行推理并使用自定义数据进行再训练

 🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​

📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】

​​

 🖍foreword

✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。

如果你对这个系列感兴趣的话,可以关注订阅哟👋

文章目录

介绍

YOLO架构

YOLOV8

使用预训练的 Yolov8 模型进行推理

使用自定义数据集进行再训练

结论


使用预训练的yolov8模型进行推理和使用自定义数据集重新训练模型的全过程

介绍

在计算机视觉领域,目标检测是最关键和最具挑战性的任务之一。You Only Look Once (YOLO)检测模型是最著名和革命性的对象检测算法之一。它快速识别定位物体的能力使其成为从自动驾驶汽车到安全系统等广泛应用的宝贵工具。

YOLO 是一种实时对象检测算法,其工作原理是将图像划分为单元格网格,并为每个单元格预测对象的边界框类别概率。然后网络将这些预测结合起来输出最终的检测结果。YOLO 最早出现在Joseph Redmon 等人的论文“ You Only Look Once: Unified, Real-Time Object Detection ”中。2016年。

YOLO架构

YOLO 架构由两个主要组件组成:

  • 特征提取网络是一个深度卷积神经网络 (CNN),它获取输入图像并输出特征图。特征图保留了图像的空间信息,包含了边缘、角点、纹理等高级特征。
  • 检测网络将来自特征提取网络的特征图作为输入,并预测网格中每个单元格的边界框和类别概率。检测网络由一系列卷积层和一个全连接层组成。检测网络的输出是一个大小为 的张量(S, S, (B * 5 + C)),其中S是网格的大小,B是每个网格单元的边界框数,C是类别数。

YOLO 架构( Hao Zhang 和 Xianggong Hong 的研究论文

YOLO检测过程包括以下步骤:

  1. 输入图像:该算法获取输入图像并将其调整为固定大小。
  2. 网格生成:该算法将调整大小的图像划分为单元格网格。每个单元负责预测落在其边界内的对象。
  3. 边界框预测:对于每个单元格,算法预测B边界框,每个包含 5 个值:(x, y, w, h, confidence)。这些(x, y)值表示边界框相对于单元格边界的中心,并(w, h)表示边界框的宽度和高度。该confidence值表示算法对预测的置信度。
  4. 类别预测:对于每个单元格,算法预测每个类别的概率C
  5. 非最大抑制:该算法应用非最大抑制来去除冗余的边界框预测。Non-maximum suppression 比较预测边界框的重叠,只保留置信度最高的那个。
  6. Intersection Over Union (IoU):评估边界框预测的准确性。IoU 是衡量预测边界框和真实边界框之间重叠程度的指标,取值范围为 0 到 1。IoU 值越高表示预测边界框和真实边界框之间的重叠越好。
  7. 输出:算法输出最终的检测结果,包括类别标签、边界框坐标和置信度分数。

YOLOV8

YOLOv8 由 Alexey Bochkovskiy 和他在 Ultralytics 的团队开发,代表了一种尖端的对象检测算法,其性能优于 YOLO(You Only Look Once)系列中的前辈。YOLOv8 系列由每个类别中的五个模型组成,用于检测分割分类任务。YOLOv8 Nano 是最小和最快的模型,而 YOLOv8 Extra Large (YOLOv8x) 是其中最慢但最准确的模型。

YOLOv8 系列中的 Detect、Segment 和 Pose 模型已经在 COCO 数据集上进行了预训练,而 Classify 模型已经在 ImageNet 数据集上进行了预训练。COCO(Common Objects in Context)数据集是计算机视觉研究中广泛用于对象检测、分割和字幕任务的大规模数据集。它包含 80 个不同类别的超过 330,000 张图像和超过 250 万个标记对象实例,使其成为训练和评估对象检测和分割模型的宝贵资源。有关 COCO 对象类的完整列表,请参见此处。

使用预训练的 Yolov8 模型进行推理

事不宜迟,让我们通过安装所需的库来继续实施。

pip install ultralytics==8.0.75 opencv-python==4.7.0.72 gdown==4.7.1 filterpy==1.4.5 torch

如果您是第一次运行模型并且没有保存预训练模型,您可以通过 API 下载它。所有可用的预训练模型都可以使用 Ultralytics 的 Python API 方便地下载。

from ultralytics import YOLO
model = YOLO("yolov8s.pt")

首先,我们导入必要的库并通过设置各种参数来配置模型,以确保它按预期运行。

import cv2
import torch
from pathlib import Path
from ultralytics.nn.autobackend import AutoBackend
from ultralytics.yolo.utils.ops import non_max_suppression, scale_boxes
from ultralytics.yolo.data.dataloaders.stream_loaders import LoadImages, LoadStreams
from ultralytics.yolo.utils.plotting import Annotator, colors

# model 配置
half = False
img_sz = [640, 640]
device = 'cpu'
classes = list(range(80))
conf_thres = 0.5
iou_thres = 0.5
max_det = 1000
line_thickness = 2
agnostic_nms = False
  • half:一个布尔变量,确定是否使用半精度浮点运算(float16)进行推理。它通常与 CUDA 一起使用,以加速 GPU 上的深度学习计算。这在处理大型模型或数据集时非常有利,因为它允许一次将更多数据存储在内存中,从而减少在 CPU 和 GPU 之间传输数据的需要。它设置为False如果在没有 gpu 的机器上运行。
  • img_sz:模型将分析的图像的大小。默认大小为 640x640 像素,这是一个正方形图像。
  • device:模型运行的硬件类型。默认情况下,它在计算机的 CPU 上运行。
  • classes:模型将尝试检测的对象类型。默认情况下,该模型经过训练可以识别 COCO 数据集中定义的 80 个不同对象。
  • conf_thres:模型检测对象所需的确定性级别。默认情况下,它设置为 0.5,这意味着模型将只检测它至少有 50% 把握的对象。
  • iou_thres:在模型将它们视为同一对象之前,多个对象之间的重叠量。默认情况下,它设置为 0.5,这意味着重叠超过 50% 的对象将被视为同一对象。
  • max_det:模型将在每张图像中检测到的最大对象数。默认情况下,它设置为 1000。
  • line_thickness:在输出图像中检测到的对象周围绘制的线条的粗细。
  • agnostic_nms:确定模型在对象检测期间是否执行类特定或类不可知的非最大抑制 (NMS) 的设置。Agnostic 在所有机器上一起运行 NMS,而不是按类运行。默认情况下,它设置为False,这意味着模型执行类特定的 NMS。

接下来,我们可以定义我们打算运行 YOLO 模型的输入源。在我们的案例中,我有一个用于演示目的的视频test.mp4。如果您打算使用网络摄像头进行实时检测,请使用。之后,您可以决定是否在推理期间使用 显示视频show_video,以及save_video是否要在本地保存输出。

source = './test.mp4'
webcam = source.isnumeric() or source.endswith('.txt')

# output 配置
show_video = True
save_video = False
output_file_name = 'test_output_1.avi'
out_writter = cv2.VideoWriter(
    output_file_name, 
    cv2.VideoWriter_fourcc('M','J','P','G'), 30, img_sz
)

随后,我们将 YOLOv8 模型及其相关配置加载到AutoBackendyolo 库中的类中,使用这些权重初始化 PyTorch 模型对象,并将模型设置为在指定设备(例如 CPU 或 GPU)上运行。此外,该类AutoBackend可以配置为使用 PyTorch DNN 模块在支持它的 CPU 上进行更快的推理,还可以使用半精度 (FP16) 计算来减少内存使用并提高吞吐量。

如果使用“网络摄像头”,则该LoadStreams函数用于为网络摄像头源创建数据加载器,而LoadImagess函数则用于静态图像或视频。

# 加载模型
# 使用 FP16 半精度推理,使用 OpenCV DNN 进行 ONNX 推理
model_name = "yolov8n.pt"
model = AutoBackend(model_name, device=device, dnn=False, fp16=half)
stride, names, pt = model.stride, model.names, model.pt

# 数据加载器
if webcam:
    dataset = LoadStreams(
        source, 
        imgsz=img_sz, 
        stride=stride, 
        auto=pt, 
        transforms=getattr(model.model, 'transforms', None), 
        vid_stride=1
    )
    bs = len(dataset)

else:
    dataset = LoadImages(
        source,
        imgsz=img_sz,
        stride=stride,
        auto=pt,
        transforms=getattr(model.model, 'transforms', None),
        vid_stride=1
    )

我们已经到达了过程中最激动人心的部分,我们将每一帧输入到 YOLO 模型中。在下面的代码块中,我们使用 yolo 模型结合非极大值抑制执行图像处理、推理和检测等操作。然后,我们遍历结果并Annotator在帧中检测到的对象上绘制边界框(使用类方法)。

for frame_idx, batch in enumerate(dataset):
    # processing
    path, tranform_im, ori_im, vid_cap, s = batch
    tranform_im = torch.from_numpy(tranform_im).to(device)
    tranform_im = tranform_im.half() if half else tranform_im.float()
    tranform_im /= 255.0 
    tranform_im = torch.unsqueeze(tranform_im, 0)

    # inference
    preds = model(tranform_im, augment=False, visualize=False)
    results = non_max_suppression(preds, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)

    # Process detections
    for i, det in enumerate(results):
        
        # annotator for plotting
        annotator = Annotator(ori_im, line_width=2, example=str(names))

        if det is not None and len(det): 
            det[:, :4] = scale_boxes(tranform_im.shape[2:], det[:, :4], ori_im.shape).round()

            for j, (output) in enumerate(det):
                bbox = output[0:4]
                conf = output[4]
                cls = output[5]
                annotator.box_label(bbox, f'{names[int(cls)]} {conf:.2f}', color=colors(int(cls), True))

    final_img = annotator.result()
    if show_video:
        cv2.namedWindow("out", cv2.WINDOW_FREERATIO)
        cv2.resizeWindow("out", final_img.shape[1], final_img.shape[0])
        cv2.imshow("out", final_img)
        if cv2.waitKey(1) == ord('q'):
            exit()

    if save_video:
        frame = cv2.resize(final_img, img_sz, interpolation=cv2.INTER_AREA)
        out_writter.write(frame)

这是使用上述脚本处理的单帧示例。可以从repo中找到带有示例的完整运行脚本。

使用自定义数据集进行再训练

当要检测的对象类别不包含在默认的 COCO 数据集中时,需要使用自定义数据集重新训练 YOLO。在这种情况下,至关重要的是准备一个新的数据集并用该数据集重新训练模型,确保模型能够准确地检测到我们想要检测的对象。为了演示 YOLO 训练,我们可以导入和提取用于植物病害检测的自定义数据集。

!wget https://moderncomputervision.s3.eu-west-2.amazonaws.com/PlantDoc.v1-resize-416x416.yolov5pytorch.zip
!unzip -q PlantDoc.v1-resize-416x416.yolov5pytorch.zip
!mv ./train ./datasets/train 
!mv ./test ./datasets/test 

提取后,我们应该能够找到一个非常重要的文件,data.yaml它存储了训练的关键信息。在自定义 yaml 文件下,它提供有关用于训练和验证的图像的位置以及类数(在本例中为 30)的信息。

# data.yaml
train: ./train/images
val: ./valid/images

nc: 30
names: ['Apple Scab Leaf', 'Apple leaf', 'Apple rust leaf', 'Bell_pepper leaf spot', 'Bell_pepper leaf', 'Blueberry leaf', 'Cherry leaf', 'Corn Gray leaf spot', 'Corn leaf blight', 'Corn rust leaf', 'Peach leaf', 'Potato leaf early blight', 'Potato leaf late blight', 'Potato leaf', 'Raspberry leaf', 'Soyabean leaf', 'Soybean leaf', 'Squash Powdery mildew leaf', 'Strawberry leaf', 'Tomato Early blight leaf', 'Tomato Septoria leaf spot', 'Tomato leaf bacterial spot', 'Tomato leaf late blight', 'Tomato leaf mosaic virus', 'Tomato leaf yellow virus', 'Tomato leaf', 'Tomato mold leaf', 'Tomato two spotted spider mites leaf', 'grape leaf black rot', 'grape leaf'

在确保所有必要组件都到位后,使用UltralyticsUltralytics 库可以轻松训练新模型。只需几行代码,您就可以开始训练过程。

from ultralytics import YOLO 

# 从 YAML 构建一个新模型
model = YOLO( 'yolov8n.yaml' )   

# 训练模型
model.train(data= './data.yaml' , epochs= 100 , imgsz= 640 ) 

# 保存模型
model.export( "./custom_model.pt" )

伟大的!您现在应该能够看到模型开始训练过程。

结论

总之,我们探索了 YOLO 在目标检测任务中的强大功能,以及我们如何使用预训练模型对图像和视频进行推理。我们还学习了如何使用 Ultralytics 库使用自定义数据集重新训练 YOLO 模型。通过使用我们自己的数据训练和微调 YOLO 模型的能力,物体检测任务的可能性是无限的。无论是检测植物病害、交通监控,甚至人脸识别,YOLO都为我们提供了精准高效的解决方案。通过本文提供的实现和资源,我们希望您能够将这些技术应用到您自己的项目中,并利用 YOLO 的功能。

### 回答1: 要使用Python编写YoloV5的推理代码,您需要执行以下步骤: 1. 安装yolov5库: 您可以使用以下命令安装yolov5库: ``` !pip install yolov5 ``` 2. 加载模型: 使用以下代码加载训练好的模型: ``` import torch model = torch.hub.load('ultralytics/yolov5', 'custom', path_or_model='path/to/best.pt') ``` 这将加载模型并将其存储在变量“model”中。请注意,您需要将“path/to/best.pt”替换为实际模型文件的路径。 3. 加载图像: 使用以下代码加载要进行目标检测的图像: ``` import cv2 image = cv2.imread('path/to/image.jpg') ``` 这将加载图像并将其存储在变量“image”中。请注意,您需要将“path/to/image.jpg”替换为实际图像文件的路径。 4. 进行推理使用以下代码对加载的图像进行目标检测: ``` results = model(image) ``` 这将对图像进行推理,并将检测结果存储在变量“results”中。 5. 处理检测结果: 您可以使用以下代码处理检测结果: ``` results.print() ``` 这将打印检测结果。您还可以使用以下代码将检测结果可视化: ``` results.show() ``` 这将显示检测结果的可视化版本。 请注意,这只是一个基本的YoloV5推理示例。您可以根据需要进行更改和自定义。 ### 回答2: Yolov5 是一个基于 Python 的目标检测算法模型,下面是一个简单的推理代码的示例: ```python import torch from torch.backends import cudnn import numpy as np from PIL import Image from matplotlib import pyplot as plt from torchvision.transforms import functional as F # 加载模型 model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # 设置模型为推理模式 model.eval() # 加载图像 image = Image.open('image.jpg') # 读取图像 image_tensor = F.to_tensor(image).unsqueeze(0) # 转为张量并添加batch维度 # 执行推理 with torch.no_grad(): # 将图像输入模型进行推理 result = model(image_tensor) # 解析推理结果 pred_boxes = result.pred[0].detach().cpu().numpy()[:, :4] # 预测框的坐标 pred_scores = result.pred[0].detach().cpu().numpy()[:, 4] # 预测框的置信度 # 可视化结果 plt.imshow(image) for (x1, y1, x2, y2), score in zip(pred_boxes, pre_scores): plt.rectangle((x1, y1), (x2, y2), color='r', linewidth=2) plt.text(x1, y1, f'{score:.2f}', color='r') # 显示图像 plt.show() ``` 这段代码首先通过 `torch.hub.load` 加载 Yolov5 模型,接着将图像读取并转换为张量,然后将图像输入模型,执行推理推理结果包含预测框的坐标和置信度。最后,代码使用 Matplotlib 进行可视化,将预测框和置信度绘制在原图上,并显示图像。 这只是一个简单的示例,真正的推理代码可能会根据具体的需求和模型的复杂性而有所不同。但是,这段代码可以作为一个基础的参考来帮助你编写 Yolov5 的推理代码。 ### 回答3: 要编写Yolov5的推理代码,首先需要安装Yolov5的库和依赖项。可以通过在终端中运行以下命令来安装Yolov5: ```python !pip install -r requirements.txt ``` 接下来,创建一个Python文件,并导入所需的库: ```python import torch import numpy as np from PIL import Image from torchvision.transforms import functional as F from models.experimental import attempt_load ``` 然后,加载训练好的模型: ```python model = attempt_load('yolov5s.pt', map_location=torch.device('cpu')) ``` 接下来,处理输入图像和预测: ```python def predict(image_path): # 加载图像 image = Image.open(image_path) # 图像预处理 image = F.pad(image, (0, 0, image.width % 32, image.height % 32), fill=0) image = F.resize(image, (640, 640)).convert('RGB') image_tensor = F.to_tensor(image) image_tensor = image_tensor.unsqueeze(0) # 进行预测 model.eval() with torch.no_grad(): detections = model(image_tensor)[0] detections = non_max_suppression(detections, conf_thres=0.3, iou_thres=0.5) # 处理预测结果 if detections is not None: for detection in detections: detection = detection.numpy() bounding_box = detection[:4] confidence = detection[4] class_id = detection[5] # 打印检测结果 print("Bounding Box:", bounding_box) print("Confidence:", confidence) print("Class ID:", class_id) else: print("No objects detected.") ``` 最后,调用`predict`函数并传入图像路径来进行预测: ```python predict('image.jpg') ``` 以上就是使用Python编写Yolov5的推理代码的步骤。请注意,这只是一个简单的示例,你可能需要根据你的需求进行适当的修改和调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sonhhxg_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值