加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

在MacOS上編譯OpenVINO C++項目 | 開發(fā)者實戰(zhàn)

01/12 11:10
3486
閱讀需 17 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

作者:英特爾邊緣計算創(chuàng)新大使??顏國進

前言

英特爾公司發(fā)行的模型部署工具 OpenVINO? 模型部署套件,可以實現(xiàn)在不同系統(tǒng)環(huán)境下運行,且發(fā)布的 OpenVINO? 2023 最新版目前已經(jīng)支持 MacOS 系統(tǒng)并同時支持在蘋果 M 系列芯片上部署模型。在該項目中,我們將向大家展示如何在 MacOS 系統(tǒng)、M2芯片的 Macbook Air 電腦上,展示使用 OpenVINO? C++ API 部署深度學習模型。

1. OpenVINO?

英特爾發(fā)行版 OpenVINO? 工具套件基于 oneAPI 而開發(fā),可以加快高性能計算機視覺和深度學習視覺應用開發(fā)速度工具套件,適用于從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確地真實世界結果部署到生產(chǎn)系統(tǒng)中。通過簡化的開發(fā)工作流程,OpenVINO? 可賦能開發(fā)者在現(xiàn)實世界中部署高性能應用程序和算法。

OpenVINO? 2023.2 于 2023 年 11 月 16 日發(fā)布,該工具包帶來了挖掘生成人工智能全部潛力的新功能。更多的生成式 AI 覆蓋和框架集成,以最大限度地減少代碼更改,并且擴展了對直接 PyTorch 模型轉換的模型支持。支持更多新的模型,包括 LLaVA、chatGLM、Bark 和 LCM 等著名模型。支持更廣泛的大型語言模型(LLM)和更多模型壓縮技術,支持運行時推理支持以下 Int4 模型壓縮格式,通過神經(jīng)網(wǎng)絡壓縮框架(NNCF) 進行本機 Int4 壓縮等一系列新的功能。

通過 OpenVINO? 官網(wǎng)信息,我們可以看出,目前 OpenVINO?已經(jīng)能夠在蘋果 MacOS 系統(tǒng)、M 系列芯片上運行,這為使用 MacOS 系統(tǒng)的開發(fā)者提供了很好的工具。因此在此處,我們將在 MacOS 系統(tǒng)、M2芯片的 Macbook Air 電腦上,展示使用 OpenVINO? C++ API 部署深度學習模型的詳細流程。

2. OpenVINO? 下載

官方在發(fā)布版本中已經(jīng)提供 MacOS 系統(tǒng)的編譯庫,因此在此處我們只需要下載官方編譯庫即可。

首先訪問 OpenVINO? 網(wǎng)站,依次選擇版本號、操作系統(tǒng)、安裝方式等內容,然后點擊下載,如下圖所示:

OpenVINO? 官網(wǎng):https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html

下面是官方編譯的文件,此處主要提供了兩個版本,一個是適用于蘋果電腦之前的版本,主要是 MacOS 10 以及之前的版本系統(tǒng)并且使用的是 Intel CPU,另一個是使用了蘋果的 M 系列芯片的新版本電腦,主要是 MacOS 11 之后的系統(tǒng)。大家可以根據(jù)自己的電腦進行選擇:

下載完后,將該文件解壓到任意文件夾,在此處為了方便后續(xù)使用一集更新,將其解壓到用戶文件夾,如下圖所示:

后續(xù)我們會使用 CMake 進行項目編譯,因此我們此處無需再做其他的設置。

其他環(huán)境配置:

● MacOS:14.2.1

● CMake:3.28

● Make:3.81

●?編譯軟件:Visual Studio Code

● OpenCV:4.8.0 其他環(huán)境配置此處不做過多贅述,OpenCV 環(huán)境安裝可以參考下述文章實現(xiàn):【OpenCV】在 MacOS 上源碼編譯 OpenCV

3. 代碼實現(xiàn)

此處我們以 Yolov8圖片分類模型為例進行項目測試,由于該模型之前我們已經(jīng)多次使用,所以在此處不再做耕作的闡述,具體代碼如下所示:

#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 file
int 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 image ? ?int 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 input ? ?auto input_port = compiled_model.input(); ? ?std::cout << "The shape of input tensor:" << input_port.get_shape() << std::endl; ? ?// Create tensor from external memory ? ?ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0)); ? ?// Set input tensor for model with one input ? ?infer_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 time ? ?double 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 系統(tǒng)、M2 芯片的 Macbook Air 電腦上,成功使用 OpenVINO? C++ API 部署了 Yolov8 圖片分類深度學習模型,并詳細演示了 OpenVINO? C++ API 在蘋果電腦上使用與配置流程,為使用 MacOS 系統(tǒng)的開發(fā)者提供了很好的范例與參考。

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
AT24CM01-SSHD-T 1 Atmel Corporation EEPROM, 128KX8, Serial, CMOS, PDSO8, 0.150 INCH, GREEN, PLASTIC, MS-012AA, SOIC-8

ECAD模型

下載ECAD模型
$2.39 查看
KSZ8721BLI 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, PQFP48

ECAD模型

下載ECAD模型
$4.07 查看
TLP292-4(TP,E 1 Toshiba America Electronic Components AC INPUT-TRANSISTOR OUTPUT OPTOCOUPLER

ECAD模型

下載ECAD模型
$1.43 查看
英特爾

英特爾

英特爾在云計算、數(shù)據(jù)中心、物聯(lián)網(wǎng)和電腦解決方案方面的創(chuàng)新,為我們所生活的智能互連的數(shù)字世界提供支持。

英特爾在云計算、數(shù)據(jù)中心、物聯(lián)網(wǎng)和電腦解決方案方面的創(chuàng)新,為我們所生活的智能互連的數(shù)字世界提供支持。收起

查看更多

相關推薦

電子產(chǎn)業(yè)圖譜

英特爾致力于加快智能設備的開發(fā)和部署,通過智能多層系統(tǒng)和端到端分析,在智能駕駛、智能零售、智能安防、智能制造等領域,推動企業(yè)業(yè)務轉型,改善人們的生活和工作方式,英特爾驅動物聯(lián)網(wǎng)變革。