将YOLOv8模型从PyTorch的.pt格式转换为OpenVINO支持的IR格式

news2024/9/24 1:26:11

      OpenVINO是Open Visual Inference & Neural Network Optimization工具包的缩写,是一个用于优化和部署AI推理模型的综合工具包OpenVINO支持CPU、GPU和NPU设备

      OpenVINO的优势:

      (1).性能:OpenVINO利用英特尔CPU、集成和独立GPU以及FPGA的强大功能提供高性能推理。

      (2).支持异构执行:OpenVINO提供一次编写(write once)并部署在任何受支持的英特尔硬件(CPU、GPU、FPGA、VPU等)上的API。

      (3).模型优化器:OpenVINO提供模型优化器(Model Optimizer),可以导入、转换和优化(imports, converts, and optimizes)来自流行的深度学习框架(如PyTorch、TensorFlow、TensorFlow Lite、Keras、ONNX、PaddlePaddle和Caffe)的模型。

      (4).易于使用:该工具包附带80多个教程(包括YOLOv8优化)讲授该工具包的不同方面。

      OpenVINO导出结构:将模型导出为OpenVINO格式即IR(Intermediate Representation)格式时,会产生一个包含以下内容的目录(如目录名为best_openvino_model),你可以使用这些文件通过OpenVINO推理引擎进行推理

      (1).XML文件:描述网络拓扑,如best.xml。

      (2).BIN文件:包含权重和偏差(weights and biases)二进制数据,如best.bin。

      (3).映射文件:保存原始模型输出张量到OpenVINO张量名称的映射,如metadata.yaml。

      在部署中使用OpenVINO Export:

      获得OpenVINO文件后,你可以使用OpenVINO Runtime运行模型Runtime提供统一的API来在所有受支持的Intel硬件上进行推理。它还提供高级功能,例如跨 Intel硬件进行负载平衡和异步执行。

      注:你需要XML和BIN文件以及任何特定于应用程序的设置(如输入大小、归一化的缩放因子等),才能正确设置和使用运行时模型。

      在部署应用程序中,你通常会执行以下步骤:

      (1).通过创建core = ov::Core()来初始化OpenVINO。

      (2).使用core.read_model()方法加载模型。

      (3).使用core.compile_model()函数编译模型。

      (4).准备输入(图像、文本、音频等)。

      (5).使用compiled_model(input_data)运行推理。

      将英特尔的OpenVINO工具包与YOLOv8模型结合的好处:

      性能:CPU推理速度提升高达3倍,并利用英特尔GPU和NPU实现加速。

      模型优化器:转换、优化和执行来自PyTorch、TensorFlow和ONNX等流行框架的模型。

      易于使用:有超过80个教程可供用户入门,包括YOLOv8。

      异构执行:使用统一的API在各种英特尔硬件上部署模型。

      注:以上文字描述主要来自:https://docs.ultralytics.com/integrations/openvino/

      Windows10 Anaconda上配置OpenVINO环境

      (1).配置Ultralytics CUDA开发环境,执行以下命令:

# install cuda 11.8
# install cudnn v8.7.0: copy the contents of bin,include,lib/x64 cudnn directories to the corresponding CUDA directories
conda create --name ultralytics-env-cuda python=3.8 -y
conda activate ultralytics-env-cuda
conda install -c pytorch -c nvidia -c conda-forge pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=11.8 ultralytics # pytorch 2.2.2
 
git clone https://github.com/fengbingchun/NN_Test
cd NN_Test/demo/Python

      (2).安装OpenVINO,执行以下命令:

conda install -c conda-forge openvino=2024.0.0
pip install nncf==2.8.0 # openvino INT8 need

      注:具体版本要与已安装的libopenvino版本保持一致

      生成OpenVINO模型的训练代码如下所示:

import argparse
import colorama
from ultralytics import YOLO
import torch

def parse_args():
	parser = argparse.ArgumentParser(description="YOLOv8 train")
	parser.add_argument("--yaml", required=True, type=str, help="yaml file")
	parser.add_argument("--epochs", required=True, type=int, help="number of training")
	parser.add_argument("--task", required=True, type=str, choices=["detect", "segment"], help="specify what kind of task")

	args = parser.parse_args()
	return args

