【OpenVINO 】在 MacOS 上编译 OpenVINO C++ 项目

前言

英特尔公司发行的模型部署工具OpenVINO™模型部署套件,可以实现在不同系统环境下运行,且发布的OpenVINO™ 2023最新版目前已经支持MacOS系统并同时支持在苹果M系列芯片上部署模型。在该项目中,我们将向大家展示如何在MacOS系统、M2芯片的Macbook Air电脑上,展示使用OpenVINO™ C++ API 部署深度学习模型。

文章目录

  • 1. OpenVINO™
  • 2. OpenVINO™ 下载
  • 3. 代码实现
  • 4. 项目编译运行
  • 5. 总结

1. OpenVINO™

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

在这里插入图片描述

OpenVINO™ 2023.2 于 2023 年 11 月 16 日发布,该工具包带来了挖掘生成人工智能全部潜力的新功能。更多的生成式 AI 覆盖和框架集成,以最大限度地减少代码更改,并且扩展了对直接 PyTorch 模型转换的模型支持。支持更多新的模型,包括 LLaVA、chatGLM、Bark 和 LCM 等著名模型。支持更广泛的大型语言模型(LLM)和更多模型压缩技术,支持运行时推理支持以下 Int4 模型压缩格式,通过神经网络压缩框架(NNCF) 进行本机 Int4 压缩等一系列新的功能。

在这里插入图片描述

通过OpenVINO™官网信息,我们可以看出,目前OpenVINO™已经能够在苹果MacOS系统、M系列芯片上运行,这为使用MacOS系统的开发者提供了很好的工具。因此在此处,我们将在MacOS系统、M2芯片的Macbook Air电脑上,展示使用 OpenVINO™ C++ API 部署深度学习模型的详细流程。

2. OpenVINO™ 下载

官方在发布版本中已经提供MacOS系统的编译库,因此在此处我们只需要下载官方编译库即可

首先访问OpenVINO™网站,依次选择版本号、操作系统、安装方式等内容,然后点击下载,如下图所示:

在这里插入图片描述

下面是官方编译的文件,此处主要提供了两个版本,一个是适用于苹果电脑之前的版本,主要是MacOS 10以及之前的版本系统并且使用的是Intel CPU,另一个是使用了苹果的M系列芯片的新版本电脑,主要是MacOS 11 之后的系统。大家可以根据自己的电脑进行选择:

在这里插入图片描述

下载完后,将该文件解压到任意文件夹,在此处为了方便后续使用一集更新,将其解压到用户文件夹,如下图所示:
在这里插入图片描述

后续我们会使用CMake进行项目编译,因此我们此处无需再做其他的设置。

其他环境配置:

  • MacOS:14.2.1
  • CMake:3.28
  • Make:3.81
  • 编译软件:Visual Studio Code
  • OpenCV:4.8.0
    其他环境配置此处不做过多赘述,OpenCV环境安装可以参考下述文章实现:

3. 代码实现

此处我们以Yolov8图片分类模型为例进行项目测试,由于该模型之前我们已经多次使用,所以在此处不在做耕作的阐述,具体代码如下所示:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sys/time.h>
#include "openvino/openvino.hpp" //openvino header file
#include "opencv2/opencv.hpp"    //opencv header fileint main(int argc, char* argv[])
{ov::Version version = ov::get_openvino_version();std::cout << version.description << ": " << version.buildNumber << std::endl;// -------- Step 1. Initialize OpenVINO Runtime Core --------ov::Core core;// -------- Step 2. Compile the Model --------auto compiled_model = core.compile_model("yolov8s-cls.xml", "CPU");// -------- Step 3. Create an Inference Request --------ov::InferRequest infer_request = compiled_model.create_infer_request();// -------- Step 4.Read a picture file and do the preprocess --------cv::Mat img = cv::imread("image.jpg"); // Preprocess the imageint col = img.cols;int row = img.rows;int _max = MAX(col, row);cv::Mat letterbox_img = cv::Mat::zeros(_max, _max, CV_8UC3);img.copyTo(letterbox_img(cv::Rect(0, 0, col, row)));cv::Mat blob = cv::dnn::blobFromImage(letterbox_img, 1.0 / 255.0, cv::Size(224, 224), cv::Scalar(), true);// -------- Step 5. Feed the blob into the input node of the Model -------// Get input port for model with one inputauto input_port = compiled_model.input();std::cout << "The shape of input tensor:" << input_port.get_shape() << std::endl;// Create tensor from external memoryov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0));// Set input tensor for model with one inputinfer_request.set_input_tensor(input_tensor);// -------- Step 6. Start inference --------infer_request.infer();struct timeval start_time, end_time;gettimeofday(&start_time,NULL);infer_request.infer();gettimeofday(&end_time,NULL);// Get the elapsed millisecond timedouble elapsed_time = (end_time.tv_sec - start_time.tv_sec)*1000 + (end_time.tv_usec - start_time.tv_usec)/1000;// -------- Step 7. Get the inference result --------auto output = infer_request.get_output_tensor(0);auto output_shape = output.get_shape();std::cout << "The shape of output tensor:" << output_shape << std::endl;// -------- Step 8. Postprocess the result --------float* output_buffer = output.data<float>();std::vector<float> result(output_buffer, output_buffer + output_shape[1]);auto max_idx = std::max_element(result.begin(), result.end());int class_id = max_idx - result.begin();float score = *max_idx;std::cout << "Class ID:" << class_id << " Score:" <<score<< std::endl;std::cout << "infer time:" <<elapsed_time<< std::endl;return 0;
}

