首页 > 其他分享 >为.NET打开新大门:OpenVINO.NET开源项目全新发布

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

时间:2023-10-16 12:22:43浏览次数:88  
标签:OpenVINO PaddleOCR x64 开源 Sdcb runtime 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 NuGet .NET PInvoke
Sdcb.OpenVINO.runtime.centos.7-x64 NuGet CentOS 7 x64
Sdcb.OpenVINO.runtime.debian.9-arm NuGet Debian 9 ARM
Sdcb.OpenVINO.runtime.debian.9-arm64 NuGet Debian 9 ARM64
Sdcb.OpenVINO.runtime.rhel.8-x64 NuGet RHEL 8 x64
Sdcb.OpenVINO.runtime.ubuntu.18.04-x64 NuGet Ubuntu 18.04 x64
Sdcb.OpenVINO.runtime.ubuntu.20.04-x64 NuGet Ubuntu 20.04 x64
Sdcb.OpenVINO.runtime.ubuntu.22.04-x64 NuGet Ubuntu 22.04 x64
Sdcb.OpenVINO.runtime.win-x64 NuGet Windows x64

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

API设计

和我此前做过的PaddleSharpSdcb.LibRawSdcb.ArithmeticSdcb.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这个项目了解实现的细节。

为想了解如何使用的朋友,我还写了基于yolov8的检测和分类的推理示例,OpenVINO官方的人脸检测示例以及我为它原生设计和迁移的PaddleOCR项目。另外我还想畅谈一下项目的设计思路和未来的发展方向。

4个示例

人脸检测 - 基于OpenVINO官网提供的face-detection-0200模型

我这个示例中使用的是OpenVINO官网提供的face-detection-0200模型,官网提供了介绍页面:https://docs.openvino.ai/2023.1/omz_models_model_face_detection_0200.html。

详尽的示例代码可以从我创建的mini-openvino-facedetection这个Github仓库找到,运行时,它会将摄像头中定位人脸位置并框出来,效果图如下:

如图,人脸识别效果正常,上面也标注了每帧推理耗时(约2.14ms)。

我使用的是AMD R7 5800X进行的CPU推理,其实代码也支持Intel的GPU。将DeviceOptions的第一个参数从"CPU"(默认值)改为"GPU"即可,但我只有集成显卡,测试发现虽然能正常工作,且CPU使用率降低了且GPU使用率上升了,但GPU推理时间比CPU还更慢。

物体识别 - 基于yolov8模型的物体分类

在上一个例子中,我们已经看到了如何使用OpenVINO.NET进行人脸检测。接下来,我们再来看一下如何使用物体识别模型进行物体分类。

这个示例使用的是yolov8官网下载的YOLOv8n模型,这个模型支持80种物体的检测。下载后格式为.pt文件,表示pytorch模型,需使用yolo export model=yolov8n.pt format=openvino命令(yolo通过pip安装ultralytics包得到)将其导出为openvino格式的模型,openvino模型包含一个xml和一个bin文件。

详尽的示例代码可以从我创建的另一个仓库:sdcb-openvino-yolov8-det中找到,仓库我我已经将模型转换好了。运行时,代码会读取摄像头的每一帧,并将检测到的物体位置框出来,效果图如下:

如图,检测出了3个物体,画面中的人、手机和水杯,总耗时约30ms。

物体分类 - 基于yolov8的分类模型

yolov8模型提供了1000种不同的预定义分类,和上面的模型一样,需要从yolov8官网下载并转换,只想快速尝鲜的朋友可以直接打开我写的另一个Github示例:sdcb-openvino-yolov8-cls

运行时,代码会读取一张图片,然后尝试推测出该图片最像1000种分类中的哪一种,在我的代码示例中,输入图片为hen.jpg:

输出如下:

class id=hen, score=0.59
preprocess time: 0.00ms
infer time: 1.65ms
postprocess time: 0.49ms
Total time: 2.14ms

推理得到最有可能的分类是hen(母鸡),信心值为0.59,总耗时2.14ms。

PaddleOCR - 混合3种模型

PaddleOCR是百度飞桨发布了一款性能、精度都较好的开源模型。