def train(task, yaml, epochs):
	if task == "detect":
		model = YOLO("yolov8n.pt") # load a pretrained model
	elif task == "segment":
		model = YOLO("yolov8n-seg.pt") # load a pretrained model
	else:
		print(colorama.Fore.RED + "Error: unsupported task:", task)
		raise

	results = model.train(data=yaml, epochs=epochs, imgsz=640) # train the model

	metrics = model.val() # It'll automatically evaluate the data you trained, no arguments needed, dataset and settings remembered

	model.export(format="onnx", opset=12, simplify=True, dynamic=False, imgsz=640) # onnx, export the model, cannot specify dynamic=True, opencv does not support
	model.export(format="torchscript", imgsz=640) # libtorch
	model.export(format="engine", imgsz=640, dynamic=False, verbose=False, batch=1, workspace=2) # tensorrt fp32
	# model.export(format="engine", imgsz=640, dynamic=True, verbose=True, batch=4, workspace=2, half=True) # tensorrt fp16
	# model.export(format="engine", imgsz=640, dynamic=True, verbose=True, batch=4, workspace=2, int8=True, data=yaml) # tensorrt int8
	# model.export(format="openvino", imgsz=640) # openvino fp32
	# model.export(format="openvino", imgsz=640, half=True) # openvino fp16
	model.export(format="openvino", imgsz=640, int8=True, data=yaml) # openvino int8, INT8 export requires 'data' arg for calibration


if __name__ == "__main__":
	# python test_yolov8_train.py --yaml datasets/melon_new_detect/melon_new_detect.yaml --epochs 1000 --task detect
	colorama.init()
	args = parse_args()

	if torch.cuda.is_available():
		print("Runging on GPU")
	else:
		print("Runting on CPU")

	train(args.task, args.yaml, args.epochs)

	print(colorama.Fore.GREEN + "====== execution completed ======")

      注:

      (1).无论指定是FP32、还是PF16训练完生成的最终目录名都为best_openvino_model,这里手动调整文件名

      (2).指定INT8,训练完生成的最终目录名为best_int8_openvino_model

      在网上下载了200多幅包含西瓜和冬瓜的图像组成melon数据集,使用生成的best_int8_openvino_model进行预测,代码如下所示:

import colorama
import argparse
from ultralytics import YOLO
import os
import torch

import numpy as np
np.bool = np.bool_ # Fix Error: AttributeError: module 'numpy' has no attribute 'bool'. OR: downgrade numpy: pip unistall numpy; pip install numpy==1.23.1


def parse_args():
	parser = argparse.ArgumentParser(description="YOLOv8 predict")
	parser.add_argument("--model", required=True, type=str, help="model file")
	parser.add_argument("--dir_images", required=True, type=str, help="directory of test images")
	parser.add_argument("--dir_result", required=True, type=str, help="directory where the image results are saved")

	args = parser.parse_args()
	return args

def get_images(dir):
	# supported image formats
	img_formats = (".bmp", ".jpeg", ".jpg", ".png", ".webp")
	images = []

	for file in os.listdir(dir):
		if os.path.isfile(os.path.join(dir, file)):
			# print(file)
			_, extension = os.path.splitext(file)
			for format in img_formats:
				if format == extension.lower():
					images.append(file)
					break

	return images

def predict(model, dir_images, dir_result):
	model = YOLO(model) # load an model
	# model.info() # display model information # only *.pt format support

	images = get_images(dir_images)
	# print("images:", images)

	os.makedirs(dir_result) #, exist_ok=True)

	for image in images:
		if torch.cuda.is_available():
			results = model.predict(dir_images+"/"+image, verbose=True, device="cuda")
		else:
			results = model.predict(dir_images+"/"+image, verbose=True)
		for result in results:
			# print(result)
			result.save(dir_result+"/"+image)
			
