OpenVINO Java API详解与演示

作者:黄明明 英特尔边缘计算创新大使

英特尔® 发行版 OpenVINO™ 工具套件[1] 基于 oneAPI 而开发,可以加快高性能计算机视觉和深度学习视觉应用开发速度工具套件,适用于从边缘到云的各种英特尔平台上,帮助用户更快地将更准确的真实世界结果部署到生产系统中。通过简化的开发工作流程, OpenVINO™ 可赋能开发者在现实世界中部署高性能应用程序和算法。

Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
虽然 OpenVINO™ 在[OpenVINO Contrilb](https://github.com/openvinotoolkit/openvino_contrib/tree/master/modules/java_api) 提供了Ubuntu版本的api,但由于使用JNI技术,这对于没有涉及C/C++编程的开发者并不是特别的友好,且后期的维护更新也带来了不小的麻烦。
在之前的工作中,我们推出了 OpenVINO™ Java API[2] ,旨在推动 OpenVINO™在 Java 领域的应用,目前已经成功在 Mac、Windows、Linux 平台实现使用。在本文中,我们将介绍如何在 英特尔开发套件 AlxBoard 上基于 Linux 系统实现 OpenVINO™ Java API。

项目中所使用的代码已上传至 OpenVINO™ Java API 仓库中,GitHub 网址为:
https://github.com/Hmm466/OpenVINO-Java-API


1. 英特尔开发套件 AlxBoard 介绍

1.1 产品定位

英特尔开发套件 AlxBoard 是英特尔开发套件官方序列中的一员,专为入门级人工智能应用和边缘智能设备而设计。英特尔开发套件 AlxBoard 能完美胜人工智能学习、开发、实训、应用等不同应用场景。该套件预装了英特尔 OpenVINO™ 工具套件、模型仓库和演示。

套件主要接口与 Jetson Nano 载板兼容,GPIO 与树莓派兼容,能够最大限度地复用成熟的生态资源。这使得套件能够作为边缘计算引擎,为人工智能产品验证和开发提供强大支持;同时,也可以作为域控核心,为机器人产品开发提供技术支撑。

使用英特尔开发套件 AlxBoard,您将能够在短时间内构建出一个出色的人工智能应用应用程序。无论是用于科研、教育还是商业领域,英特尔开发套件 AlxBoard 都能为您提供良好的支持。借助 OpenVINO™ 工具套件,CPU、iGPU 都具备强劲的 AI 推理能力,支持在图像分类、目标检测、分割和语音处理等应用中并行运行多个神经网络。

1.2 产品参数

1.3 AI推理单元

借助 OpenVINO™ 工具,能够实现 CPU+iGPU 异构计算推理,IGPU 算力约为 0.6TOPS

2. 准备工作

2.1 配置java 环境

下载并配置JDK:

JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Environment),一些Java工具和Java的核心类库(Java API)。不论什么Java应用服务器实质都是内置了某个版本的JDK。主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK.

2.1.1 添加api到本地maven 

添加OpenVINO™ Java API 至Maven(目前没有在meven中央仓库发布,所以需要手动安装)

2.1.2 clone OpenVINO™ Java API 项目到本地

git clone https://github.com/Hmm466/OpenVINO-Java-API

2.1.3 通过IDEA 或 Eclipse 打开

通过maven install 到本地maven 库中

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  14.647 s
[INFO] Finished at: 2023-11-02T21:34:49+08:00
[INFO] ------------------------------------------------------------------------

jar包会放置在

/{userHome}/.m2/repository/org/openvino/java-api/1.0-SNAPSHOT/java-api-1.0-SNAPSHOT.pom

2.2 安装 OpenVINO™ Runtime

OpenVINO™ 有两种安装方式: OpenVINO™ Runtime 和OpenVINO™ Development Tools。OpenVINO™ Runtime 包含用于在处理器设备上运行模型部署推理的核心库。OpenVINO™ Development Tools 是一组用于处理 OpenVINO™ 和 OpenVINO™ 模型的工具,包括模型优化器、OpenVINO™ Runtime、模型下载器等。在此处我们只需要安装 OpenVINO™ Runtime 即可。

2.2.1 下载 OpenVINO™ Runtime

访问 Download the Intel Distribution of OpenVINO™ Toolkit[5] 页面,按照下面流程选择相应的安装选项,在下载页面,由于AIxBoard使用的是 Ubuntu20.04,因此下载时按照指定的编译版本下载即可。

2.2.2 解压缩安装包

