当前位置: 首页 > article >正文

yolov8旋转目标检测部署教程(附代码c++_python)

为了编写一个详细的YOLOv8旋转目标检测ONNX部署教程,我们需要考虑几个关键点:模型转换为ONNX格式、ONNX模型的部署以及后处理逻辑。由于YOLOv8本身还未发布,我们将基于现有的知识和技术来进行推断。

以下是部署YOLOv8旋转目标检测模型到ONNX的步骤,包括代码示例。请注意,这只是一个假设性的教程,因为YOLOv8的具体细节尚未公开。
在这里插入图片描述

1. 准备环境

确保安装了以下依赖:

  • Python 3.7+
  • PyTorch 1.10+
  • torchvision
  • OpenCV
  • numpy
  • onnx
  • onnxruntime
  • tqdm

安装所需的库:

pip install torch torchvision opencv-python numpy onnx onnxruntime tqdm

2. 模型转换为ONNX格式

假设你已经有了一个经过训练的YOLOv8旋转目标检测模型,接下来将其转换为ONNX格式。

导入库
import torch
import onnx
from onnxsim import simplify
转换为ONNX
def convert_to_onnx(model, input_size=(640, 640), output_file="yolov8.onnx"):
    dummy_input = torch.randn(1, 3, *input_size)  # 1 batch, 3 channels, input size
    input_names = ["input"]
    output_names = ["output"]
    
    torch.onnx.export(
        model,
        dummy_input,
        output_file,
        export_params=True,
        opset_version=11,
        do_constant_folding=True,
        input_names=input_names,
        output_names=output_names,
        dynamic_axes={"input": {0: "batch_size"}, "output": {0: "batch_size"}}
    )
    
    print(f"Model has been converted to ONNX format and saved to {output_file}")

    # Simplify the ONNX model
    onnx_model = onnx.load(output_file)
    model_simplified, check = simplify(onnx_model)
    assert check, "Simplified ONNX model could not be validated"
    onnx.save(model_simplified, output_file)
    print(f"Simplified ONNX model saved to {output_file}")

3. ONNX模型部署

接下来,我们将使用ONNX Runtime来加载和运行ONNX模型。

导入库
import cv2
import numpy as np
import onnxruntime
加载ONNX模型
def load_onnx_model(model_path):
    sess = onnxruntime.InferenceSession(model_path, providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
    input_name = sess.get_inputs()[0].name
    output_name = sess.get_outputs()[0].name
    return sess, input_name, output_name
预处理
def preprocess_image(image_path, input_size=(640, 640)):
    img = cv2.imread(image_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = cv2.resize(img, input_size)
    img = img.astype(np.float32)
    img /= 255.0
    img = np.transpose(img, (2, 0, 1))  # HWC -> CHW
    img = np.expand_dims(img, axis=0)  # Add batch dimension
    return img
后处理
def postprocess(output, image_shape, input_size=(640, 640)):
    # 假设输出包含旋转框的坐标和角度
    detections = output[0]
    boxes = detections[:, :5]  # x, y, width, height, angle
    scores = detections[:, 5]
    labels = detections[:, 6]
    
    # 调整检测框到原始图像尺寸
    scale_x = image_shape[1] / input_size[1]
    scale_y = image_shape[0] / input_size[0]
    boxes[:, 0] *= scale_x
    boxes[:, 1] *= scale_y
    boxes[:, 2] *= scale_x
    boxes[:, 3] *= scale_y
    
    return boxes, scores, labels
推理过程
def detect_rotated_boxes(image_path, sess, input_name, output_name, input_size=(640, 640)):
    img = preprocess_image(image_path, input_size)
    outputs = sess.run([output_name], {input_name: img})
    boxes, scores, labels = postprocess(outputs[0], cv2.imread(image_path).shape, input_size)
    return boxes, scores, labels
可视化结果
def visualize(image_path, boxes, scores, labels):
    img = cv2.imread(image_path)
    for box, score, label in zip(boxes, scores, labels):
        x, y, w, h, angle = box
        # 使用OpenCV绘制旋转矩形
        box_points = cv2.boxPoints(((x, y), (w, h), angle))
        box_points = np.int0(box_points)
        cv2.drawContours(img, [box_points], 0, (0, 0, 255), 2)
        cv2.putText(img, f"{label} {score:.2f}", (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
    
    cv2.imshow("Rotated Object Detection", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4. 运行检测

编译和运行
1)编译

cd examples/rknn_yolov8_obb_demo

bash build-linux_RK3588.sh

2)运行

cd install/rknn_yolov8obb_demo_Linux

./rknn_yolov8obb_demo


结果展示

类别:

CLASSES = ['plane', 'ship', 'storage tank', 'baseball diamond', 'tennis court', 'basketball court',
           'ground track field', 'harbor', 'bridge', 'large vehicle', 'small vehicle', 'helicopter', 'roundabout',
           'soccer ball field', 'swimming pool']

在这里插入图片描述
最后:计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,远程协助,代码定制,私聊会回复!


http://www.kler.cn/news/285192.html

相关文章:

  • 在Java中,获取输入内容可以通过多种方式实现,以下是三种常用的方式:Scanner、BufferedReader 和 Console 的具体代码示例
  • chromedriver下载地址
  • c# net8调用vc写的dll
  • 机械学习—零基础学习日志(如何理解概率论10)
  • 学习记录:js算法(二十):子数组最大平均数 I、无重复字符的最长子串
  • Linux(文件的查找和解压缩)
  • RelativeLayout相对布局
  • 使用 UniApp 实现摄像头视频流的接入并在页面上显示视频流
  • NC115.栈和排序_C++题解
  • python-word添加标题,段落,文字块
  • Web开发 Ajax 2024/3/31
  • 004、架构_计算节点
  • 科研绘图系列:R语言单细胞差异基因四分图(Quad plot)
  • 加密与安全_前后端通过AES-CBC模式安全传输数据
  • 【Python】运行tcl、perl程序
  • EasyExcel冲突问题,java.lang.NosuchFieldError: Factory
  • 《软件工程导论》(第6版)第4章 形式化说明技术 复习笔记
  • Xcode插件开发
  • 【机器学习】数据预处理-特征工程与特征选择
  • 数字芯片中I/O单元及电源domain布局中SIPI的考虑
  • 浅谈C#委托
  • zdppy+vue3+onlyoffice文档管理系统实战 20240828上课笔记 zdppy_cache框架完成和验证码框架继续优化
  • EmguCV学习笔记 VB.Net 第8章 图像分割
  • org.apache.commons.lang.math.NumberUtils#isNumber 解释
  • 大语言模型数据增强与模型蒸馏解决方案
  • 【最新华为OD机试E卷】空栈压数(200分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 【测试】——开发模型与测试模型
  • 黑神话 悟空 配置 Mac玩游戏
  • vue3中ref绑定的节点顺序错乱
  • day36