labview yolov5实例分割onnxruntime推理,封装dll, labview调用dll,支持同时加载多个模型并行推理,可cpu/gpu, x86/x64位,识别视频和图片,cpu和gpu可选,只需要替换模型的onnx和names即可,源码和库函数,推理速度很快。 同时还有标注,训练源码(labview编写,后台调用python)

在计算机视觉领域,YOLOv5以其高效的目标检测性能而备受瞩目。今天咱就唠唠如何在LabVIEW环境下实现YOLOv5实例分割的ONNXruntime推理,还能把它封装成DLL供LabVIEW调用,并且支持多个模型并行推理,适应不同硬件平台和计算设备。

ONNXruntime推理基础

首先,讲讲ONNXruntime推理。它是一个跨平台的机器学习推理加速器,能让我们在不同环境高效运行ONNX格式的模型。在LabVIEW里实现这部分,我们得借助一些代码。假设咱用Python写ONNXruntime推理部分(因为LabVIEW后台调用Python来处理这部分逻辑)。

import onnxruntime
import numpy as np

# 初始化ONNX运行时会话
session = onnxruntime.InferenceSession('yolov5.onnx')

# 获取输入和输出的名称
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

def inference(image):
    # 假设image已经被预处理成合适的格式
    input_data = np.array(image).astype(np.float32)
    result = session.run([output_name], {input_name: input_data})
    return result

在这段代码里,首先创建了一个ONNXruntime的推理会话session,加载了yolov5.onnx模型。然后获取输入输出的名称,方便后续推理时使用。inference函数接收一个已经预处理好的图像,将其转化为合适的数据类型,送入ONNXruntime会话进行推理,并返回结果。

封装DLL

为了能在LabVIEW里方便调用这个推理功能,我们要把它封装成DLL。在Python里可以借助ctypes库来完成这个任务。这里有个简单的示例代码框架(实际操作可能更复杂,涉及到数据类型转换等更多细节)。

import ctypes

# 加载Python库
python_dll = ctypes.CDLL('python3.dll')

# 定义函数参数和返回类型
python_dll.Py_Initialize()
python_dll.PyRun_SimpleString.argtypes = [ctypes.c_char_p]
python_dll.PyRun_SimpleString.restype = None

# 运行Python代码
python_dll.PyRun_SimpleString(b'import onnxruntime')
# 后续还有更多关于加载模型、定义推理函数等代码的运行

python_dll.Py_Finalize()

这段代码先加载Python的DLL,初始化Python环境,通过PyRun_SimpleString函数运行Python代码来导入onnxruntime库等,实际应用中还得加入更多关于模型加载和推理函数的运行代码。最后再结束Python环境。

LabVIEW调用DLL

LabVIEW调用这个封装好的DLL也不难。在LabVIEW里,通过“调用库函数节点”就可以实现。首先在前面板放置一个“调用库函数节点”,设置好DLL路径、函数名以及输入输出参数的类型。比如,如果我们封装的DLL里有个函数叫inferencefromdll,接收一个图像数据指针和图像尺寸信息,返回推理结果。

// LabVIEW伪代码示意
// 假设已经获取到图像数据image_data和尺寸image_size
result = CallLibFunction("yolov5_inference.dll", "inference_from_dll", image_data, image_size)

这里通过CallLibFunction函数(实际在LabVIEW里是“调用库函数节点”)调用了DLL里的inferencefromdll函数,传入图像数据和尺寸,得到推理结果。

多模型并行推理支持

支持同时加载多个模型并行推理可是个超酷的功能。在代码层面,我们可以为每个模型创建独立的ONNXruntime会话。

model_paths = ['yolov5_1.onnx', 'yolov5_2.onnx']
sessions = []
for path in model_paths:
    session = onnxruntime.InferenceSession(path)
    sessions.append(session)

这里创建了多个ONNXruntime会话,每个会话对应一个不同的模型。在推理时,可以同时对多个图像数据用不同的模型进行推理,利用多线程或者异步处理的方式来实现并行,大幅提高效率。

支持CPU/GPU及不同架构

得益于ONNXruntime的强大,我们可以很方便地支持CPU和GPU计算,并且兼容x86和x64位系统。在创建ONNXruntime会话时,可以指定执行提供者。

# 使用GPU
session = onnxruntime.InferenceSession('yolov5.onnx', providers=['CUDAExecutionProvider'])
# 使用CPU
session = onnxruntime.InferenceSession('yolov5.onnx', providers=['CPUExecutionProvider'])

这样简单设置就能根据需求选择使用CPU还是GPU进行推理。

识别视频和图片

无论是识别视频还是图片,流程上都大同小异。对于图片,直接读取图片数据进行预处理后送入推理函数。对于视频,需要逐帧读取视频帧,同样预处理后进行推理。

import cv2

# 读取图片
image = cv2.imread('test.jpg')
result = inference(image)

# 读取视频
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    result = inference(frame)
cap.release()

这段代码展示了如何用OpenCV读取图片和视频,然后调用前面定义的inference函数进行推理。

标注与训练源码

这里还有LabVIEW编写的标注和训练源码(后台调用Python)。标注部分可能涉及到在LabVIEW界面上绘制标注框等操作,然后将标注数据传递给Python进行进一步处理。训练源码则调用Python的深度学习框架(比如PyTorch,因为YOLOv5原生基于PyTorch)来进行模型训练。

labview yolov5实例分割onnxruntime推理,封装dll, labview调用dll,支持同时加载多个模型并行推理,可cpu/gpu, x86/x64位,识别视频和图片,cpu和gpu可选,只需要替换模型的onnx和names即可,源码和库函数,推理速度很快。 同时还有标注,训练源码(labview编写,后台调用python)

总的来说,这套基于LabVIEW的YOLOv5实例分割方案,从ONNX推理到多模型并行,再到不同硬件平台和计算设备的支持,以及标注训练功能,为计算机视觉应用开发提供了一个全面且高效的框架,源码和库函数都具备,而且推理速度相当快,希望能给各位开发者带来启发和帮助。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