
OpenVINO™ JavaScript API详解与范例丨开发者实战
本文将介绍常用的OpenVINO™JavaScript API,并给出基于yolov8s-cls模型的推理范例程序。
作者:腾讯科技前端开发 涂小丽
从OpenVINO™ 2024.0开始,官方除了提供Python/C/C++ API外,还新增了JavaScript API。通过OpenVINO™ JavaScript API,开发者可以非常方便的将AI能力嵌入到网页形式的应用中去。

本文将介绍常用的OpenVINO™ JavaScript API,并给出基于yolov8s-cls模型的推理范例程序。请读者先下载并导出yolov8s-cls.onnx模型,然后转换为FP16 精度的 OpenVINO™ IR 格式模型yolov8s-cls.xml&bin:
conda create -n ov_book python=3.11conda activate jspython -m pip install --upgrade pippip install ultralytics openvinoyolo export model=yolov8s-cls.pt format=onnx imgsz=224 #下载并导出yolov8s-cls.onnxovc yolov8s-cls.onnx #使用ovc工具将yolov8s-onnx模型转换为IR模型

1. 搭建OpenVINO™ JavaScript 开发环境
搭建OpenVINO™ JavaScript 开发环境包括:
-
安装JavaScript运行环境Node.js
-
安装JavaScript编辑器VS Code
-
安装openvino-node
1.1 安装JavaScript运行环境Node.js
Node.js 是一个开源的、跨平台的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端的应用程序。Node.js是基于Chrome V8 JavaScript引擎构建的,这使得它能够高效地处理大量的并发连接,并且保持非常高的性能。
请进入node.js官网:https://nodejs.org/zh-cn,下载并安装Node.js。请注意openvino-node要求node.js版本大于20。

1.2 安装JavaScript编辑器VS Code
Visual Studio Code(简称“VS Code”) 是一款源、免费、颜值高且功能强大的代码编辑器,已成为JavaScript的主流代码编写工具。
请从VS Code官网:https://code.visualstudio.com/,下载并安装VS Code。
请下载本文的范例代码到本地:
git clone https://github.com/txl1123/OpenVINO-JavaScript-API.git
然后用VS Code的“File”菜单“Open Folder...”选项打开OpenVINO-JavaScript-API,若能打开并浏览yolov8s-cls.js,说明VS Code安装成功。

1.3 安装openvino-node
openvino-node是OpenVINO™ JavaScript库,在Windows PowerShell中用命令完成安装:
npm config set registry https://registry.npmmirror.comnpm install openvino-node
安装完毕后,编写测试脚本test.js
const { addon: ov } = require('openvino-node');console.log(ov);
运行若如下图所示,说明安装成功!

2. OpenVINO™ JavaScript API简介
由于OpenVINO™ JavaScript API是基于OpenVINO™ C/C++库的封装,让JavaScript 代码可以调用原本由 C++ 编写的 OpenVINO™ 库中的函数和方法,所以OpenVINO™ JavaScript的常用API跟OpenVINO C++/Python API非常类似,如下表所示。

3. 英特尔®酷睿™ Ultra处理器简介
英特尔® 酷睿™ Ultra处理器内置CPU+GPU+NPU 的三大 AI 引擎,赋能AI大模型在不联网的终端设备上进行推理计算。

4.OpenVINO™ JavaScript API范例
基于YOLOv8分类模型yolov8s-cls的OpenVINO™ JavaScript API完整范例程序如下所示,这段代码首先导入了必要的模块,然后定义了一个 main 函数,该函数执行以下操作:
-
初始化OpenVINO运行时核心。
-
读取模型文件。
-
读取和预处理输入图像。
-
创建输入张量。
-
将模型加载到CPU设备上。
-
创建推理请求并执行同步推理。
-
处理输出结果并打印分类结果。
// 导入 OpenVINO 和 OpenCV 的 Node.js 模块const { addon: ov } = require('openvino-node');const { cv } = require('opencv-wasm');const { getImageData, hwcToNchw } = require('./helper.js');// 调用主函数并传入模型路径和图像路径main('./model/yolov8s-cls.xml', './imgs/car.png');async function main(modelPath, imagePath) {// ----------------- 步骤 1. 初始化 OpenVINO 运行时核心 -----------------console.log('创建 OpenVINO 运行时核心');const core = new ov.Core();// ----------------- 步骤 2. 读取模型 -------------------------------------console.log(`读取模型: ${modelPath}`);const model = await core.readModel(modelPath);// ----------------- 步骤 3. 设置输入 -------------------------------------// 读取输入图像const imgData = await getImageData(imagePath);// 使用 opencv-wasm 对图像进行预处理const originalImage = cv.matFromImageData(imgData);const image = new cv.Mat();// 模型期望的是 RGB 格式的图像cv.cvtColor(originalImage, image, cv.COLOR_RGBA2RGB);// 将图像调整为模型输入所需的尺寸cv.resize(image, image, new cv.Size(224, 224));const tensorData = new Float32Array(image.data);const data = hwcToNchw(tensorData, image.rows, image.cols, 3);// 创建输入张量const inputTensor = new ov.Tensor(ov.element.f32, Int32Array.from([1, 3, 224, 224]), data);// ----------------- 步骤 5. 将模型加载到设备上 ----------------------console.log('将模型加载到插件');const compiledModel = await core.compileModel(model, 'CPU');// ----------------- 步骤 6. 创建推理请求并同步执行推理console.log('开始同步模式下的推理');const inferRequest = compiledModel.createInferRequest();inferRequest.setInputTensor(inputTensor);inferRequest.infer();// ----------------- 步骤 7. 处理输出 -----------------------------------const outputLayer = compiledModel.outputs[0];const resultInfer = inferRequest.getTensor(outputLayer);const resultIndex = resultInfer.data.indexOf(Math.max(...resultInfer.data));console.log("=== 结果 ===");console.log(`索引: ${resultIndex}`);// 将输出结果转换为数组,并按概率排序const predictions = Array.from(resultInfer.data).map((预测值, 类别ID) => ({ 预测值, 类别ID })).sort(({ 预测值: predictionA }, { 预测值: predictionB }) =>predictionA === predictionB ? 0 : predictionA > predictionB ? -1 : 1);// 加载类别名称映射const imagenetData = require("./assets/datasets/yolov8-imagenet.json");const classNameMap = imagenetData.names;console.log(`图像路径: ${imagePath}`);console.log('前10个结果:');console.log('类别ID\t概率\t类别名称');console.log('------------------------');// 打印前10个最高概率的结果predictions.slice(0, 10).forEach(({ 类别ID, 预测值 }) =>console.log(`${类别ID}\t ${预测值.toFixed(7)}\t ${classNameMap[类别ID]}`),);}
要运行上述程序,请首先克隆本文范例到本地,然后安装yolov8s-cls.js的依赖软件包:
git clone https://github.com/txl1123/OpenVINO-JavaScript-API.gitcd OpenVINO-JavaScript-APInpm install cnpm -g --registry=https://registry.npmmirror.comcnpm install

最后键入命令,运行yolov8s-cls.js,结果如下所示:
node yolov8s-cls.js

5. 总结
OpenVINO™ JavaScript API易学易用,开发者可以非常方便的将AI能力嵌入到网页形式的应用中去,并在英特尔® 酷睿™ Ultra处理器上高效运行。
更多推荐



所有评论(0)