为.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的开源之旅。

地址:https://github.com/sdcb/openvino.net

407bc2fd87f63a1667ee21e09975f9c1.png

包名版本号简介
Sdcb.OpenVINOoutside_default.png.NET PInvoke
Sdcb.OpenVINO.runtime.centos.7-x64outside_default.pngCentOS 7 x64
Sdcb.OpenVINO.runtime.debian.9-armoutside_default.pngDebian 9 ARM
Sdcb.OpenVINO.runtime.debian.9-arm64outside_default.pngDebian 9 ARM64
Sdcb.OpenVINO.runtime.rhel.8-x64outside_default.pngRHEL 8 x64
Sdcb.OpenVINO.runtime.ubuntu.18.04-x64outside_default.pngUbuntu 18.04 x64
Sdcb.OpenVINO.runtime.ubuntu.20.04-x64outside_default.pngUbuntu 20.04 x64
Sdcb.OpenVINO.runtime.ubuntu.22.04-x64outside_default.pngUbuntu 22.04 x64
Sdcb.OpenVINO.runtime.win-x64outside_default.pngWindows x64

46ec8f4545c2b1d846c2636ba4dce8d9.png

  • 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项目。另外我还想畅谈一下项目的设计思路和未来的发展方向。

四个示例

人脸检测 - 基于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仓库找到,运行时,它会将摄像头中定位人脸位置并框出来,效果图如下:24e02316c6d2b592e619d4ec64dbf3bd.png

df727adb3764cd856c9641009cdbe0f6.png

9656dda543bf2027968e264aba6b3e2a.jpeg

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

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

yolov8模型提供了1000种不同的预定义分类,和上面的模型一样,需要从yolov8官网下载并转换,只想快速尝鲜的朋友可以直接打开我写的另一个Github示例:sdcb-openvino-yolov8-cls运行时,代码会读取一张图片,然后尝试推测出该图片最像1000种分类中的哪一种,在我的代码示例中,输入图片为hen.jpg:

36e479472bcf71fc41c85a3eddc09c67.jpeg

输出如下:

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

46316f27e5dacb570deb4ccbdf202978.png

using OpenCvSharp;
using Sdcb.OpenVINO.PaddleOCR.Models.Online;
using Sdcb.OpenVINO.PaddleOCR.Models;
using Sdcb.OpenVINO.PaddleOCR;
using System.Diagnostics;
using System;

FullOcrModel model = await OnlineFullModels.ChineseV3.DownloadAsync();

using Mat src = Cv2.ImDecode(await new HttpClient().GetByteArrayAsync("https://io.starworks.cc:88/paddlesharp/ocr/samples/xdr5450.webp"), ImreadModes.Color);

using (PaddleOcrAll all = new(model)
{
    AllowRotateDetection = true,
    Enable180Classification = true,
})
{
    // Load local file by following code:
    // using (Mat src2 = Cv2.ImRead(@"C:\test.jpg"))
    Stopwatch sw = Stopwatch.StartNew();
    PaddleOcrResult result = all.Run(src);
    Console.WriteLine($"elapsed={sw.ElapsedMilliseconds} ms");
    Console.WriteLine("Detected all texts: \n" + result.Text);
    foreach (PaddleOcrResultRegion region in result.Regions)
    {
        Console.WriteLine($"Text: {region.Text}, Score: {region.Score}, RectCenter: {region.Rect.Center}, RectSize:    {region.Rect.Size}, Angle: {region.Rect.Angle}");
    }
}

运行效果如下:

elapsed=246 ms
Detected all texts:
高速4X4160MHz数据流
5GHz频段流数多一倍
速度快一倍3
AX5400无线规格的路由器,
5GHz频段采用高速4X4160MHz数据流,
相比市面上主流的AX3000路由器(2X2数据流)
5GHz频段流数多一倍,速度快一倍。
...

cfb35fa23d8c59fe705b8a1a65eadda3.png

如果你发现这个项目有用,或者正在使用它,我非常欢迎你能去我的项目主页上给我一个star🌟,这对我将会是巨大的鼓励!你们的使用经验和星标都是我继续进行.NET开源项目工作的动力!

转自:.NET骚操作

链接:cnblogs.com/sdflysha/p/20231015-sdcb-openvino-net.html

- EOF -

技术群:添加小编微信dotnet999

公众号:Dotnet讲堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值