人体姿态识别算法
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
101 | 03/22/2024 |
1. 算法描述¶
人体姿态识别算法主要对7种人体姿态进行识别:
- 静态姿态(6类):bend、cross_arms、standing、wave1、wave2、lie_down
- 动态姿态(1类):walk
- 使用时请遵照如下所述的标准人体姿态,以保证算法的识别效果:
2. 接口调用流程¶
算法接口调用流程为 ALGO_HumanPose_CreateHandle->ALGO_HumanPose_InitHandle->ALGO_HumanPose_GetInputAttr->ALGO_HumanPose_SetParams->ALGO_HumanPose_Detect->ALGO_HumanPose_Cls->ALGO_HumanPose_DeinitHandle->ALGO_HumanPose_ReleaseHandle.
3. 功能模块API¶
API名 | 功能 |
---|---|
ALGO_HumanPose_CreateHandle | 创建句柄 |
ALGO_HumanPose_InitHandle | 初始化句柄 |
ALGO_HumanPose_GetInputAttr | 获取输入属性 |
ALGO_HumanPose_SetParams | 设置参数 |
ALGO_HumanPose_Detect | 人体姿态检测 |
ALGO_HumanPose_Cls | 人体姿态识别 |
ALGO_HumanPose_DeinitHandle | 句柄反初始化 |
ALGO_HumanPose_ReleaseHandle | 释放句柄 |
3.1. ALGO_HumanPose_CreateHandle¶
-
功能
创建句柄
-
语法
MI_S32 ALGO_HumanPose_CreateHandle(void** handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.2. ALGO_HumanPose_InitHandle¶
-
功能
初始化句柄
-
语法
MI_S32 ALGO_HumanPose_InitHandle(void *handle, const PoseInit_t *init);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init 初始化参数 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.3. ALGO_HumanPose_GetInputAttr¶
-
功能
获取输入属性
-
语法
MI_S32 ALGO_HumanPose_GetInputAttr(void *handle, PoseInputAttr_t *det_input_attr, PoseInputAttr_t *cls_input_attr);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 det_input_attr 检测模型输入属性(宽、高、图像格式) 输出 cls_input_attr 识别模型输入属性(宽、高、图像格式) 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.4. ALGO_HumanPose_SetParams¶
-
功能
设置参数
-
语法
MI_S32 ALGO_HumanPose_SetParams(void *handle, const PoseParams_t* params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 params 参数 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.5. ALGO_HumanPose_Detect¶
-
功能
人体姿态检测
-
语法
MI_S32 ALGO_HumanPose_Detect(void *handle, const PoseInput_t *input, PoseBox_t boxes[MAX_POSE_OBJECT], MI_S32 *num_boxes);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 检测模型输入数据800*480 yuv420_nv12 输入 boxes 检测框结果 输出 num_boxes 检测框个数 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.6. ALGO_HumanPose_Cls¶
-
功能
人体姿态识别,识别7类人体姿态中的哪种姿态
-
语法
MI_S32 ALGO_HumanPose_Cls(void *handle, const PoseInput_t *input, PoseBox_t* box, PoseCls_t* cls);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input 识别模型输入数据224*224 yuv420_nv12 输入 box 人体姿态检测框 输入 cls 人体姿态结果 输出 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.7. ALGO_HumanPose_DeinitHandle¶
-
功能
句柄反初始化
-
语法
MI_S32 ALGO_HumanPose_DeinitHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
3.8. ALGO_HumanPose_ReleaseHandle¶
-
功能
释放句柄
-
语法
MI_S32 ALGO_HumanPose_ReleaseHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
0:成功。
非0:失败。
-
依赖
头文件:sgs_pose_api.h
库文件:libsgsalgo_pose.so, libsgsalgo_pose.a
4. 数据类型¶
数据类型 | 定义 |
---|---|
PoseInit_t | 初始化参数结构体 |
PoseInput_t | 输入图像属性结构体 |
PoseInputAttr_t | 模型输入数据结构体 |
PoseCls_t | 人体姿态识别结果结构体 |
PoseBox_t | 人体姿态检测框结构体 |
PoseParams_t | 输入参数结构体 |
HumanPoseClass_e | 人体姿态类别信息 |
HumanKeyPoint_e | 人体姿态关键点类别信息 |
4.1. PoseInit_t¶
-
说明
初始化参数结构体
-
定义
typedef struct { char ipu_firmware_path[MAX_POSE_STRLEN]; char pose_model[MAX_POSE_STRLEN]; char cls_model[MAX_POSE_STRLEN]; MI_BOOL create_device; MI_BOOL destroy_device; } PoseInit_t;
-
成员
成员名称 描述 ipu_firmware_path ipu_firmware_bin路径 pose_model 检测模型路径(如: ./models/humanpose_det48y_20231023.img) cls_model 识别模型路径(如:./models/humanpose_cls_20240312.img) create_device 是否创建device:若为false,需要在算法库外自行创建device;若为true,在算法库内部自动创建device destroy_device 是否销毁device:若为false,需要在算法库外自行销毁device,若为true,在算法库内部自动销毁device -
相关接口
4.2. PoseInput_t¶
-
说明
输入图像数据结构体
-
定义
typedef struct { void *p_vir_addr; MI_PHY phy_addr; MI_U32 buf_size; MI_U64 pts; MI_U16 width; MI_U16 height; } PoseInput_t;
-
成员
成员名称 描述 p_vir_addr 虚拟地址 phy_addr 物理地址 buf_size 数据大小 pts 时间戳可不赋值 width 图片宽 height 图片高 -
相关数据类型及接口
4.3. PoseInputAttr_t¶
-
说明
模型输入属性结构体
-
定义
typedef struct { MI_U32 width; MI_U32 height; MI_IPU_ELEMENT_FORMAT format; } PoseInputAttr_t;
-
成员
成员名称 描述 width 输入图片宽 height 输入图片高 format 输入图片格式 -
相关数据类型及接口
4.4. PoseCls_t¶
-
说明
人体姿态识别结果结构体
-
定义
typedef struct { MI_S32 cls; MI_FLOAT score; } PoseCls_t;
-
成员
成员名称 描述 cls 人体姿态类别(对应关系见HumanPoseClass_e) score 人体姿态类别得分 -
相关数据类型及接口
4.5. PoseBox_t¶
-
说明
人体姿态检测框结构体
-
定义
typedef struct { MI_U32 x; MI_U32 y; MI_U32 width; MI_U32 height; MI_S32 cls; MI_FLOAT score; MI_U64 pts; MI_FLOAT keypts[MAX_POSE_NUM_KEYPTS][2]; MI_U64 track_id; } PoseBox_t;
-
成员
成员名称 描述 x 框的左上横坐标 y 框的左上纵坐标 width 框的宽 height 框的高 cls 框的类别 score 框的分值 pts 时间戳可不赋值 keypts 关键点序列 track_id 跟踪id -
相关数据类型及接口
4.6. PoseParams_t¶
-
说明
输入参数结构体
-
定义
typedef struct { MI_S32 disp_width; MI_S32 disp_height; MI_FLOAT min_width; MI_FLOAT min_height; MI_FLOAT det_threshold; MI_FLOAT cls_threshold; MI_FLOAT attr_threshold[MAX_POSE_NUM_ATTR]; } PoseParams_t;
-
成员
成员名称 描述 disp_width 显示宽度 disp_height 显示高度 min_width 检测的最小宽度 min_height 检测的最小高度 det_threshold 检测阈值 cls_threshold 识别阈值(阈值越高识别标准越严格) attr_threshold 属性阈值(人体姿态识别中无用) -
相关数据类型及接口
4.7. HumanPoseClass_e¶
-
说明
人体姿态类别信息
-
定义
typedef enum { E_HUMAN_POSE_NONE = 0, E_HUMAN_POSE_BEND, E_HUMAN_POSE_CROSS_ARMS, E_HUMAN_POSE_STANDING, E_HUMAN_POSE_WAVE1, E_HUMAN_POSE_WAVE2, E_HUMAN_POSE_LIE_DOWN, E_HUMAN_POSE_WALK, E_NUM_HUMAN_POSES } HumanPoseClass_e;
-
相关数据类型及接口
4.8. HumanKeyPoint_e¶
-
说明
人体姿态关键点类别信息
-
定义
typedef enum { E_NOSE = 0, E_LEFT_EYE, E_RIGHT_EYE, E_LEFT_EAR, E_RIGHT_EAR, E_LEFT_SHOULDER, E_RIGHT_SHOULDER, E_LEFT_ELBOW, E_RIGHT_ELBOW, E_LEFT_WRIST, E_RIGHT_WRIST, E_LEFT_HIP, E_RIGHT_HIP, E_LEFT_KNEE, E_RIGHT_KNEE, E_LEFT_ANKLE, E_RIGHT_ANKLE, E_NUM_HUMAN_KEYPTS } HumanKeyPoint_e;
-
图例:
-
相关数据类型及接口