本文将详细介绍基于openvino工具包,在c#语言下,部署飞桨pp-human的全流程,帮助开发者快速掌握并部署产业级ai人体分析解决方案。
飞桨实时行人分析工具pp-human
pp-human是飞桨目标检测套件paddledetection中开源的实时行人分析工具,提供了五大异常行为识别和四大产业级功能:人体属性分析、人流计数、跨镜reid,如下图所示:
图 1-1 pp-human v2全功能全景图
pp-human技术架构
pp-human支持单张图片、图片文件夹单镜头视频和多镜头视频输入,经目标检测以及特征关联,实现属性识别、关键点检测、轨迹/流量计数以及行为识别等功能,如下图所示。本文将以行人摔倒识别为例,基于openvino进行多种模型联合部署。
图 1-2 pp-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)]
public extern static intptr set_input_image_sharp(intptr inference_engine, string input_node_name, ref ulong input_size);
针对[dllimport()]括号中的内容:
openvino_dll_path为dll文件路径
charset = charset.unicode代表支持中文编码格式字符串
callingconvention = callingconvention.cdecl指示入口点的调用约定为调用方清理堆栈
在声明动态链接库后,就可以引入动态链接库中的方法,由于我们在c++环境下生成的动态链接库,为了让编译器识别,需要方法名、变量类型一一对应,才可以引入成功:
表 1 c++与c#方法对应关系
基于以上方法,我们将动态链接库中的所有方法引入到c#中。
c#构建core类
上一步我们引入了封装的openvino动态链接库,为了更方便的使用,将其封装到core类中。
在不同方法之间,主要通过推理核心结构体指针在各个方法之间传递,在c#是没有指针这个说法的,不过可以通过intptr结构体来接收这个指针,为了防止该指针被篡改,将其封装在类中作为私有成员使用。
根据模型推理的步骤,构建模型推理类:
(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;
}
}
openvino 2022.3支持模型动态输入,读入模型可以不固定输入大小,在使用时固定模型的输入大小,并且可以随时修改输入形状。当前设置情况下,至此设置二维、以及四维的输入形状,在当前模型中足够使用。
(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);
}
此处的清除地址需要调用fengzhuangd额地址删除方法实现,不可以直接删除c#中创建的intptr,这样会导致内存泄漏,影响程序性能。
通过上面的封装,比可以在c#平台下,调用core类,间接调用openvino工具包署自己的模型了。
基于68HC908SR12的智能数字化开关电源设计
施耐德电气将携“零碳城市”亮相第四届进博会
AMD三代锐龙国行价格曝光 最低售价1999元
三极管的输入/输出特性曲线
运用积分制管理来增加绩效管理的趣味性?
基于OpenVINO™工具包部署飞桨PP-Human的全流程
详解STM32F407VE中的串行总线功能
手机电磁兼容设计及EMI解决方案
用图卷积网络解决语义分割问题
Miso Robotics推出Flippy 2厨房机器人
人工智能告诉我们未来需要更深入地探索人类创造力的本质
诺基亚贝尔携手中国联通完成1.2Gbps下载速率验证 网络速率领跑全球
黑鲨游戏新机入网 疑为黑鲨游戏手机2的小幅升级版
展望2018年将会改变人们生活的科技
印刷电路板丝网设计的十大技巧
LED显示屏常见故障及维修
音频变压器的阻抗比和功率详解
骁龙660+4G+双摄, MOTO X4或定价2200元
可燃气体检测仪日常维护和保养方法
地面雷达数据处理系统设计