我们所下载的 OpenVINO™ Runtime 本质是一个 C++ 依赖包,因此我们把它放到我们的系统目录下,这样在编译时会根据设置的系统变量获取依赖项。

cd ~/Downloads/
tar -xvzf l_openvino_toolkit_ubuntu20_2022.3.1.9227.cf2c7da5689_x86_64.tgz
sudo mv l_openvino_toolkit_ubuntu20_2022.3.1.9227.cf2c7da5689_x86_64/runtime/lib/intel64/* /usr/lib/

2.3 编译OpenCV java 库

2.3.1 下载ANT

由于OpenCV 编译出libopencv_java{version}.[so|dll|dylib] 需要apache ant的支持,所以需要手动下载ant 并加入环境变量
官网:ant.apache.org

export ANT_HOME={ant_home}
export PATH=$ANT_HOME/bin:$PATH

2.3.2 OpenCV 下载源代码

opencv官网下载源码

解压缩之后进入文件夹

mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DBUILD_ZLIB=OFF -DCMAKE_INSTALL_PREFIX=你的opencv目录 
  -DJAVA_INCLUDE_PATH={jdk 所在位置}/include -DJAVA_AWT_INCLUDE_PATH={jdk 所在位置}/include 
  -DJAVA_INCLUDE_PATH2={jdk 所在位置}/include -DBUILD_JAVA=ON ../

注意看输出有没有

--   Java:                          
--     ant:                         
--     JNI:                         
--     Java wrappers:               
--     Java tests:   

需要不为NO或者有目录
然后编译安装

make -j 8
make install

3. 在AlxBoard 上进行测试

3.1 源代码直接测试

git clone https://github.com/Hmm466/OpenVINO-Java-API

- 使用IDEA / Eclipse 打开项目
- 运行src/test/java/org.openvino.java.test.YoloV8Test

3.2 创建其他项目进行测试

创建一个AlxBoardDeployYolov8 Maven项目
创建完成之后引用我们刚刚install的OpenVINO-Java-API,或者直接clone 项目直接修改体验

maven引用

<dependency>
   <groupId>org.openvino</groupId>
   <artifactId>java-api</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>

[注意:如果才用maven 依赖需要注意opencv的库引用问题.可以将OpenVINO-Java-API/libs的opencv库引用到你的项目下]

编写测试代码:

OpenVINO vino = OpenVINO.load();
OvVersion version = vino.getVersion();
Console.println("---- OpenVINO INFO----");
Console.println("Description : %s", version.description);
Console.println("Build number: %s", version.buildNumber);

结果将输出:

--- OpenVINO INFO----
Description : OpenVINO Runtime
Build number: 2023.2.0-12538-e7c1344d3c3

det

Description : OpenVINO Runtime
Build number: 2023.2.0-12538-e7c1344d3c3
[INFO] Loading model files: model/yolov8/yolov8s.xml
[INFO] model name: torch_jit
[INFO]    inputs:
[INFO]      input name: images
[INFO]      input type: Node
[INFO]      input shape: Shape{, rank=4, dims=1,3,640,640}
[INFO]    outputs:
[INFO]      output name: output0
[INFO]      output type: Node
[INFO]      output shape: Shape{, rank=3, dims=1,84,8400}
[INFO] Read image  files: dataset/image/demo_2.jpg

  Detection  result : 

1: 0	0.88585377   {744, 43, 388x667}
2: 0	0.87911075   {149, 202, 954x507}
3: 27	0.7225534   {435, 433, 98x284}

seg

---- OpenVINO INFO----
Description : OpenVINO Runtime
Build number: 2023.2.0-12538-e7c1344d3c3
[INFO] Loading model files: model/yolov8/yolov8s-seg.xml
[INFO] model name: torch_jit
[INFO]    inputs:
[INFO]      input name: images
[INFO]      input type: Node
[INFO]      input shape: Shape{, rank=4, dims=1,3,640,640}
[INFO]    outputs:
[INFO]      output name: output0
[INFO]      output type: Node
[INFO]      output shape: Shape{, rank=3, dims=1,116,8400}
[INFO] Read image  files: dataset/image/demo_2.jpg

  Segmentation  result : 

1: 0	0.8988322   {745, 41, 402x671}
2: 0	0.8630947   {118, 196, 1011x515}
3: 27	0.6970458   {434, 436, 90x280}

pose

---- OpenVINO INFO----
Description : OpenVINO Runtime
Build number: 2023.2.0-12538-e7c1344d3c3
[INFO] Loading model files: model/yolov8/yolov8s.xml
[INFO] model name: torch_jit
[INFO]    inputs:
[INFO]      input name: images
[INFO]      input type: Node
[INFO]      input shape: Shape{, rank=4, dims=1,3,640,640}
[INFO]    outputs:
[INFO]      output name: output0
[INFO]      output type: Node
[INFO]      output shape: Shape{, rank=3, dims=1,84,8400}
[INFO] Read image  files: dataset/image/demo_2.jpg

 Classification  result : 

1: 1   0.88585377   {744, 43, 388x667}  Nose: (0.0 ,0.0 ,4.446762E-6) Left Eye: (0.0 ,0.0 ,5.1098637E-6) Right Eye: (0.0 ,0.0 ,2.5492784E-6) Left Ear: (0.0 ,0.0 ,3.8548264E-6) Right Ear: (0.0 ,0.0 ,5.493899E-6) Left Shoulder: (0.0 ,0.0 ,2.8905094E-6) Right Shoulder: (0.0 ,0.0 ,4.185275E-6) Left Elbow: (0.0 ,0.0 ,4.1954772E-6) Right Elbow: (0.0 ,0.0 ,3.3010822E-6) Left Wrist: (0.0 ,0.0 ,9.217298E-6) Right Wrist: (0.0 ,0.0 ,5.601134E-6) Left Hip: (0.0 ,0.0 ,2.5226416E-6) Right Hip: (0.0 ,0.0 ,4.9324813E-6) Left Knee: (0.0 ,0.0 ,5.6728954E-6) Right Knee: (0.0 ,0.0 ,3.1320922E-6) Left Ankle: (0.0 ,0.0 ,7.081372E-7) Right Ankle: (0.0 ,0.0 ,4.169948E-6) 
2: 1   0.87911075   {149, 202, 954x507}  Nose: (0.0 ,0.0 ,2.6389546E-6) Left Eye: (0.0 ,0.0 ,2.7424064E-6) Right Eye: (0.0 ,0.0 ,2.0069933E-6) Left Ear: (0.0 ,0.0 ,2.9333999E-6) Right Ear: (0.0 ,0.0 ,4.0347936E-6) Left Shoulder: (0.0 ,0.0 ,4.200782E-6) Right Shoulder: (0.0 ,0.0 ,2.5432491E-6) Left Elbow: (0.0 ,0.0 ,1.7569737E-6) Right Elbow: (0.0 ,0.0 ,1.9186296E-6) Left Wrist: (0.0 ,0.0 ,3.1343661E-6) Right Wrist: (0.0 ,0.0 ,2.889939E-6) Left Hip: (0.0 ,0.0 ,1.7592807E-6) Right Hip: (0.0 ,0.0 ,1.5011567E-6) Left Knee: (0.0 ,0.0 ,3.6549225E-6) Right Knee: (0.0 ,0.0 ,1.9932615E-6) Left Ankle: (0.0 ,0.0 ,1.012553E-6) Right Ankle: (0.0 ,0.0 ,8.3442E-6) 

cls

---- OpenVINO INFO----
Description : OpenVINO Runtime
Build number: 2023.2.0-12538-e7c1344d3c3
[INFO] Loading model files: model/yolov8/yolov8s.xml
[INFO] model name: torch_jit
[INFO]    inputs:
[INFO]      input name: images
[INFO]      input type: Node
[INFO]      input shape: Shape{, rank=4, dims=1,3,640,640}
[INFO]    outputs:
[INFO]      output name: output0
[INFO]      output type: Node
[INFO]      output shape: Shape{, rank=3, dims=1,84,8400}
[INFO] Read image  files: dataset/image/demo_2.jpg

 Classification Top 10 result : 

classid probability
------- -----------
{14789}     {635.549438}
{3679}     {635.543701}
{14788}     {635.522583}
{14731}     {635.518616}
{14730}     {635.513428}
{3839}     {635.502441}
{14790}     {635.497314}
{14732}     {635.489258}
{14781}     {635.486694}
{14739}     {635.484985}

4. 总结

在该项目中,我们基于AlxBoard为硬件基础实现了Java在 Ubuntu 22.04 系统上成功使用OpenVINO™ Java API,并且成功允许了Yolov8模型,验证了Java运行的可行性,并简化了Java开发者对于AI类项目的上手难度。
同时OpenVINO™ Java API 已完成了Mac、Linux、Windows的测试,Windows平台的文档也正在输出。后续我还会将继续使用 OpenVINO™ Java API 在 英特尔开发套件 AlxBoard 部署更多的深度学习模型。

猜你喜欢

转载自blog.csdn.net/gc5r8w07u/article/details/134261778