OpenVINO 的特长,在 C# WinForm 中部署 YOLOv8(以及更新的 YOLO11)的 OpenVINO 模型,核心思路是用 Intel 的推理引擎替代 ONNX Runtime,在 Intel 硬件(CPU/核显)上获得更优的推理速度。
📦 方案一:YoloSharpOnnx + OpenVINO(推荐,代码最简)
YoloSharpOnnx这个 NuGet 包直接内置了ExecutionProviderOpenVINO,让你能用几行代码切换到 OpenVINO 推理。它比手写 OpenVINO C# API 封装省事得多。
安装 NuGet 包:
dotnetaddpackage YoloSharpOnnx dotnetaddpackage OpenCvSharp4.runtime.win dotnetaddpackage Intel.ML.OnnxRuntime.OpenVinoC# 核心调用(替换你代码中的Yolov8Manager):
usingYoloSharp;usingOpenCvSharp;// 使用 OpenVINO 执行提供器,指定设备类型(CPU 或 NPU)usingYoloSharpyolo=newYoloSharp(newExecutionProviderOpenVINO("yolov8n.onnx",IntelDeviceType.CPU));usingMatimage=Cv2.ImRead("test.jpg");List<DetectionResult>results=yolo.RunDetect(image);yolo.DrawDetections(image,results);Cv2.ImWrite("result.jpg",image);Console.WriteLine(results.Summary());这套写法可以直接嵌入你现有的 WinForm 事件处理中,RunDetect的输入输出与之前一致,替换的只是底层执行引擎。
🚀 方案二:OpenVINO C# API 原生调用(控制力最强)
如果追求极致控制,可以使用guojin-yan开发的OpenVINO C# API。这是一个专门为 .NET 封装的 OpenVINO 接口库,提供了完整的原生调用能力。
NuGet 安装:
dotnetaddpackage OpenVINO.CSharp.API dotnetaddpackage OpenVINO.runtime.win dotnetaddpackage OpenVINO.CSharp.API.Extensions.OpenCvSharpC# 推理流程(参考 YOLO26 部署案例):
usingOpenVinoSharp;usingOpenCvSharp;Corecore=newCore();CompiledModelcompiledModel=core.compile_model("yolov8n_openvino_model/yolov8n.xml","CPU");InferRequestinferRequest=compiledModel.create_infer_request();// 图像预处理:BGR → RGB → Letterbox → 归一化 → NCHWMatimage=Cv2.ImRead("test.jpg");MatrgbMat=image.CvtColor(ColorConversionCodes.BGR2RGB);rgbMat=Resize.letterbox_img(rgbMat,640,outvarscales);MatnormalizedMat=newMat();rgbMat.ConvertTo(normalizedMat,MatType.CV_32FC3,1.0/255.0f);// 转换为 float[] 并设置输入张量float[]data=Permute.run(normalizedMat);TensorinputTensor=inferRequest.get_input_tensor();inputTensor.set_data(data);// 推理inferRequest.infer();varoutputTensor=inferRequest.get_output_tensor();varoutput=outputTensor.get_data<float>((int)outputTensor.get_size());// 后处理(YOLOv8 输出 [1, 84, 8400] 或 [1, 8400, 84])// ... 解析输出,应用 NMS,绘制结果 ...📊 性能参考:异步推理是关键
OpenVINO 在 Intel 集成显卡上的表现非常突出。根据实测数据,异步推理接口相比同步模式有数倍提升:
| 推理模式 | 预处理 | 推理 | 后处理 | 总耗时 | FPS |
|---|---|---|---|---|---|
| 同步 | 11.97 ms | 34.68 ms | 1.58 ms | 48.23 ms | 20.73 |
| 异步 | 14.26 ms | 0.01 ms | 1.22 ms | 15.49 ms | 64.56 |
异步模式下,CPU 在等待推理结果时可以进行下一帧的预处理,从而将 GPU/CPU 利用率最大化。在 Intel Iris Xe 核显上,YOLOv8s 可以跑到60+ FPS,完全满足工业实时检测需求。
⚠️ 与你现有代码的适配建议
你现在的代码中,Form1_Load里加载的是yolov8n.xml(OpenVINO IR 格式的模型描述文件)。如果用YoloSharpOnnx,需要把模型换成ONNX 格式(因为该库走的是 ONNX Runtime 的 OpenVINO EP 路线)。而如果用OpenVINO C# API,则可以继续使用.xml+.bin的 IR 模型,与你现有的LoadWeights逻辑更契合。
对于button3_Click中的摄像头循环,建议将推理放在Task.Run中,UI 更新用BeginInvoke回主线程,避免界面卡死。你现有的 FPS 统计逻辑可以保留,用Stopwatch测量的异步推理时间会大幅下降。