if __name__ == "__main__":
	# python test_yolov8_predict.py --model runs/detect/train10/weights/best_int8.engine --dir_images datasets/melon_new_detect/images/test --dir_result result_detect_engine_int8
	colorama.init()
	args = parse_args()

	if torch.cuda.is_available():
		print("Runging on GPU")
	else:
		print("Runting on CPU")

	predict(args.model, args.dir_images, args.dir_result)

	print(colorama.Fore.GREEN + "====== execution completed ======")

      执行结果如下图所示:

      预测结果图像如下所示:

      GitHub:https://github.com/fengbingchun/NN_Test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原生IP节点是什么意思?和socks5节点有什么区别?

在了解这两种代理节点前,我们首先要了解:节点是什么? 首先,在电信网络当中,一个节点是一个连接点。表示一个再分发点又或者是一个通信端点。节点的定义依赖于所提及的网络和协议层。一个物理网络节点是一个连接到网络…

深度强化学习:穿越智能迷雾,探索AI新纪元

近年来,深度强化学习成为关注的热点。在自动驾驶、棋牌游戏、分子重排和机器人等领域,计算机程序能够通过强化学习,理解以前被视为超级困难的问题,取得了令人瞩目的成果。在围棋比赛中,AlphaGo接连战胜樊麾、李世石和柯…

使用 SpringBoot + 虚拟线程将服务性能提升几百倍

虚拟线程简介 虚拟线程是 Java 平台的一项创新特性。虚拟线程是一种轻量级的线程实现,它在操作系统层面并不对应真实的内核线程,而是由 JVM 进行管理和调度。这使得可以在不消耗大量系统资源的情况下创建大量的线程,从而能够更高效地处理并发任务。 虚拟线程与普通线程的区…

【数学建模】——【A题 信用风险识别问题】全面解析

目录 1.题目 2.解答分析 问题1:指标筛选 1.1 问题背景 1.2 数据预处理 1.3 特征选择方法 1.4 多重共线性检测 1.5 实现步骤 问题2:信用评分模型 2.1 问题背景 2.2 数据分割 2.3 处理不平衡数据 2.4 模型选择与理由 问题3:模型对…

『 Linux 』线程池与 POSIX 线程的封装编码实现

文章目录 线程池概念线程池的编码实现线程池的测试参考代码 线程的封装使用测试封装后的线程参考代码 线程池概念 池化技术是一种资源管理方法,通过预先创建和管理一组资源以便在需要使用时快速分配这些资源; 线程池是池化技术的一种典型应用; 资源分配 在线程池中预先创建一定…

【python015】常见成熟AI-图像识别场景算法清单(已更新)

1.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码【python015】常见成熟AI-图像识别场景算法清单及代码文章目录 1.背景介绍2.`Python`版数据爬取、解析代码2.…

鸿蒙应用框架开发【画中画效果实现】 UI框架

画中画效果实现 介绍 本示例通过kit.ArkUI、kit.MediaKit等接口,实现了视频播放、手动和自动拉起画中画、画中画窗口控制视频播放和暂停等功能。 效果预览 使用说明 在主界面,可以点击对应视频按钮进入视频播放页面;视频播放页面点击开启…

三星One UI 7.0引入苹果的几大特色功能,iOS用户都羡慕哭了

在智能手机操作系统的创新之路上,苹果iOS系统的Dynamic Island和Live Activities功能无疑为用户带来了全新的交互体验。 现在,三星One UI 7.0系列的即将发布,似乎预示着安卓阵营也将迎头赶上,甚至可能在某些方面超越苹果。以下是…

AcWing-AcWing 837. 连通块中点的数量

在原来并查集的基础上增加一个Size数组,Size的初始化是必须先每个元素初始化为1 Size只对根节点有效,比如Size[find(1)]就是找1的祖先节点,然后访问祖先节点的个数。当我们联通a点和b点时,如果已经是联通状态了,那么无…

深度解读:等保测评标准与实践指南

