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中央仓库发布,所以需要手动安****r/>
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 ***r/>[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 ~/Download****r/>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或者有目录
然后编译安***r/>
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: image***r/>[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: image***r/>[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: image***r/>[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)
cl***r/>
---- 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: image***r/>[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 部署更多的深度学习模型
————————————————
版权声明:本文为CSDN博主「英特尔开发人员专区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/gc5r8w07u/article/details/134261778