0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于OpenVINO?工具包部署飛槳PP-Human的全流程

SDNLAB ? 來源:楊雪鋒 ? 2023-02-23 18:03 ? 次閱讀

本文將詳細(xì)介紹基于OpenVINO工具包,在C#語言下,部署飛槳PP-Human的全流程,幫助開發(fā)者快速掌握并部署產(chǎn)業(yè)級AI人體分析解決方案。

飛槳實(shí)時(shí)行人分析工具PP-Human

PP-Human是飛槳目標(biāo)檢測套件PaddleDetection中開源的實(shí)時(shí)行人分析工具,提供了五大異常行為識(shí)別和四大產(chǎn)業(yè)級功能:人體屬性分析、人流計(jì)數(shù)、跨鏡ReID,如下圖所示:

68a96c2a-a2e3-11ed-bfe3-dac502259ad0.png

圖 1-1PP-Human v2全功能全景圖

PP-Human技術(shù)架構(gòu)

PP-Human支持單張圖片、圖片文件夾單鏡頭視頻和多鏡頭視頻輸入,經(jīng)目標(biāo)檢測以及特征關(guān)聯(lián),實(shí)現(xiàn)屬性識(shí)別、關(guān)鍵點(diǎn)檢測、軌跡/流量計(jì)數(shù)以及行為識(shí)別等功能,如下圖所示。本文將以行人摔倒識(shí)別為例,基于OpenVINO進(jìn)行多種模型聯(lián)合部署。

68bdfe42-a2e3-11ed-bfe3-dac502259ad0.png ?

圖 1-2PP-Human技術(shù)架構(gòu)

構(gòu)建C#開發(fā)環(huán)境

為了防止復(fù)現(xiàn)代碼出現(xiàn)問題,列出以下代碼開發(fā)環(huán)境,可以根據(jù)自己需求設(shè)置,注意OpenVINO一定是2022版本,其他依賴項(xiàng)可以根據(jù)自己的設(shè)置修改。

操作系統(tǒng):Windows 11

OpenVINO:2022.3

OpenCV:4.5.5

Visual Studio:2022 Community

C#框架:.NET 6.0

OpenCvSharp:OpenCvSharp4

C#中調(diào)用OpenVINO實(shí)現(xiàn)

構(gòu)建OpenVINO動(dòng)態(tài)鏈接庫

由于OpenVINO只有C++Python接口,無法直接在C#中使用OpenVINO部署模型,為了實(shí)現(xiàn)在C#中使用,通過動(dòng)態(tài)鏈接庫的方式實(shí)現(xiàn)。

在C#中引入動(dòng)態(tài)鏈接庫文件

在C#中需要使用[DllImport()]方法引入動(dòng)態(tài)鏈接庫文件,其完整的使用方式如以下代碼所示:

[DllImport(openvino_dll_path, CharSet=CharSet.Unicode, CallingConvention=CallingConvention.Cdecl)]

publicexternstaticIntPtrset_input_image_sharp(IntPtrinference_engine, stringinput_node_name, refulonginput_size);

針對[DllImport()]括號中的內(nèi)容:

openvino_dll_path為dll文件路徑

CharSet = CharSet.Unicode代表支持中文編碼格式字符串

CallingConvention = CallingConvention.Cdecl指示入口點(diǎn)的調(diào)用約定為調(diào)用方清理堆棧

在聲明動(dòng)態(tài)鏈接庫后,就可以引入動(dòng)態(tài)鏈接庫中的方法,由于我們在C++環(huán)境下生成的動(dòng)態(tài)鏈接庫,為了讓編譯器識(shí)別,需要方法名、變量類型一一對應(yīng),才可以引入成功:

6916e8c2-a2e3-11ed-bfe3-dac502259ad0.png

表 1C++與C#方法對應(yīng)關(guān)系

基于以上方法,我們將動(dòng)態(tài)鏈接庫中的所有方法引入到C#中。

C#構(gòu)建Core類