在信息时代,数据安全与隐私保护成为企业和组织不可忽视的关键议题。等保测评,即信息安全等级保护测评,作为我国信息安全管理体系的重要组成部分,为各行业提供了标准化的安全评估与改进路径。本文旨在深度解读等保测评标准的核心要…

探索Python日期时间的宝藏:`dateutil`库的神秘面纱

文章目录 探索Python日期时间的宝藏:dateutil库的神秘面纱背景:为何选择dateutil?dateutil是什么?如何安装dateutil?简单函数介绍与使用parse函数:智能日期时间解析relativedelta:计算相对日期t…

一个超强的Python机器学习超参优化库

在机器学习模型的训练过程中,选择合适的超参数对模型性能的提升至关重要。超参数优化是指在给定的超参数空间内,找到一组能够使模型表现最佳的超参数组合。虽然有许多方法可以用来进行超参数优化,但在本文中,我们将重点介绍一个强大且易用的库——Optuna。 什么是Optuna?…

顺序表、单链表、顺序栈,链栈的基本运算

目录 顺序表的基本运算 单链表的基本运算 顺序栈的基本运算 链栈的基本运算 线性表的9个基本运算&#xff1a; 栈的6个基本运算&#xff1a; 顺序表的基本运算 //顺序表的基本运算************************************************************** #include<stdio…

通过yfinance获取股票历史数据

以比亚迪为例&#xff0c;要获取A股比亚迪的十年的历史数据并保存为CSV文件&#xff0c;我们可以使用Python中的第三方库如pandas和yfinance。yfinance库是一个用于下载雅虎财经数据的工具&#xff0c;它支持股票、期权等金融工具的数据获取。 1.安装yfinance和pandas 首先&a…

云服务器带宽什么意思?如何正确选择

云服务器带宽什么意思?云服务器带宽指的是云服务器在互联网上的数据传输能力。就像水流通过水管一样&#xff0c;数据通过所谓的“带宽”在网络中流动。这个带宽越大&#xff0c;每秒能够传输的数据就越多&#xff0c;对大量访问处理的能力也就越强。云服务器带宽是云服务器可…

【开源项目】基于RTP协议的H264码流发送器和接收器

RTP协议 1. 概述1.1 RTP协议1.2 RTP和UDP的关系 2. RTP打包H264码流2.1 RTP单一传输2.2 RTP分片传输2.3 RTP多片合入传输 3.工程3.1 头文件3.1.1 rtp.h3.1.2 utils.h 3.2 cpp文件3.2.1 rtp.cpp3.2.2 utils.cpp 4.测试5.小结 参考&#xff1a; 视音频数据处理入门&#xff1a;UD…

Arco Design 之Table表格

此篇文章为table表格示例&#xff0c;包含列、data数据、展开、选中、自定义等相关属性 基础表格 <a-table :columns"columns1" :data"tableData1" />const columns1 [{ title: "编号", dataIndex: "no"},{ title: "名称…

Linux线程2

线程相关函数 线程分离--pthread_detach&#xff08;后面会详细讲&#xff09; 函数原型&#xff1a;int pthread_datach(pthread_t thread); 调用该函数之后不需要 pthread_join 子线程会自动回收自己的PCB 杀死&#xff08;取消&#xff09;线程--pthread_cancel 取…

自动驾驶将驶向何方?大模型(World Models)自动驾驶综述

前言 自动驾驶系统的开发是一个技术与哲学的双重挑战&#xff0c;核心在于模拟人类的直觉推理和常识。尽管机器学习在模式识别上取得了进展&#xff0c;但在复杂情境下仍存在局限。人类决策基于感官感知&#xff0c;但能预见行动结果和预判变化&#xff0c;这是机器难以复制的…

欧科云链受邀参与EDCON 大会,听听OKLink为开发者带来哪些惊喜?

一年一度的 EDCON 大会于 7 月底在位于东京的联合国大学盛大举行。OKLink 与 Polygon 联手为来自全球各地的数千名开发者打造开放空间&#xff0c;带来多场精彩的主题分享&#xff0c;让开发者得以在上手体验的同时获取到关于最新开发工具的全面信息。 在论坛环节中&#xff0…