0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于OpenVINO™工具包部署飞桨PP-Human的全流程

SDNLAB 来源:杨雪锋 2023-02-23 18:03 次阅读

本文将详细介绍基于OpenVINO工具包,在C#语言下,部署飞桨PP-Human的全流程,帮助开发者快速掌握并部署产业级AI人体分析解决方案。

飞桨实时行人分析工具PP-Human

PP-Human是飞桨目标检测套件PaddleDetection中开源的实时行人分析工具,提供了五大异常行为识别和四大产业级功能:人体属性分析、人流计数、跨镜ReID,如下图所示:

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

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

PP-Human技术架构

PP-Human支持单张图片、图片文件夹单镜头视频和多镜头视频输入,经目标检测以及特征关联,实现属性识别、关键点检测、轨迹/流量计数以及行为识别等功能,如下图所示。本文将以行人摔倒识别为例,基于OpenVINO进行多种模型联合部署。

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

图 1-2PP-Human技术架构

构建C#开发环境

为了防止复现代码出现问题,列出以下代码开发环境,可以根据自己需求设置,注意OpenVINO一定是2022版本,其他依赖项可以根据自己的设置修改。

操作系统:Windows 11

OpenVINO:2022.3

OpenCV:4.5.5

Visual Studio:2022 Community

C#框架:.NET 6.0

OpenCvSharp:OpenCvSharp4

C#中调用OpenVINO实现

构建OpenVINO动态链接库

由于OpenVINO只有C++Python接口,无法直接在C#中使用OpenVINO部署模型,为了实现在C#中使用,通过动态链接库的方式实现。

在C#中引入动态链接库文件

在C#中需要使用[DllImport()]方法引入动态链接库文件,其完整的使用方式如以下代码所示:

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

publicexternstaticIntPtrset_input_image_sharp(IntPtrinference_engine, stringinput_node_name, refulonginput_size);

针对[DllImport()]括号中的内容:

openvino_dll_path为dll文件路径

CharSet = CharSet.Unicode代表支持中文编码格式字符串

CallingConvention = CallingConvention.Cdecl指示入口点的调用约定为调用方清理堆栈

在声明动态链接库后,就可以引入动态链接库中的方法,由于我们在C++环境下生成的动态链接库,为了让编译器识别,需要方法名、变量类型一一对应,才可以引入成功:

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

表 1C++与C#方法对应关系

基于以上方法,我们将动态链接库中的所有方法引入到C#中。

C#构建Core类

上一步我们引入了封装的OpenVINO动态链接库,为了更方便的使用,将其封装到Core类中。

在不同方法之间,主要通过推理核心结构体指针在各个方法之间传递,在C#是没有指针这个说法的,不过可以通过IntPtr结构体来接收这个指针,为了防止该指针被篡改,将其封装在类中作为私有成员使用。

根据模型推理的步骤,构建模型推理类:

(1)构造函数

publicCore(stringmodel_file, stringdevice_name){

// 初始化推理核心

ptr = NativeMethods.core_init(model_file, device_name);

}

在该方法中,主要是调用推理核心初始化方法,初始化推理核心,读取本地模型,将模型加载到设备、创建推理请求等模型推理步骤。

(2)设置模型输入形状

// @brief 设置推理模型的输入节点的大小

// @param input_node_name 输入节点名

// @param input_size 输入形状大小数组

publicvoidset_input_sharp(stringinput_node_name, ulong[] input_size) {

// 获取输入数组长度

intlength = input_size.Length;

if(length == 4) {

// 长度为4,判断为设置图片输入的输入参数,调用设置图片形状方法

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

}

elseif(length == 2) {

// 长度为2,判断为设置普通数据输入的输入参数,调用设置普通数据形状方法

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

}

else{

// 为防止输入发生异常,直接返回

return;

}

}

OpenVINO 2022.3支持模型动态输入,读入模型可以不固定输入大小,在使用时固定模型的输入大小,并且可以随时修改输入形状。当前设置情况下,至此设置二维、以及四维的输入形状,在当前模型中足够使用。

(3)加载推理数据

// @brief 加载推理数据

// @param input_node_name 输入节点名

// @param input_data 输入数据数组

publicvoidload_input_data(stringinput_node_name, float[] input_data) {

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

}

// @brief 加载图片推理数据

// @param input_node_name 输入节点名

// @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);

}

加载推理数据主要包含图片数据和普通的矩阵数据,其中对于图片的预处理,也已经在C++中进行封装,保证了图片数据在传输中的稳定性。

(4)模型推理

// @brief 模型推理

publicvoidinfer() {

ptr = NativeMethods.core_infer(ptr);

}

(5)读取推理结果数据

// @brief 读取推理结果数据

// @param output_node_name 输出节点名

// @param data_size 输出数据长度

// @return 推理结果数组