上一步我們引入了封裝的OpenVINO動(dòng)態(tài)鏈接庫,為了更方便的使用,將其封裝到Core類中。

在不同方法之間,主要通過推理核心結(jié)構(gòu)體指針在各個(gè)方法之間傳遞,在C#是沒有指針這個(gè)說法的,不過可以通過IntPtr結(jié)構(gòu)體來接收這個(gè)指針,為了防止該指針被篡改,將其封裝在類中作為私有成員使用。

根據(jù)模型推理的步驟,構(gòu)建模型推理類:

(1)構(gòu)造函數(shù)

publicCore(stringmodel_file, stringdevice_name){

// 初始化推理核心

ptr = NativeMethods.core_init(model_file, device_name);

}

在該方法中,主要是調(diào)用推理核心初始化方法,初始化推理核心,讀取本地模型,將模型加載到設(shè)備、創(chuàng)建推理請求等模型推理步驟。

(2)設(shè)置模型輸入形狀

// @brief 設(shè)置推理模型的輸入節(jié)點(diǎn)的大小

// @param input_node_name 輸入節(jié)點(diǎn)名

// @param input_size 輸入形狀大小數(shù)組

publicvoidset_input_sharp(stringinput_node_name, ulong[] input_size) {

// 獲取輸入數(shù)組長度

intlength = input_size.Length;

if(length == 4) {

// 長度為4,判斷為設(shè)置圖片輸入的輸入參數(shù),調(diào)用設(shè)置圖片形狀方法

ptr = NativeMethods.set_input_image_sharp(ptr, input_node_name, refinput_size[0]);

}

elseif(length == 2) {

// 長度為2,判斷為設(shè)置普通數(shù)據(jù)輸入的輸入?yún)?shù),調(diào)用設(shè)置普通數(shù)據(jù)形狀方法

ptr = NativeMethods.set_input_data_sharp(ptr, input_node_name, refinput_size[0]);

}

else{

// 為防止輸入發(fā)生異常,直接返回

return;

}

}

OpenVINO 2022.3支持模型動(dòng)態(tài)輸入,讀入模型可以不固定輸入大小,在使用時(shí)固定模型的輸入大小,并且可以隨時(shí)修改輸入形狀。當(dāng)前設(shè)置情況下,至此設(shè)置二維、以及四維的輸入形狀,在當(dāng)前模型中足夠使用。

(3)加載推理數(shù)據(jù)

// @brief 加載推理數(shù)據(jù)

// @param input_node_name 輸入節(jié)點(diǎn)名

// @param input_data 輸入數(shù)據(jù)數(shù)組

publicvoidload_input_data(stringinput_node_name, float[] input_data) {

ptr = NativeMethods.load_input_data(ptr, input_node_name, refinput_data[0]);

}

// @brief 加載圖片推理數(shù)據(jù)

// @param input_node_name 輸入節(jié)點(diǎn)名

// @param image_data 圖片矩陣

// @param image_size 圖片矩陣長度

publicvoidload_input_data(stringinput_node_name, byte[] image_data, ulongimage_size, inttype) {

ptr = NativeMethods.load_image_input_data(ptr, input_node_name, refimage_data[0], image_size, type);

}

加載推理數(shù)據(jù)主要包含圖片數(shù)據(jù)和普通的矩陣數(shù)據(jù),其中對于圖片的預(yù)處理,也已經(jīng)在C++中進(jìn)行封裝,保證了圖片數(shù)據(jù)在傳輸中的穩(wěn)定性。

(4)模型推理

// @brief 模型推理

publicvoidinfer() {

ptr = NativeMethods.core_infer(ptr);

}

(5)讀取推理結(jié)果數(shù)據(jù)

// @brief 讀取推理結(jié)果數(shù)據(jù)

// @param output_node_name 輸出節(jié)點(diǎn)名

// @param data_size 輸出數(shù)據(jù)長度

// @return 推理結(jié)果數(shù)組

