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

LabVIEW搞视觉项目总被人说是"小儿科",但这次咱用YOLOv5+ONNXRuntime整了个活——视频/图像目标检测框架,CPU/GPU随意切换,x86/x64通吃,还能多个模型同时开跑。不信?先看实测数据:1080P视频流处理,GPU推理单帧8ms,i7-12700跑CPU也就20ms左右,比传统视觉方案快出天际。

模型转换超简单,拿官方YOLOv5训练好的pt文件:

import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
torch.onnx.export(model, torch.randn(1,3,640,640), "yolov5s.onnx", opset_version=12)

生成的onnx直接扔进LabVIEW工程,连names标签文件一起打包,换模型就像换皮肤一样简单。

DLL封装这块是重头戏,C++代码用ONNXRuntime的C接口:

// 模型初始化
OrtSession* CreateSession(const char* model_path, int device_type) {
    OrtSessionOptions* options;
    OrtCreateSessionOptions(&options);
    if(device_type == 1) 
        OrtAppendExecutionProvider_CUDA(options, 0);
    return OrtCreateSession(env, model_path, options);
}

关键在内存管理——LabVIEW调用时用到了MoveBlock防止内存泄漏。实测发现,用内存池预处理图像数据,速度还能再提30%。

LabVIEW调用端更有意思,直接上图:

!LabVIEW调用框图

特别要说这个并行处理机制,用LabVIEW自带的队列结构实现模型并行:

// 伪代码
While循环(并行实例数)
    入队待处理图像
    异步调用DLL推理
    出队处理结果
End While

实测开4个YOLOv5s模型同时跑,GPU利用率稳定在85%左右,比串行快2.3倍。

训练部分更狠,LabVIEW前台做数据管理,Python后台干活:

import yaml
with open('data.yaml','w') as f:
    f.write(f'names: {labview传来的标签列表}\n...')
os.system('python train.py --img 640 --batch 16 ...')

标注工具直接对接工业相机,框选标注自动生成YOLO格式,带自动数据增强功能。实测标注效率比LabelImg快一倍,毕竟能用上LabVIEW的硬件控制优势。

踩过的坑也不少:ONNXRuntime的CUDA版本要和显卡驱动严格对应;LabVIEW调用x64 DLL需要配置项目属性;多模型并行时注意显存分配...好在最终效果够顶,产线检测项目实测误检率<0.5%,帧率稳定30FPS以上。

源码打包时做了智能路由——带不带GPU的电脑自动切换推理后端。更骚的是支持模型热更新,产线换型号不用重启程序,直接替换onnx文件就行。这方案现在已经在3C电子和汽车零部件检测场景落地,老板们看着检测效率报表直呼真香。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