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

openvino python推理demo

openvino python推理demo

import openvino
from openvino.runtime import Core
import numpy as np
import argparse
import hashlib
import os
import io

class OpenvinoInfer:
    def __init__(self,device_id=0):
        self.device_id=device_id
        self.ie = Core()
        self.available_devices = []
        # 根据可用设备选择
        for name in self.ie.available_devices:
            if name.find("GPU")>=0:
                self.available_devices.append(name)
        print(self.available_devices)
        self.device_name=self.available_devices[self.device_id]
        print("Using device:",self.device_name)
    def build(self,onnx_path,onnx_data=None):  
        if onnx_data is None:
            with open(onnx_path, 'rb') as model:
                onnx_data=model.read()

        md5_hash = hashlib.md5(onnx_data).hexdigest()
        self.cache_path = f"{md5_hash}.engine"
        if not os.path.exists(self.cache_path):
            print("Building engine")
            model = self.ie.read_model(model=onnx_path)
            self.compiled_model = self.ie.compile_model(model=model, device_name=self.device_name)
            user_stream = io.BytesIO()
            self.compiled_model.export_model(user_stream)
            with open(self.cache_path, 'wb') as f:
                f.write(user_stream.getvalue())
        else:
            print("Load engine from cache")
            file = open(self.cache_path, 'br') 
            user_stream = io.BytesIO(file.read())
            self.compiled_model = self.ie.import_model(model_stream=user_stream, device_name=self.device_name)
        
        dtype_map={openvino.Type.f32:np.float32,
                    openvino.Type.i32:np.int32,
                    openvino.Type.i64:np.int64}
        
        self.inputs=[]
        self.outputs=[]
        for input_layer in self.compiled_model.inputs:
            print(f"输入层名称:{input_layer.any_name}, 形状:{input_layer.shape} dtype:{input_layer.element_type}")
            self.inputs.append({"name": input_layer.any_name, "shape": input_layer.shape, "dtype": dtype_map[input_layer.element_type]})
        for output_layer in self.compiled_model.outputs:
            print(f"输入层名称:{output_layer.any_name}, 形状:{output_layer.shape} dtype:{output_layer.element_type}")
            self.outputs.append({"name": output_layer.any_name, "shape": output_layer.shape, "dtype": dtype_map[output_layer.element_type]})
        return True

    def inference(self,inputs):
        args=[]
        for idx,ipt in enumerate(inputs):
            args.append(ipt.reshape(self.inputs[idx]['shape']))
        result = self.compiled_model(args)
        output_data = []
        for item in self.outputs: 
            output_data.append(result[item['name']])
        return output_data

if __name__ == '__main__':
    # 创建 ArgumentParser 对象
    parser = argparse.ArgumentParser(description='ai_model_trt_infer')
    parser.add_argument('--model', type=str, help='model')
    parser.add_argument('--input_paths', type=str, help='inputs')
    parser.add_argument('--input_dtypes', type=str, help='inputs')
    parser.add_argument('--output_paths', type=str, help='outputs')
    parser.add_argument('--output_dtypes', type=str, help='outputs')
    args = parser.parse_args()

    dtype_map={"int64":np.int64,"float32":np.float32,"float16":np.float16,"uint8":np.uint8}
    input_paths=args.input_paths.split(',')
    input_dtypes=args.input_dtypes.split(',')

    output_paths=args.output_paths.split(',')
    output_dtypes=args.output_dtypes.split(',')

    infer = OpenvinoInfer()
    infer.build(args.model)

    inputs=[]
    for idx,file_path in enumerate(input_paths):
        with open(file_path, 'rb') as f:
            input_data = np.frombuffer(f.read(), dtype=infer.inputs[idx]['dtype'])
        inputs.append(input_data)

    outputs_gt=[]
    outputs_pred=[]
    for idx,file_path in enumerate(output_paths):
        with open(file_path, 'rb') as f:
            output_data = np.frombuffer(f.read(), dtype=infer.outputs[idx]['dtype'])
        outputs_gt.append(output_data)        
        outputs_pred.append(np.empty(output_data.shape, dtype=output_data.dtype))


    outputs_pred=infer.inference(inputs)

    for idx,output_data in enumerate(outputs_pred):
        mse = np.mean((output_data.reshape(-1) - outputs_gt[idx].reshape(-1)) ** 2)
        print("均方误差 (MSE):", mse)

用法

python ai_model_openvino_infer.py \
    --model=resnet50.onnx \
    --input_paths=resnet50-input-input.bin \
    --output_paths=resnet50-output-output.bin \
    --input_dtypes="float32" \
    --output_dtypes="float32"

python ai_model_openvino_infer.py \
    --model=yolov5m.onnx \
    --input_paths=yolov5m-images-input.bin \
    --output_paths=yolov5m-output0-output.bin \
    --input_dtypes="float32" \
    --output_dtypes="float32"    

python ai_model_openvino_infer.py \
    --model=bert-base.onnx \
    --input_paths=bert-base-input_ids-input.bin,bert-base-attention_mask-input.bin,bert-base-token_type_ids-input.bin \
    --output_paths=bert-base-uncased-output.bin \
    --input_dtypes="int64,int64" \
    --output_dtypes="float32"

http://www.kler.cn/a/382858.html

相关文章:

  • python爬取旅游攻略(1)
  • 服务器开放了mongodb数据库的外网端口,但是用mongodbCompass还是无法连接。
  • 利用P2link智能组网工具实现外网访问局域网中的Linux主机
  • 雷池社区版 7.1.0 LTS 发布了
  • 华为OD机试真题(Python/JS/C/C++)- 考点 - 细节
  • P10 Pytorch入门实战——Pytorch实现车牌识别
  • 网络,NAT地址转换,虚拟路由冗余协议VRRP
  • Linux云计算 |【第五阶段】CLOUD-DAY8
  • Java 批量导出Word模板生成ZIP文件到浏览器默认下载位置
  • 大模型与搜索引擎结合:智能体、思维链和智谱AI搜索代码案例
  • w~视觉~3D~合集1
  • LeetCode题练习与总结:O(1) 时间插入、删除和获取随机元素--380
  • xshell连接不上linux的原因
  • 【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
  • 架构评估的方法
  • CentOS8.4 部署 k8s 1.31.2
  • XPath 实例
  • 【论文复现】KAN卷积:医学图像分割新前沿
  • 初级图像处理工具
  • 【C++刷题】力扣-#717-1比特与2比特字符
  • 【JavaScript】axios 二次封装拦截器(接口、实例、全局)
  • STM32HAL-最简单的长、短、多击按键框架(多按键)
  • hive切换表底层文件类型以及分隔符
  • I.MX6U 裸机开发2. 芯片简介、汇编基础及GPIO操作准备工作
  • 动态切换策略模式在Spring Boot项目中的实践与应用
  • 鸿蒙开发:自定义一个车牌省份简称键盘