在该代码中,主要是获取OpenVINO™版本信息,然后按照模型部署流程部署测试了Yolov8图片分类模型,并打印输出结果以及推理时间。

4. 项目编译运行

在该项目中通过CMake编译项目,定义的CMakeLists.txt文件如下所示:

cmake_minimum_required(VERSION 3.28)
project(test_openvino)
set(OpenCV_DIR /Users/ygj/3lib/opencv_4.8.0/lib/cmake/opencv4)
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV_DIR = ${OpenCV_DIR}")
message(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS = ${OpenCV_LIBS}")
set(OpenVINO_DIR /Users/ygj/3lib/openvino_2023.2/runtime/cmake)
set(OpenVINO_LIBs "/Users/ygj/3lib/openvino_2023.2/runtime/lib/arm64/Release/libopenvino.2320.dylib")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(/Users/ygj/3lib/openvino_2023.2/runtime/include${OpenCV_INCLUDE_DIRS}
)
add_executable(test_openvino test_openvino.cpp )
target_link_libraries(test_openvino ${OpenVINO_LIBs} ${OpenCV_LIBS})

在这个CMakeLists文件中,需要同时配置OpenCV以及OpenVINO这两个依赖库,具体编译以及配置方式参考CMake手册。

接下来就可以项目编译了,在终端中输入一下命令,就可以进行项目配置了,输出结果如下所示:

cmake .

在这里插入图片描述

接下来就是进行项目编译,CMake编译后会生成Makefile文件,之后就可以运行make命令进行项目最后的编译,然后就可以直接运行生成的项目文件,如下所示:

make
./test_openvino

在这里插入图片描述

上图中展示了项目最后运行结果,可以看出,此处使用的模型输入大小为[1,3,224,224],输出大小为[1,1000],识别结果Class ID=386,查看分类结果字典,图片识别结果与图片一致;模型的推理时间为:7ms。

5. 总结

该项目中,我们在MacOS 14.2.1 系统、M2芯片的 Macbook Air 电脑上,成功使用OpenVINO™ C++ API 部署了Yolov8图片分类深度学习模型,并详细演示了OpenVINO™ C++ API在苹果电脑上使用与配置流程,为使用MacOS系统的开发者提供了很好的范例与参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605326.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写一个简单的服务和客户端(C++)

背景 当节点使用服务进行通信时&#xff0c;发送数据请求的节点称为客户端节点&#xff0c;响应请求的节点称为服务节点。请求和响应的结构由.srv文件确定。 这里使用的例子是一个简单的整数加法系统&#xff1b;一个节点请求两个整数之和&#xff0c;另一个节点响应结果。 …

基于云平台技术的车辆远程诊断浅谈

基于云平台技术的车辆远程诊断浅谈 一、引言 随着汽车工业的不断发展&#xff0c;车辆故障诊断技术的需求日益增长。传统的车辆故障诊断方式已经无法满足现代汽车对高效、智能的追求。基于云平台技术的车辆远程诊断创新&#xff0c;为汽车故障诊断带来了新的解决方案。 二、…

【linux】docker基本概念和基础指令操作(镜像、容器)

docker docker镜像 images xxxx(名称):xxxx(版本号) 每一个image可以生成若干个容器&#xff08;container&#xff09;&#xff0c;所有用相同镜像生成的容器环境完全一样 每一个容器都是一个完全独立的云端服务器 镜像指令 docker pull ubuntu:20.04 #拉取一个镜像 doc…

鸿鹄电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

HarmonyOS应用开发者基础(初级)认证题库

开发者能力认证 一、判断 首选项preferences是以Key-Value形式存储数据&#xff0c;其中Key是可以重复。&#xff08;错&#xff09;使用http模块发起网络请求时&#xff0c;必须要使用on(‘headersReceive’&#xff09;订阅请求头&#xff0c;请求才会成功。&#xff08;错…

15.脚本备份、恢复达梦DM数据库

1.备份脚本 #!/bin/bash # 通过docker命令查询达梦数据库容器id CONTAINER_IDdocker ps -a | grep "dm8_single" | awk {print $1} | head -n 1#备份目录 DUMP_DIR"/data/dm8/data/backup"DATE_FORMATdate %Y%m%d echo "备份my_db1数据库开始&#…

从零开始构建一个属于您的 Web3 项目(Web3项目三实战之一)

午后,沏上一壶茶,走到那冬日暖阳照耀到的阳台,落座于桌旁,很是舒心地敲打键盘上的每个按键,这样的午后,或许才是我们所向往的吧! 它舍弃了城市中的喧嚣;也没有大都市的那种快节奏;更加没有了“尔虞我诈、精于算计”的职场“战火硝烟”。 它有的只是寂静、随心所欲、闲…

NFS 共享存储实验

一、服务器部署 第一步、安装nfs和rpcbind包 [rootserver ~]# yum install -y nfs-utils rpcbind截图&#xff1a; 第二步、这里选择一个 lvm 挂载点做 NFS 共享目录 [rootserver ~]# df -HT截图&#xff1a; 第三步、修改配置文件 [rootserver ~]# vi /etc/exports /home …

SpringBoot 接口:响应时间优化9个技巧!

今天聊聊 SpringBoot接口&#xff1a;响应时间优化的9个技巧。在实际开发中&#xff0c;提升接口响应速度是一件挺重要的事&#xff0c;特别是在面临大量用户请求的时候。好了&#xff0c;咱们直接切入正题。 本文&#xff0c;已收录于&#xff0c;我的技术网站 ddkk.com&…

神经网络的核心:简单易懂理解 PyTorch 非线性激活函数

目录 torch.nn子函数非线性激活详解 nn.Softmin Softmin 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax Softmax 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.Softmax2d Softmax2d 函数简介 函数工作原理 输入…

2024最新前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 粒子文字动画特效 基于canvas实现的粒子文字动画特效 会来回切换设定的文字特效 图…

字典类型存为csv

在Python中把Dict转换为CSV salary [{‘Name’:‘Alice’, ‘Job’:‘Data Scientist’, ‘Salary’:122000}, {‘Name’:‘Bob’, ‘Job’:‘Engineer’, ‘Salary’:77000}, {‘Name’:‘Carl’, ‘Job’:‘Manager’, ‘Salary’:119000}] Method 1 import pandas as pd …

本地jar安装到仓库

安装 jar mvn install:install-file -DgroupId坐标(相对于maven的路径) -DartifactId工程名称 -Dversion版本号 -Dpackagingjar -Dfilejar安装 source mvn install:install-file -DgroupId坐标(相对于maven的路径) -DartifactId工程名称 -Dversion版本号 -Dpackagingjar -Dfi…

在版权付费方面,OpenAI 比人想象中的还要「小气」

随着新闻出版商与AI公司达成“使用新闻训练AI模型”的协议&#xff0c;像 OpenAI 等科技企业愿意为受版权保护的信息支付的价格逐渐浮出水面。 据 The Information 报道&#xff0c;OpenAI 每年愿意向出版商提供 100万到500万美元来支付受版权保护的新闻文章训练其AI模型。 但…

LLM、AGI、多模态AI 篇五:基于LoRA微调ChatGLM3

文章目录 系列LLaMA-Factory简介推荐硬件要求环境搭建数据准备指令微调数据集偏好数据集自定义数据集指令监督微调合并 LoRA 权重并导出模型其他(训练全流程)预训练奖励模型训练PPO 强化学习训练DPO 强化学习训练通过一站式网页界面快速上手

createTempFile方法详解

createTempFile方法详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将深入探讨一个在Java中常用的文件处理工具——createTempFile方法&am…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[] 输入&#xff1a;l1 []…

数据库连接使用问题 - 1

原理 open-in-view 是 Spring Boot ⾃动加载 Spring Data JPA 提供的⼀个配置&#xff0c;全称为 spring.jpa.open-in-viewtrue&#xff0c;它只有 true 和 false 两个值&#xff0c;默认是 true。 这个配置为true时&#xff0c;会导致Web MVC请求处理的一开始&…

王中阳Go赠书活动第一期:《TVM编译器原理与实践》

文章目录 前言TVM编译器的实现过程关于《TVM编译器原理与实践》编辑推荐内容简介作者简介图书目录书中前言/序言《TVM编译器原理与实践》全书速览入手《TVM编译器原理与实践》传送门&#xff1a;结束语参加抽奖 前言 随着人工智能的发展&#xff0c;计算机视觉、自然语言处理和…

MySQL复习汇总(图书管理系统)

MySQL图书管理系统&#xff08;49-94&#xff09;源码_71.备份book数据库到e盘的mybook.sql文件(备份文件中要求包含建库命令)-CSDN博客 CROSS JOIN&#xff1a;交叉连接&#xff08;笛卡尔积&#xff09; -- 1、 创建一个名称为book的数据库。 -- 2、 打开book数据库…