YoloV8的目标检测推理

news/2024/7/10 0:16:36 标签: YOLO, 目标检测, 人工智能

YoloV8的目标检测推理

原始的YoloV8封装的层次太高,想要为我们所用可能需要阅读很多API,下面给出比较简单的使用方式

导入所需的库

  • os:用于操作文件系统。
  • cv2 (OpenCV):用于图像处理。
  • numpy:提供数学运算,特别是对数组的操作。
  • ultralytics.YOLO:一个现成的YOLO模型实现,用于对象检测。
  • torch:PyTorch深度学习框架,用于处理模型。
  • serial:用于串口通信。
  • time:用于时间相关的操作。

初始化串口通信的函数:init_serial

  • init_serial 函数用于初始化串口通信。
  • 参数包括端口名称、波特率、字节大小、奇偶校验和停止位。
  • 在尝试打开串口时使用 try-except 结构来捕获异常。
  • 如果串口打开成功,则返回串口对象,否则打印错误信息并退出程序。

加载模型的函数:load_model

  • load_model 函数用于加载YOLO模型。
  • 检查模型权重文件是否存在,不存在则打印错误信息并退出。
  • 使用 YOLO 类从给定路径加载模型,并将其传输到指定的计算设备(CPU或GPU)。
  • 返回加载的模型。

处理图像的函数:process_images

  • process_images 函数负责处理指定路径下的图像。
  • 检查图像路径是否存在,不存在则打印错误信息并退出。
  • 遍历指定路径下的所有 .jpg 图像。
  • 对每张图像应用YOLO模型进行对象检测。
  • 从检测结果中提取类别和边界框信息。
  • 对于检测到的每个对象,绘制边界框并根据类别确定边界框颜色。
  • 根据检测结果通过串口发送“OK”或“not OK”信息。
  • 使用OpenCV显示结果图像,按 q 退出循环。
  • 最后关闭所有OpenCV窗口。

主函数:main

  • 在主函数中设置计算设备。
  • 初始化串口。
  • 加载模型。
  • 调用 process_images 函数处理图像。
  • 使用 if __name__ == "__main__": 确保在直接运行脚本时执行主函数。
import os
import cv2
import numpy as np
from ultralytics import YOLO
import torch
import serial
import time

def init_serial(port, baudrate, bytesize, parity, stopbits):
    try:
        ser = serial.Serial(port, baudrate, bytesize, parity, stopbits)
        time.sleep(1)  # 等待串口初始化
        return ser
    except serial.SerialException as e:
        print(f"Error opening serial port: {e}")
        exit()

def load_model(weights_path, device):
    if not os.path.exists(weights_path):
        print("Model weights not found!")
        exit()
    model = YOLO(weights_path).to(device)
    model.fuse()
    model.info(verbose=False)
    return model

def process_images(path, model, serial_port):
    if not os.path.exists(path):
        print(f"Path {path} does not exist!")
        exit()

    for img_file in os.listdir(path):
        if not img_file.endswith(".jpg"):
            continue

        img_path = os.path.join(path, img_file)
        img = cv2.imread(img_path)
        if img is None:
            print(f"Failed to load image {img_path}")
            continue

        mask = img.copy()
        result = model(img)
        cls, xywh = result[0].boxes.cls, result[0].boxes.xywh
        cls_, xywh_ = cls.detach().cpu().numpy(), xywh.detach().cpu().numpy()

        for pos, cls_value in zip(xywh_, cls_):
            pt1, pt2 = (np.int_([pos[0] - pos[2] / 2, pos[1] - pos[3] / 2]),
                        np.int_([pos[0] + pos[2] / 2, pos[1] + pos[3] / 2]))
            color = [0, 0, 255] if cls_value == 0 else [0, 255, 0]
            cv2.rectangle(mask, tuple(pt1), tuple(pt2), color, 2)

        res_ = "Yes" if np.any(cls_ == 1) else "No"
        print(res_)
        serial_port.write((res_ + "\r\n").encode())

        cv2.imshow("result", mask)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cv2.destroyAllWindows()

def main():
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print("Using device:", device)

    serial_port = init_serial("/dev/ttyTHS1", 115200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE)
    model = load_model("./weights/best.pt", device)
    process_images("./datasets/pre/", model, serial_port)

if __name__ == "__main__":
    main()


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

相关文章

ffmpeg 解码文件时的时间戳问题

实时流和普通文件 1 实时流 实时流编码时,我们一般不进行b帧编码,但是文件存储时为了减小大小,会增加b帧,实时流只带了I,P帧,那就会好很多 2 普通文件 很多文件带了b帧,所以要使用解码时间去同…

51 单片机基础

一、51 单片机 开发环境配置,vscodeSDCC 编辑器、编译器 最常用的集成开发环境 keil c51 1、vscode SDCC 开发环境搭建 vscode 插件( 或者 PlatformIO IDE) EIDE 的使用:详细自学 PlatformIO IDE:详细自学 vsc…

Unity3D 中播放 RTSP 监控视频

【Unity 3D】怎么在 WebGL 中低延迟播放 RTSP 监控 - 简书[Unity 3D] 开箱即食的头部监控厂商 SDK 集成框架 - 简书 Unity3d Windows播放视频(视频流)功能组/插件支持对比_ffmpeg for unity-CSDN博客Unity UMP打包黑屏问题总结-CSDN博客Unity Universal…

K8S 日志方案

目录 一、统一日志管理的整体方案 1、基础日志 2、Node级别的日志 3、集群级别的日志架构 二、安装统一日志管理组件 1、 部署Elasticsearch 2、部署Fluentd 3、部署Kibana 三、日志数据展示 一、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内…

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架,该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制,使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1:安装必要库 pip install fastapi uvicorn st…

Flink Has Become the De-facto Standard of Streaming Compute

摘要:本文整理自 Apache Flink 中文社区发起人、阿里巴巴开源大数据平台负责人王峰(莫问),在 Flink Forward Asia 2023 主会场的分享。Flink 从 2014 年诞生之后,已经发展了将近 10 年,尤其是最近这些年得到…

Linux驱动开发之杂项设备注册和Linux2.6设备注册

目录 一、杂项设备注册 杂项设备注册简介 杂项设备注册特点: 杂项设备注册相关API misc_register() misc_deregister() 杂项设备注册相关例程 例程简介 源码分享 二、Linux 2.6设备注册 Linux2.6设备注册简介 Linux 2.6设备注册特点 Linux2.6设备注册流程 ​Linu…

Python(九十一)函数的参数定义-默认参数值

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…