publicT[] read_infer_result(stringoutput_node_name, intdata_size) {

// 獲取設(shè)定類型

stringt = typeof(T).ToString();

// 新建返回值數(shù)組

T[] result = newT[data_size];

if(t == "System.Int32") { // 讀取數(shù)據(jù)類型為整形數(shù)據(jù)

int[] inference_result = newint[data_size];

NativeMethods.read_infer_result_I32(ptr, output_node_name, data_size, refinference_result[0]);

result = (T[])Convert.ChangeType(inference_result, typeof(T[]));

returnresult;

}

else{ // 讀取數(shù)據(jù)類型為浮點(diǎn)型數(shù)據(jù)

float[] inference_result = newfloat[data_size];

NativeMethods.read_infer_result_F32(ptr, output_node_name, data_size, refinference_result[0]);

result = (T[])Convert.ChangeType(inference_result, typeof(T[]));

returnresult;

}

}

在讀取模型推理結(jié)果時(shí),支持讀取整形數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù),且需要知曉模型輸出數(shù)據(jù)的大小,這就要求我們對自己所使用的模型有很好的把握。

(6)清除地址

// @brief 刪除創(chuàng)建的地址

publicvoiddelet() {

NativeMethods.core_delet(ptr);

}

此處的清除地址需要調(diào)用fengzhuangd額地址刪除方法實(shí)現(xiàn),不可以直接刪除C#中創(chuàng)建的IntPtr,這樣會(huì)導(dǎo)致內(nèi)存泄漏,影響程序性能。

通過上面的封裝,比可以在C#平臺(tái)下,調(diào)用Core類,間接調(diào)用OpenVINO工具包署自己的模型了。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137538
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41496
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    84984

原文標(biāo)題:基于C# 和OpenVINO部署飛槳PP-Human

