为.NET打开新大门:OpenVINO.NET开源项目全新发布

【源创会预告】1024 程序员节(的前两天),相约开源中国办公室,我们一起聊 AI!>>>

                                                                                                为.NET打开新大门:OpenVINO.NET开源项目全新发布 

在AI的应用越来越广泛的今天,优化深度学习模型并进行推理部署已经成为了一门必要的技术。Intel开发的OpenVINO工具包(Open Visual Inference and Neural network Optimization)就是这样一款强大的工具。作为一个开源的工具包,OpenVINO为开发者提供了强大的深度学习模型优化和推理功能,支持跨不同的Intel硬件平台进行部署,包括CPU, 集成GPU, Intel Movidius VPU, 和FPGAs。该工具包的初衷就是实现一处编码后,能在任何地方部署的机器学习推理的解决方案。

然而在与深度学习模型推理打交道的过程中,我逐渐发现原本我基于百度飞桨paddlepaddle开发过的PaddleSharp项目在CPU推理OCR性能方面,同样的模型,OpenVINO的性能更胜一筹。于是我开始关注OpenVINO,发现它的C API对于.NET世界来说并没有一个合适且高质量的封装。市面上的一部分封装可能只是为了满足特定项目的需求,功能不够完善;有些虽然功能完善但命名规范可能不符合.NET社区规范;有些在错误处理和性能方面存在问题,或者无法做到跨平台,这与OpenVINO的跨平台性矛盾。.NET世界亟需一个更高质量的OpenVINO封装,而我感觉我有能力去努努力。因此,我在今年的节前立下了flag——国庆期间大干一票,开始了OpenVINO.NET的开源之旅。

如何使用

NuGet包简介

使用OpenVINO.NET,最简单的方法不是克隆我的Github库(但欢迎star),而是使用我发布的NuGet包,一般它需要配合OpenCVSharp4一起使用,因此你通常可以安装下面4个NuGet:

  • Sdcb.OpenVINO
  • Sdcb.OpenVINO.runtime.win-x64
  • OpenCvSharp4
  • OpenCvSharp4.runtime.win

OpenCvSharp4一样,我发布的包也包含.NET PInvoke包和平台动态链接库包,如上Sdcb.OpenVINO为.NET PInvoke包,Sdcb.OpenVINO.runtime.win-x64为兼容Windows平台的动态链接库包,里面包含了一些dll。

如果是基于Linux,我专门发布了一个镜像用于减轻部署压力:sdflysha/openvino-base,这个镜像基于.NET 7 SDK的Ubuntu 22.04版本,包含了OpenCvSharp 4.8的运行时和所有OpenVINO的运行时依赖,要使用这个镜像,需将.NET项目第一行的FROM mcr.microsoft.com/dotnet/runtime改为FROM sdflysha/openvino-base,使用时当然也需要安装ubuntu 22.04平台的动态链接库包:Sdcb.OpenVINO.runtime.ubuntu.22.04-x64

实际上我发布了8种不同平台的NuGet包,这是所有我此项目新发布的NuGet包列表:

包名 版本号 简介
Sdcb.OpenVINO 为.NET打开新大门:OpenVINO.NET开源项目全新发布-1 .NET PInvoke
Sdcb.OpenVINO.runtime.centos.7-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-2 CentOS 7 x64
Sdcb.OpenVINO.runtime.debian.9-arm 为.NET打开新大门:OpenVINO.NET开源项目全新发布-3 Debian 9 ARM
Sdcb.OpenVINO.runtime.debian.9-arm64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-4 Debian 9 ARM64
Sdcb.OpenVINO.runtime.rhel.8-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-5 RHEL 8 x64
Sdcb.OpenVINO.runtime.ubuntu.18.04-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-6 Ubuntu 18.04 x64
Sdcb.OpenVINO.runtime.ubuntu.20.04-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-7 Ubuntu 20.04 x64
Sdcb.OpenVINO.runtime.ubuntu.22.04-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-8 Ubuntu 22.04 x64
Sdcb.OpenVINO.runtime.win-x64 为.NET打开新大门:OpenVINO.NET开源项目全新发布-9 Windows x64

有兴趣的朋友一定会想,发布并维护这么多包做起来一定很麻烦。其实还好,感谢我此前PaddleSharp项目的经验(那个项目也维护了一屏幕的包),我基于官网的filetree.json做了一些解析,它可以一键自动下载并生成上面这些NuGet包,有兴趣的朋友可以看看我Github中Sdcb.OpenVINO.NuGetBuilder这个项目了解我是如何解析并自动创建NuGet包的。

API设计

和我此前做过的PaddleSharp, Sdcb.LibRaw, Sdcb.Arithmetic, Sdcb.FFmpeg等开源项目相似,我这个项目也秉持下面这些原则:

  1. 完全支持低级C API,也就是说如果你更享受原汁原味的C API的感觉——或者像我一样不想失去对低层的掌控,使用OpenVINO.NET可以满足这一期望;
  2. 同时也为所有的低级API提供了便利好用的高层API;
  3. 高层API符合C#的命名规范,完全利用了C#的优秀特性,做好了异常错误处理;
  4. 高层API使用了C#世界有利于性能优化的特性,如ReadOnlySpan<T>,比如恰当使用值类型;
  5. 所有的高层API都提供了完善了XML注释,并经过了详尽的单元测试;
  6. 此外我还控制了我携带的“私货”——没必要做成公有的API一律做成internalprivate,且不污染常用类型的扩展方法

目前这个项目已经基本稳定,基于这些API,我测试发现它和C/C++推理性能几乎并无差异,PaddleOCR推理时,性能可以比PaddleSharp项目快得多,且得益于C#的优秀语言特性,使用起来会非常的省心。

设计FAQ:

  • Q: 为何OpenVINO.NET没有直接引用OpenCvSharp4
    • A: 我个人很喜欢OpenCvSharp4,开源协议很友好,但一来OpenCvSharp4官方支持的平台不够多,且有些人可能更喜欢Emgu.CVImageSharp,尽量不做绑架为好
  • Q: C API有158个函数接口、26个接口体,也写了详尽的XML注释,是怎么在短时间内高质量地做到的?
    • A: 我是自动生成的,我使用了CppSharp项目,CppSharp将C API的头文件内容转换为抽象语法树(AST),然后我将这些AST转换为XML注释详尽的C#代码。其实我已经不是第一次将CppSharp应用到开源项目中,有兴趣的朋友可以看我Github Sdcb.OpenVINO.AutoGen这个项目了解实现的细节。