- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
** ONNX Runtime****:由微软推出,用于优化和加速机器学习推理和训练**,适用于ONNX模型,是一个跨平台推理和训练机器学习加速器(ONNX Runtime is a cross-platform inference and training machine-learning accelerator),源码地址:https://github.com/microsoft/onnxruntime,最新发布版本为v1.11.1,License为MIT:
** **1.ONNX Runtime Inferencing:高性能推理引擎
** **(1).可在不同的操作系统上运行,包括Windows、Linux、Mac、Android、iOS等;
** **(2).可利用硬件增加性能,包括CUDA、TensorRT、DirectML、OpenVINO等;
** **(3).支持PyTorch、TensorFlow等深度学习框架的模型,需先调用相应接口转换为ONNX模型;
** **(4).在Python中训练,确可部署到C++/Java等应用程序中。
** **2.ONNX Runtime Training:于2021年4月发布,可加快PyTorch对模型训练,可通过CUDA加速,目前多用于Linux平台。
** **通过conda命令安装执行:
conda install -c conda-forge onnxruntime
** **以下为测试代码:通过ResNet-50对图像进行分类
import numpy as np
import onnxruntime
import onnx
from onnx import numpy_helper
import urllib.request
import os
import tarfile
import json
import cv2
# reference: https://github.com/onnx/onnx-docker/blob/master/onnx-ecosystem/inference_demos/resnet50_modelzoo_onnxruntime_inference.ipynb
def download_onnx_model():
labels_file_name = "imagenet-simple-labels.json"
model_tar_name = "resnet50v2.tar.gz"
model_directory_name = "resnet50v2"
if os.path.exists(model_tar_name) and os.path.exists(labels_file_name):
print("files exist, don't need to download")
else:
print("files don't exist, need to download ...")
onnx_model_url = "https://s3.amazonaws.com/onnx-model-zoo/resnet/resnet50v2/resnet50v2.tar.gz"
imagenet_labels_url = "https://raw.githubusercontent.com/anishathalye/imagenet-simple-labels/master/imagenet-simple-labels.json"
# retrieve our model from the ONNX model zoo
urllib.request.urlretrieve(onnx_model_url, filename=model_tar_name)
urllib.request.urlretrieve(imagenet_labels_url, filename=labels_file_name)
print("download completed, start decompress ...")
file = tarfile.open(model_tar_name)
file.extractall("./")
file.close()
return model_directory_name, labels_file_name
def load_labels(path):
with open(path) as f:
data = json.load(f)
return np.asarray(data)
def images_preprocess(images_path, images_name):
input_data = []
for name in images_name:
img = cv2.imread(images_path + name)
img = cv2.resize(img, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
data = np.array(img).transpose(2, 0, 1)
#print(f"name: {name}, opencv image shape(h,w,c): {img.shape}, transpose shape(c,h,w): {data.shape}")
# convert the input data into the float32 input
data = data.astype('float32')
# normalize
mean_vec = np.array([0.485, 0.456, 0.406])
stddev_vec = np.array([0.229, 0.224, 0.225])
norm_data = np.zeros(data.shape).astype('float32')
for i in range(data.shape[0]):
norm_data[i,:,:] = (data[i,:,:]/255 - mean_vec[i]) / stddev_vec[i]
# add batch channel
norm_data = norm_data.reshape(1, 3, 224, 224).astype('float32')
input_data.append(norm_data)
return input_data
def softmax(x):
x = x.reshape(-1)
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum(axis=0)
def postprocess(result):
return softmax(np.array(result)).tolist()
def inference(onnx_model, labels, input_data, images_name, images_label):
session = onnxruntime.InferenceSession(onnx_model, None)
# get the name of the first input of the model
input_name = session.get_inputs()[0].name
count = 0
for data in input_data:
print(f"{count+1}. image name: {images_name[count]}, actual value: {images_label[count]}")
count += 1
raw_result = session.run([], {input_name: data})
res = postprocess(raw_result)
idx = np.argmax(res)
print(f" result: idx: {idx}, label: {labels[idx]}, percentage: {round(res[idx]*100, 4)}%")
sort_idx = np.flip(np.squeeze(np.argsort(res)))
print(" top 5 labels are:", labels[sort_idx[:5]])
def main():
model_directory_name, labels_file_name = download_onnx_model()
labels = load_labels(labels_file_name)
print("the number of categories is:", len(labels)) # 1000
images_path = "../../data/image/"
images_name = ["5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg"]
images_label = ["goldfish", "hen", "ostrich", "crocodile", "goose", "sheep"]
if len(images_name) != len(images_label):
print("Error: images count and labes'length don't match")
return
input_data = images_preprocess(images_path, images_name)
onnx_model = model_directory_name + "/resnet50v2.onnx"
inference(onnx_model, labels, input_data, images_name, images_label)
print("test finish")
if __name__ == "__main__":
main()
测试图像如下所示:
执行结果如下所示:
当我将在 Pytorch 上训练的双线性层网络转换为 ONNX 时,出现以下错误 RuntimeError: [ONNXRuntimeError] : 10 : INVALID_GRAPH : Loa
当我将在 Pytorch 上训练的双线性层网络转换为 ONNX 时,出现以下错误 RuntimeError: [ONNXRuntimeError] : 10 : INVALID_GRAPH : Loa
我尝试将我的 PyTorch 对象检测模型 (Faster R-CNN) 转换为 ONNX。我有两个设置。第一个工作正常,但出于部署原因我想使用第二个。区别在于我用于导出函数 torch.onnx.e
我正在尝试从 onnx 模型中提取输入层、输出层及其形状等数据。我知道有 python 接口(interface)可以做到这一点。我想做类似的事情 code但在 C++ 中。我还粘贴了链接中的代码。我
** ONNX Runtime****:由微软推出,用于优化和加速机器学习推理和训练**,适用于ONNX模型,是一个跨平台推理和训练机器学习加速器(ONNX Runtime is a cro
我已将我的 PyTorch 模型导出到 ONNX。现在,有没有办法让我从那个 ONNX 模型中获取输入层? 将 PyTorch 模型导出到 ONNX import torch.onnx checkpo
如何找到 onnx 模型的输入大小?我最终想从 python 编写它的脚本。 使用 tensorflow 我可以恢复图定义,从中找到输入候选节点,然后获取它们的大小。我可以用 ONNX(甚至更简单)做
我正在使用 ML.NET 导入 ONNX 模型来进行对象检测。作为记录,我从 Microsoft 的 CustomVision.ai 站点导出了模型。 我检查了 Netron 中的模型文件,它清楚地显
如何从 ONNX 模型中获取权重/偏置矩阵值,我目前可以从 model.onnx 中获取输入、内核大小、步幅和填充值。我加载模型,然后读取图形节点以获得相同的结果: import onnx m = o
我正在尝试将预先训练好的火炬模型转换为 ONNX,但收到以下错误: RuntimeError: step!=1 is currently not supported 我正在一个预先训练的着色模型上尝试
使用 ONNX Runtime 在深度学习模型上运行推理。假设我有 4 个不同的模型,每个模型都有自己的输入图像,我可以在 4 个线程中并行运行它们吗?会不会有一个“环境”,然后是 4 个 sessi
我已通过以下方式将模型导出到 ONNX: # Export the model torch_out = torch.onnx._export(learn.model, # mo
如何将 OpenCV 框架转换为适合我的 ONNX 模型接受的尺寸?目前,我的 ONNX 模型输入形状是 [32, 3, 256, 224],但是当我使用 OPENCV 调整大小并打印 img 形状时
我尝试将我的 pytorch Resnet50 模型转换为 ONNX 并进行推理。转换程序没有错误,但是onnx模型的最终结果来自onnxruntime与pytorch的origin模型结果有较大差距
我有一个卡住为 .pb 的 TensorFlow 图,我想将其转换为 .onnx 格式。我目前正在尝试使用 mmconvert (来自 Microsoft 的 MMdnn ),显然我做错了什么(请参见
我目前正在尝试将我使用本教程创建的已保存(且正在工作)的 .pb 文件 ( https://github.com/thtrieu/darkflow ) 转换为 onnx 文件。我现在正在使用winML
我正在尝试将具有多个网络的 pytorch 模型转换为 ONNX,但遇到了一些问题。 git 存储库:https://github.com/InterDigitalInc/HRFAE 训练师类: cl
我从 Matterport's MaskRCNN implementation 在 .h5 中构建了一个自定义模型.我使用 model.keras_model.save() 设法保存了完整模型而不是单
我找不到任何人向外行人解释如何将 onnx 模型加载到 python 脚本中,然后在输入图像时使用该模型进行预测。我能找到的只有这些代码行: sess = rt.InferenceSession("o
有没有办法并行运行多个 ONNX 模型并使用多个可用内核? 目前,我已经训练了两个 ONNX 模型并想使用它们进行推断。我使用了 Python 中的线程,但这并没有真正使用多核。 之后,我尝试了多处理
我是一名优秀的程序员,十分优秀!