文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于C#和OpenVINO?在英特爾獨(dú)立顯卡上部署PP-TinyPose模型

    OpenVINO,將 PP-TinyPose 模型部署在英特爾獨(dú)立顯卡上。 1.1 PP-TinyPose 模型簡介 PP-TinyP
    的頭像 發(fā)表于 11-18 18:27 ?2588次閱讀

    介紹英特爾?分布式OpenVINO?工具包

    介紹英特爾?分布式OpenVINO?工具包可快速部署模擬人類視覺的應(yīng)用程序和解決方案。 該工具包基于卷積神經(jīng)網(wǎng)絡(luò)(CNN),可擴(kuò)展英特爾?硬件的計(jì)算機(jī)視覺(CV)工作負(fù)載,從而最大限度
    發(fā)表于 07-26 06:45

    怎么安裝適用于Linux *的OpenVINO?工具包的英特爾?發(fā)布版?

    怎么安裝適用于Linux *的OpenVINO?工具包的英特爾?發(fā)布版?
    發(fā)表于 09-23 08:33

    利用OpenVINO工具包檢測汽車品牌

    地檢測品牌、車標(biāo)和形狀。 OpenVINO TM的Intel&Distribution工具包是一個(gè)全面的工具包,用于快速開發(fā)模擬人類視覺的應(yīng)用程序和解決方案。該工具包以細(xì)胞神經(jīng)
    發(fā)表于 08-04 07:36

    如何在OpenVINO工具包中使用帶推理引擎的blob?

    無法確定如何在OpenVINO?工具包中使用帶推理引擎的 blob。
    發(fā)表于 08-15 07:17

    如何在OpenVINO trade工具包中推斷兩個(gè)圖像?

    無法在OpenVINO?工具包中對兩個(gè)輸入圖像運(yùn)行推理。
    發(fā)表于 08-15 08:24

    關(guān)于英特爾推出OpenVINO?工具包對物聯(lián)網(wǎng)的變革和影響分析

    新的OpenVINO工具包結(jié)合了各種先進(jìn)硅片,可提供一個(gè)完整的高性能解決方案,用于邊緣到云端的深度學(xué)習(xí)和視頻分析。通過各種常見軟件框架,如TensorFlow*、MXNet*、Caffe*等,英特爾的視覺產(chǎn)品助力開發(fā)者更容易地部署
    的頭像 發(fā)表于 09-05 14:09 ?1838次閱讀

    產(chǎn)業(yè)級預(yù)訓(xùn)練模型的實(shí)時(shí)行人分析工具PP-Human

    今天給大家介紹的,就是這樣一套不僅擁有上述能力,還直接提供目標(biāo)檢測、屬性分析、關(guān)鍵點(diǎn)檢測、行為識(shí)別、ReID等產(chǎn)業(yè)級預(yù)訓(xùn)練模型的實(shí)時(shí)行人分析工具PP-Human,方便開發(fā)者靈活取用及更改!
    的頭像 發(fā)表于 04-20 10:16 ?2040次閱讀

    基于OpenVINO? 的版 PGNet 實(shí)現(xiàn)案例

    OpenVINO 工具套件2022.1版于2022年3月22日正式發(fā)布,根據(jù)官宣OpenVINO 迎來迄今為止最重大更新,2022.1新特性搶先看!,OpenVINO 2022.1將是
    發(fā)表于 08-04 16:25 ?872次閱讀

    基于NVIDIAGPU定制優(yōu)化的NGC容器

    基于 NVIDIA GPU 定制優(yōu)化的 NGC 容器,包含了最新的 NVIDIA 工具包和優(yōu)化后的版本,致力于為開發(fā)者提供最佳的開發(fā)
    的頭像 發(fā)表于 08-25 10:49 ?918次閱讀

    行人分析工具PP-Human重磅升級!

    PP-Human經(jīng)由真實(shí)業(yè)務(wù)場景數(shù)據(jù)深度打磨優(yōu)化,擁有適應(yīng)不同光線、復(fù)雜背景下的人體屬性特征分析、異常行為識(shí)別、出入口人流計(jì)數(shù)與軌跡繪制、跨鏡跟蹤四大核心功能。
    的頭像 發(fā)表于 10-19 15:19 ?1969次閱讀

    PaddleDetection 發(fā)新,歡迎在 NVIDIA NGC 容器中體驗(yàn)最新特性!

    PaddleDetection 發(fā)版 v2.5,又帶著新功能和大家見面了。 本次更新,為大家?guī)?PP-YOLOE+、PP-Human v2、PP-Vehicle、PicoDet-NPU 等技術(shù)
    的頭像 發(fā)表于 11-10 11:00 ?937次閱讀

    使用 OpenVINO? 工具包進(jìn)行停車場監(jiān)控

    使用 OpenVINO? 工具包進(jìn)行停車場監(jiān)控
    的頭像 發(fā)表于 01-03 09:45 ?758次閱讀
    使用 <b class='flag-5'>OpenVINO</b>? <b class='flag-5'>工具包</b>進(jìn)行停車場監(jiān)控

    使用 OpenVINO? 工具包監(jiān)控機(jī)器操作員

    使用 OpenVINO? 工具包監(jiān)控機(jī)器操作員
    的頭像 發(fā)表于 01-03 09:45 ?782次閱讀
    使用 <b class='flag-5'>OpenVINO</b>? <b class='flag-5'>工具包</b>監(jiān)控機(jī)器操作員

    行人摔倒檢測-在英特爾開發(fā)套件上基于OpenVINO? C# API部署PP-Human

    OpenVINO 2023.1 于 2023 年 9 月 18 日發(fā)布,該工具包帶來了挖掘生成人工智能全部潛力的新功能。生成人工智能的覆蓋范圍得到了擴(kuò)展,通過 PyTorch* 等框架增強(qiáng)了體驗(yàn),您可以在其中自動(dòng)導(dǎo)入和轉(zhuǎn)換模型。
    的頭像 發(fā)表于 10-13 16:28 ?811次閱讀
    行人摔倒檢測-在英特爾開發(fā)套件上基于<b class='flag-5'>OpenVINO</b>? C# API<b class='flag-5'>部署</b><b class='flag-5'>PP-Human</b>