和PaddleSharp项目一样,我给OpenVINO.NET项目也内置了PaddleOCR的便利化项目,且API设计和PaddleSharp几乎完全一样,熟悉PaddleSharp的朋友应该可以很轻松地迁移到OpenVINO.NET,我专门为PaddleOCR提供发布了下面2个NuGet包:

包名版本号

标签:OpenVINO,PaddleOCR,x64,开源,Sdcb,runtime,NET
From: https://www.cnblogs.com/chinasoft/p/17767087.html

相关文章

  • .NET 一些常用的类型转换扩展
    ///<summary>///转换扩展类///</summary>publicstaticpartialclassExtensions{#region转换为long///<summary>///将object转换为long,若转换失败,则返回0。不抛出异常。///</summary>///&l......
  • .NET高性能开发-位图索引(一)
    首先来假设这样一个业务场景,大家对于飞机票应该不陌生,大家在购买机票时,首先是选择您期望的起抵城市和时间,然后选择舱等(公务舱、经济舱),点击查询以后就会出现航班列表,随意的点击一个航班,可以发现有非常多组价格,因为机票和火车票不一样,它的权益、规则更加的复杂,比如有机票中有针对......
  • .NET CORE 之 gRPC使用
    gRPC简单介绍gRPC是一种与语言无关的高性能远程过程调用(RPC)框架(google开源的rpc框架)。gRPC默认使用protocolbuffers,这是Google开源的一套成熟的结构数据序列化机制(也可以使用其他数据格式如JSON) gRPC的主要优点是: HTTP2传输现代高性能轻量级RPC框架。协定......
  • 这三大爆款开源项目竟出自同一个20人的小公司?
    环界云计算是一家非常小的公司,在成立不足两年的时间里,便孵化出三个备受瞩目的开源项目:Sealos、Laf、FastGPT。而更让人惊叹的是,这家公司只有21名员工。项目概览Sealos:拥有11,000颗Star,这是一个云操作系统,成为了很多开发者的首选平台。Laf:累计获得了接近6,000Star,为开......
  • 基于JT/T1078协议的开源 java视频服务系统
    ​首先,让我们来概述一下JT/T1078协议。JT/T1078协议,也称为"道路交通视频监控系统信息模型与通信协议",是由中华人民共和国交通运输部提出并规范的一种视频服务协议,主要应用于道路交通视频监控系统的设计和实施。其目的是确保视频服务的互操作性、可扩展性和安全性。基于JT/T1078......
  • Networking
    Computernetworksusenetworkprotocolstocommunicatewitheachother.Networkprotocolsareoftenabstractedintodifferentlayers.Forexample,OpenSystemsInterconnection(OSI)describessevenlayersofcommunicationprotocols—startingfromtheapp......
  • 基于北斗融合技术的开源智能公交调度系统技术方案
     一、概述智能公交调度系统是一个集成了先进通信技术、数据处理技术和人工智能技术的管理系统,旨在提高公交车的运营效率、减少误点和乘客等待时间,同时提升公交服务水平。 二、技术方案通信技术:该系统主要采用4G/5G无线通信技术,实现数据的实时传输和指令的即时接收。此外,......
  • 使用 Kubernetes 简化平台工程
    平台工程在现代应用程序开发和部署中发挥的作用至关重要。随着软件应用程序变得越来越复杂和分散,对稳健且可扩展的基础设施的需求变得越来越重要。这就是平台工程的作用所在,它是支持整个软件开发生命周期的支柱。让我们深入探讨平台工程在创建和维护应用程序基础设施方面的重要作......
  • [转]记一次升级.net 4.7.2版本出现未能加载文件或程序集“System.Net.Http"
    转自【https://www.cnblogs.com/ldybyz/p/13932978.html】webconfig的配置<dependentAssembly><assemblyIdentityname="System.Net.Http"publicKeyToken="b03f5f7f11d50a3a"culture="neutral"/><bindingRedirectoldVersion=&quo......
  • 详解.NET依赖注入中对象的创建与“销毁”
    在DI容器中注册类型,DI容器就可以帮我们创建类型的实例;如果注册类型实现了IAsyncDisposable或者IDisposable接口,对象销毁时DI容器还会帮我们调用DisposeAsync或Dispose方法。这是如何实现的呢?一起来看看吧。本文是基于DependencyInjection8.0编写。如果已熟练使用,可以直接从第三......