OpenVINO 2022.2版開始支持英特爾獨立顯卡,還能通過“累計吞吐量”同時啟動集成顯卡 + 獨立顯卡助力全速 AI 推理。本文基于 C# 和 OpenVINO,將 PP-TinyPose 模型部署在英特爾獨立顯卡上。
1.1 PP-TinyPose 模型簡介
PP-TinyPose 是飛槳 PaddleDetecion 針對移動端設備優化的實時關鍵點檢測模型,可流暢地在移動端設備上執行多人姿態估計任務。PP-TinyPose 可以基于人體17個關鍵點數據集訓練后,識別人體關鍵點,獲得人體姿態,如圖 1所示。
圖 1 PP-TinyPose識別效果圖
PP-TinyPose 開源項目倉庫:
https://gitee.com/paddlepaddle/PaddleDetection/tree/release/2.5/configs/keypoint/tiny_pose
1.1.1
PP-TinyPose 框架
PP-TinyPose 提供了完整的人體關鍵點識別解決方案,主要包括行人檢測以及關鍵點檢測兩部分。行人檢測通過PP-PicoDet模型來實現,關鍵點識別通過 Lite-HRNet 骨干網絡+DARK關鍵點矯正算法來實現,如下圖所示:
圖 2 PP-TinyPose人體關鍵點識別
1.2 構建開發環境
本文構建的開發環境,如下所示:
OpenVINOTM:2022.2.0
OpenCV:4.5.5
Visual Studio:2022
C#框架:.NET 6.0
OpenCvSharp:OpenCvSharp4
1.2.1
下載項目完整源代碼
項目所使用的源碼已在完整開源,讀者可以直接克隆到本地。
git clone https://gitee.com/guojin-yan/Csharp_and_OpenVINO_deploy_PP-TinyPose.git
1.3 在 C# 中調用 OpenVINO Runtime API
由于 OpenVINO Runtime 只有 C++ 和 Python API 接口,需要在 C# 中通過動態鏈接庫方式調用 OpenVINO Runtime C++ API。具體教程參考《在C#中調用OpenVINO 模型》,對應的參考范例:
https://github.com/guojin-yan/OpenVinoSharp.git
1.3.1
在 C# 中構建 Core 類
為了更方便的使用,可以在 C# 中,將調用細節封裝到 Core 類中。根據模型推理的步驟,構建模型推理類:
(1)構造函數
public Core(string model_file, string device_name){ // 初始化推理核心 ptr = NativeMethods.core_init(model_file, device_name); }
向右滑動查看完整代碼
在該方法中,主要是調用推理核心初始化方法,初始化推理核心,讀取本地模型,將模型加載到設備、創建推理請求等模型推理步驟。
(2)設置模型輸入形狀
// @brief 設置推理模型的輸入節點的大小 // @param input_node_name 輸入節點名 // @param input_size 輸入形狀大小數組 public void set_input_sharp(string input_node_name, ulong[] input_size) { // 獲取輸入數組長度 int length = input_size.Length; if (length == 4) { // 長度為4,判斷為設置圖片輸入的輸入參數,調用設置圖片形狀方法 ptr = NativeMethods.set_input_image_sharp(ptr, input_node_name, ref input_size[0]); } else if (length == 2) { // 長度為2,判斷為設置普通數據輸入的輸入參數,調用設置普通數據形狀方法 ptr = NativeMethods.set_input_data_sharp(ptr, input_node_name, ref input_size[0]); } else { // 為防止輸入發生異常,直接返回 return; } }
向右滑動查看完整代碼
(3)加載推理數據
// @brief 加載推理數據 // @param input_node_name 輸入節點名 // @param input_data 輸入數據數組 public void load_input_data(string input_node_name, float[] input_data) { ptr = NativeMethods.load_input_data(ptr, input_node_name, ref input_data[0]); } // @brief 加載圖片推理數據 // @param input_node_name 輸入節點名 // @param image_data 圖片矩陣 // @param image_size 圖片矩陣長度 public void load_input_data(string input_node_name, byte[] image_data, ulong image_size, int type) { ptr = NativeMethods.load_image_input_data(ptr, input_node_name, ref image_data[0], image_size, type); }
向右滑動查看完整代碼
加載推理數據主要包含圖片數據和普通的矩陣數據,其中對于圖片的預處理,也已經在 C++ 中進行封裝,保證了圖片數據在傳輸中的穩定性。
(4)模型推理
// @brief 模型推理 public void infer() { ptr = NativeMethods.core_infer(ptr); }
(5)讀取推理結果數據
// @brief 讀取推理結果數據 // @param output_node_name 輸出節點名 // @param data_size 輸出數據長度 // @return 推理結果數組 public T[] read_infer_result(string output_node_name, int data_size) { // 獲取設定類型 string t = typeof(T).ToString(); // 新建返回值數組 T[] result = new T[data_size]; if (t == "System.Int32") { // 讀取數據類型為整形數據 int[] inference_result = new int[data_size]; NativeMethods.read_infer_result_I32(ptr, output_node_name, data_size, ref inference_result[0]); result = (T[])Convert.ChangeType(inference_result, typeof(T[])); return result; } else { // 讀取數據類型為浮點型數據 float[] inference_result = new float[data_size]; NativeMethods.read_infer_result_F32(ptr, output_node_name, data_size, ref inference_result[0]); result = (T[])Convert.ChangeType(inference_result, typeof(T[])); return result; } }
在讀取模型推理結果時,支持讀取整形數據和浮點型數據。
(6)清除地址
// @brief 刪除創建的地址 public void delet() { NativeMethods.core_delet(ptr); }
完成上述封裝后,在 C# 平臺下,調用 Core 類,就可以方便實現 OpenVINO 推理程序了。
1.4 下載并轉換 PP-PicoDet 模型
1.4.1
PP-PicoDet 模型簡介
Picodet_s_320_lcnet_pedestrian Paddle 格式模型信息如下表所示,其默認的輸入為動態形狀,需要將該模型的輸入形狀變為靜態形狀。
表 1 Picodet_s_320_lcnet_pedestrian Paddle 格式模型信息
1.4.2
模型下載與轉換
第一步,下載模型
命令行直接輸入以下模型導出代碼,使用 PaddleDetecion 自帶的方法,下載預訓練模型并將模型轉為導出格式。
導出 picodet_s_320_lcnet_pedestrian 模型:
python tools/export_model.py -c configs/picodet/application/pedestrian_detection/picodet_s_320_lcnet_pedestrian.yml -o export.benchmark=False export.nms=False weights=https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/picodet_s_320_lcnet_pedestrian.p dparams --output_dir=output_inference
導出 picodet_s_192_lcnet_pedestrian 模型:
python tools/export_model.py -c configs/picodet/application/pedestrian_detection/picodet_s_192_lcnet_pedestrian.yml -o export.benchmark=False export.nms=False weights=https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/picodet_s_192_lcnet_pedestrian.p dparams --output_dir=output_inference
此處導出模型的命令與我們常用的命令導出增加了兩個指令:
export.benchmark=False 和 export.nms=False
主要是關閉模型后處理以及打開模型極大值抑制。如果不關閉模型后處理,模型會增加一個輸入,且在模型部署時會出錯。
第二步,將模型轉換為ONNX格式
該方式需要安裝 paddle2onnx 和 onnxruntime 模塊。導出方式比較簡單,比較注意的是需要指定模型的輸入形狀,用于固定模型批次的大小。在命令行中輸入以下指令進行轉換:
paddle2onnx --model_dir output_inference/picodet_s_320_lcnet_pedestrian --model_filename model.pdmodel -- params_filename model.pdiparams --input_shape_dict "{'image':[1,3,320,320]}" --opset_version 11 --save_filepicodet_s_320_lcnet_pedestrian.onnx
第三步,轉換為IR格式
利用 OpenVINO 模型優化器,可以實現將 ONNX 模型轉為 IR 格式
mo --input_model picodet_s_320_lcnet_pedestrian.onnx --input_shape [1,3,256,192] --data_type FP16
1.5 下載并轉換 PP-TinyPose 模型
1.5.1
PP-TinyPose 模型簡介
PP-TinyPose 模型信息如下表所示,其默認的輸入為動態形狀,需要將該模型的輸入形狀變為靜態形狀。
表 2 PP-TinyPose 256×192 Paddle 模型信息
1.5.2
模型下載與轉換
第一步,下載模型
命令行直接輸入以下代碼,或者瀏覽器輸入后面的網址即可。
wget https://bj.bcebos.com/v1/paddledet/models/keypoint/tinypose_enhance/tinypose_256x192.zip
下載好后將其解壓到文件夾中,便可以獲得 Paddle 格式的推理模型。
第二步,轉換為 ONNX 格式
該方式需要安裝 paddle2onnx 和 onnxruntime 模塊。在命令行中輸入以下指令進行轉換,其中轉換時需要指定 input_shape,否者推理時間會很長:
paddle2onnx --model_dir output_inference/tinypose_256_192/paddle --model_filename model.pdmodel -- params_filename model.pdiparams --input_shape_dict "{'image':[1,3,256,192]}" --opset_version 11 --save_file tinypose_256_192.onnx
第三步,轉換為 IR 格式
利用OpenVINO 模型優化器,可以實現將 ONNX 模型轉為 IR 格式。
cd .openvino ools mo --input_model paddle/model.pdmodel --input_shape [1,3,256,192] --data_type FP16
1.6 編寫 OpenVINO 推理程序
1.6.1
實現行人檢測
第一步,初始化 PicoDet 行人識別類
// 行人檢測模型 string mode_path_det = @"E:Text_ModelTinyPosepicodet_v2_s_320_pedestrianpicodet_s_320_lcnet_pedestrian.onnx"; // 設備名稱 string device_name = "CPU"; PicoDet pico_det = new PicoDet(mode_path_det, device_name);
首先初始化行人識別類,將本地模型讀取到內存中,并將模型加載到指定設備中。
第二步,設置輸入輸出形狀
Size size_det = new Size(320, 320); pico_det.set_shape(size_det, 2125);
根據我們使用的模型,設置模型的輸入輸出形狀。
第三步,實現行人檢測
// 測試圖片 string image_path = @"E:Git_space基于Csharp和OpenVINO部署PP-TinyPoseimagedemo_3.jpg"; Mat image = Cv2.ImRead(image_path); List result_rect = pico_det.predict(image);
在進行模型推理時,使用 OpenCvSharp 讀取圖像,然后帶入預測,最終獲取行人預測框。最后將行人預測框繪制到圖片上,如下圖所示。
圖 3 行人位置預測結果
1.6.2
實現人體姿態識別
第一步,初始化 P 人體姿勢識別 PPTinyPose 類
// 關鍵點檢測模型 // onnx格式 string mode_path_pose = @"E:Text_ModelTinyPose inypose_128_96 inypose_128_96.onnx"; // 設備名稱 string device_name = "CPU"; PPTinyPose tiny_pose = new PPTinyPose(mode_path_pose, device_name);
首先初始化人體姿勢識別 PPTinyPose 類,將本地模型讀取到內存中,并加載到設備上。
第二步,設置輸入輸出形狀
Size size_pose = new Size(128, 96); tiny_pose.set_shape(size_pose);
PP-TinyPose 模型輸入與輸出有對應關系,因此只需要設置輸入尺寸
第三步,實現姿勢預測
// 測試圖片 string image_path = @"E:Git_space基于Csharp和OpenVINO部署PP-TinyPoseimagedemo_3.jpg"; Mat image = Cv2.ImRead(image_path); Mat result_image = tiny_pose.predict(image);
在進行模型推理時,使用 OpenCvSharp 讀取圖像,然后帶入預測,最終獲取人體姿勢結果,如下圖所示。
圖 4 人體姿態繪制效果圖
1.6.3
推理速度測試
本項目在蝰蛇峽谷上完成測試,CPU 為 i7-12700H,自帶英特爾 銳炬 Xe集成顯卡;獨立顯卡為英特爾銳炫 A770M 獨立顯卡 + 16G 顯存,如下圖所示。
圖 5 蝰蛇峽谷
測試代碼已開源:
https://gitee.com/guojin-yan/Csharp_and_OpenVINO_deploy_PP-TinyPose.git
測試結果如下表所示
表 3 PP-PicoDet 與 PP-TinyPose 模型運行時間(ms)
注:模型讀取:讀取本地模型,加載到設備,創建推理通道;
加載數據:將待推理數據進行處理并加載到模型輸入節點;
模型推理:模型執行推理運算;
結果處理:在模型輸出節點讀取輸出數據,并轉化為我們所需要的結果數據。
1.7 總結與未來工作展望
本文完整介紹了在 C# 中基于 OpenVINO 部署 PP-TinyPose 模型的完整流程,并開源了完整的項目代碼。
從表3的測試結果可以看到,面對級聯的小模型,由于存在數據從 CPU 傳到 GPU,GPU 處理完畢后,結果從 GPU 傳回 CPU 的時間消耗,獨立顯卡相對 CPU 并不具備明顯優勢。
未來
改進方向
借助 OpenVINO 預處理 API,將預處理和后處理集成到 GPU 中去。
參考教程:使用OpenVINO 預處理API進一步提升YOLOv5推理性能
借助OpenVINO 異步推理 API,提升 GPU 利用率。
參考教程:蝰蛇峽谷上實現 YOLOv5 模型的 OpenVINO 異步推理程序
仔細分析 CPU 和 GPU 之間的數據傳輸性能瓶頸,嘗試鎖頁內存、異步傳輸等優化技術,“隱藏” CPU 和 GPU 之間的數據傳輸時間消耗。
-
英特爾
+關注
關注
61文章
10174瀏覽量
174011 -
cpu
+關注
關注
68文章
11045瀏覽量
216089 -
gpu
+關注
關注
28文章
4915瀏覽量
130705 -
物聯網
+關注
關注
2927文章
45949瀏覽量
388530 -
顯卡
+關注
關注
16文章
2503瀏覽量
69215
原文標題:基于C#和OpenVINO?在英特爾獨立顯卡上部署PP-TinyPose模型 | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
使用OpenVINO C# API輕松部署飛槳PP-OCRv4模型

請問OpenVINO?工具套件英特爾?Distribution是否與Windows? 10物聯網企業版兼容?
英特爾高清顯卡4600幫助
介紹英特爾?分布式OpenVINO?工具包
在Arm虛擬硬件上部署PP-PicoDet模型
英特爾推出面向OEM市場的入門級Xe獨立顯卡
AI作畫升級,OpenVINO? 和英特爾獨立顯卡助你快速生成視頻

C#中使用OpenVINO?:輕松集成AI模型!

評論