publicT[] read_infer_result(stringoutput_node_name, intdata_size) {

// 获取设定类型

stringt = typeof(T).ToString();

// 新建返回值数组

T[] result = newT[data_size];

if(t == "System.Int32") { // 读取数据类型为整形数据

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{ // 读取数据类型为浮点型数据

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;

}

}

在读取模型推理结果时,支持读取整形数据和浮点型数据,且需要知晓模型输出数据的大小,这就要求我们对自己所使用的模型有很好的把握。

(6)清除地址

// @brief 删除创建的地址

publicvoiddelet() {

NativeMethods.core_delet(ptr);

}

此处的清除地址需要调用fengzhuangd额地址删除方法实现,不可以直接删除C#中创建的IntPtr,这样会导致内存泄漏,影响程序性能。

通过上面的封装,比可以在C#平台下,调用Core类,间接调用OpenVINO工具包署自己的模型了。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7551

    浏览量

    131848
  • OpenCV
    +关注

    关注

    29

    文章

    614

    浏览量

    40907
  • python
    +关注

    关注

    53

    文章

    4701

    浏览量

    83699

原文标题:基于C# 和OpenVINO部署飞桨PP-Human

文章出处:【微信号:SDNLAB,微信公众号:SDNLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    fastrbf工具包

    求matlab中fastrbf的工具包 ,有谁有这个工具包呢?求分享?急需
    发表于 03-05 20:05

    介绍英特尔®分布式OpenVINO工具包

    介绍英特尔®分布式OpenVINO工具包可快速部署模拟人类视觉的应用程序和解决方案。 该工具包基于卷积神经网络(CNN),可扩展英特尔®硬件的计算机视觉(CV)工作负载,从而最大限度
    发表于 07-26 06:45

    怎么安装适用于Linux *的OpenVINO工具包的英特尔®发布版?

    怎么安装适用于Linux *的OpenVINO工具包的英特尔®发布版?
    发表于 09-23 08:33

    利用OpenVINO工具包检测汽车品牌

    地检测品牌、车标和形状。 OpenVINO TM的Intel&Distribution工具包是一个全面的工具包,用于快速开发模拟人类视觉的应用程序和解决方案。该工具包以细胞神经
    发表于 08-04 07:36

    为什么无法通过Heroku部署OpenVINO工具套件?

    无法通过 Heroku 部署OpenVINO工具套件: Importeror:libpython3.9.so.1.0:无法打开共享对象文件:无此类文件或目录
    发表于 08-14 08:58

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

    无法确定如何在OpenVINO工具包中使用带推理引擎的 blob。
    发表于 08-15 07:17

    如何在OpenVINO trade工具包中推断两个图像?

    无法在OpenVINO工具包中对两个输入图像运行推理。
    发表于 08-15 08:24

    ARM KEIL™MDK工具包的操作流程

    本笔记介绍了ARM®KEIL™MDK工具包的操作流程,该工具包采用了μVision®和MicroSemi(Actel™)包含嵌入式ARM®Cortex™-M3处理器的全新智能融合2(SF2)系列
    发表于 09-04 06:16

    产业级预训练模型的实时行人分析工具PP-Human

    今天给大家介绍的,就是这样一套不仅拥有上述能力,还直接提供目标检测、属性分析、关键点检测、行为识别、ReID等产业级预训练模型的实时行人分析工具PP-Human,方便开发者灵活取用及更改!
    的头像 发表于 04-20 10:16 1800次阅读

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

    PP-Human经由真实业务场景数据深度打磨优化,拥有适应不同光线、复杂背景下的人体属性特征分析、异常行为识别、出入口人流计数与轨迹绘制、跨镜跟踪四大核心功能。
    的头像 发表于 10-19 15:19 1517次阅读

    使用 OpenVINO工具包进行停车场监控

    使用 OpenVINO工具包进行停车场监控
    的头像 发表于 01-03 09:45 505次阅读
    使用 <b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>工具包</b>进行停车场监控

    使用 OpenVINO工具包监控机器操作员

    使用 OpenVINO工具包监控机器操作员
    的头像 发表于 01-03 09:45 551次阅读
    使用 <b class='flag-5'>OpenVINO</b>™ <b class='flag-5'>工具包</b>监控机器操作员

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下载并转换YOLOv5预训练模型的详细步骤,请参考:《基于OpenVINO™2022.2和蝰蛇峡谷优化并部署YOLOv5模型》,本文所使用的OpenVINO是2022.3 LTS版。
    的头像 发表于 02-15 16:53 2400次阅读

    行人摔倒检测-在英特尔开发套件上基于OpenVINO™ C# API部署PP-Human

    OpenVINO 2023.1 于 2023 年 9 月 18 日发布,该工具包带来了挖掘生成人工智能全部潜力的新功能。生成人工智能的覆盖范围得到了扩展,通过 PyTorch* 等框架增强了体验,您可以在其中自动导入和转换模型。
    的头像 发表于 10-13 16:28 444次阅读
    行人摔倒检测-在英特尔开发套件上基于<b class='flag-5'>OpenVINO</b>™ C# API<b class='flag-5'>部署</b><b class='flag-5'>PP-Human</b>

    NNCF压缩与量化YOLOv8模型与OpenVINO部署测试

    OpenVINO2023版本衍生出了一个新支持工具包NNCF(Neural Network Compression Framework – 神经网络压缩框架),通过对OpenVINO IR格式模型的压缩与量化更好的提升模型在
    的头像 发表于 11-20 10:46 1083次阅读
    NNCF压缩与量化YOLOv8模型与<b class='flag-5'>OpenVINO</b><b class='flag-5'>部署</b>测试