宠物姿态识别算法


REVISION HISTORY

Revision No. Description Date
102 Initial release 02/10/2025

1. 算法描述

宠物姿态识别算法主要对8种姿态进行识别:(注:目前" 摇尾巴"识别尚未ready)

  • 正对镜头吐舌(E_PET_POSE_TONGUE_OUT);
  • 舔毛/清洁(E_PET_POSE_CLEAN);
  • 蜷缩身体(E_PET_POSE_CURL);
  • 舒展身体(E_PET_POSE_STRETCH);
  • 双脚站立(E_PET_POSE_STAND_UP);
  • 吃东西(E_PET_POSE_EAT);
  • 上厕所(E_PET_POSE_POOP);
  • 摇尾巴(E_PET_POSE_SHAKE_TAIL, not ready);

2. 接口调用流程

算法接口调用流程为 ALGO_PetPose_CreateHandle->ALGO_PetPose_InitHandle->ALGO_PetPose_GetInputAttr->ALGO_PetPose_SetParams->ALGO_PetPose_Detect->ALGO_PetPose_Cls->ALGO_PetPose_DeinitHandle->ALGO_PetPose_ReleaseHandle.

3. 功能模块API

API名 功能
ALGO_PetPose_CreateHandle 创建句柄
ALGO_PetPose_InitHandle 初始化句柄
ALGO_PetPose_GetInputAttr 获取输入属性
ALGO_PetPose_SetParams 设置参数
ALGO_PetPose_Detect 宠物姿态检测
ALGO_PetPose_Cls 宠物姿态识别
ALGO_PetPose_DeinitHandle 句柄反初始化
ALGO_PetPose_ReleaseHandle 释放句柄

3.1. ALGO_PetPose_CreateHandle

  • 功能

    创建句柄

  • 语法

    MI_S32 ALGO_PetPose_CreateHandle(void** handle);
    
  • 形参

    参数名称 描述 输入/输出
    handle 句柄 输出
  • 返回值

    0:成功。

    非0:失败。

  • 依赖

    头文件:sgs_pose_api.h

    库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

3.2. ALGO_PetPose_InitHandle

  • 功能

    初始化句柄

  • 语法

    MI_S32 ALGO_PetPose_InitHandle(void *handle, const PoseInit_t *init);
    
  • 形参

    参数名称 描述 输入/输出
    handle 句柄 输入
    init 初始化参数 输入
  • 返回值

    0:成功。

    非0:失败。

  • 依赖

    头文件:sgs_pose_api.h

    库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

3.3. ALGO_PetPose_GetInputAttr

  • 功能

    获取输入属性

  • 语法

    MI_S32 ALGO_PetPose_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_PetPose_SetParams

  • 功能

    设置参数

  • 语法

    MI_S32 ALGO_PetPose_SetParams(void *handle, const PoseParams_t* params);
    
  • 形参

    参数名称 描述 输入/输出
    handle 句柄 输入
    params 参数 输入
  • 返回值

    0:成功。

    非0:失败。

  • 依赖

    头文件:sgs_pose_api.h

    库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

3.5. ALGO_PetPose_Detect

  • 功能

    宠物姿态检测

  • 语法

    MI_S32 ALGO_PetPose_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_PetPose_Cls

  • 功能

    宠物姿态识别,识别8类宠物姿态中的哪种姿态

  • 语法

    MI_S32 ALGO_PetPose_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_PetPose_DeinitHandle

  • 功能

    句柄反初始化

  • 语法

    MI_S32 ALGO_PetPose_DeinitHandle(void *handle);
    
  • 形参

    参数名称 描述 输入/输出
    handle 句柄 输入
  • 返回值

    0:成功。

    非0:失败。

  • 依赖

    头文件:sgs_pose_api.h

    库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

3.8. ALGO_PetPose_ReleaseHandle

  • 功能

    释放句柄

  • 语法

    MI_S32 ALGO_PetPose_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 输入参数结构体
PetPoseClass_e 宠物姿态类别信息
PetKeyPoint_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 检测模型路径
    cls_model 识别模型路径
    create_device 是否创建device:若为false,需要在算法库外自行创建device;若为true,在算法库内部自动创建device
    destroy_device 是否销毁device:若为false,需要在算法库外自行销毁device,若为true,在算法库内部自动销毁device
  • 相关接口

    ALGO_PetPose_InitHandle

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 图片高
  • 相关数据类型及接口

    ALGO_PetPose_Detect

    ALGO_PetPose_Cls

4.3. PoseInputAttr_t

  • 说明

    模型输入属性结构体

  • 定义

    typedef struct
    {
        MI_U32 width;
        MI_U32 height;
        MI_IPU_ELEMENT_FORMAT format;
    } PoseInputAttr_t;
    
  • 成员

    成员名称 描述
    width 输入图片宽
    height 输入图片高
    format 输入图片格式
  • 相关数据类型及接口

    ALGO_PetPose_GetInputAttr

4.4. PoseCls_t

  • 说明

    宠物姿态识别结果结构体

  • 定义

    typedef struct
    {
        MI_S32 cls;
        MI_FLOAT score;
    } PoseCls_t;
    
  • 成员 ​

    成员名称 描述
    cls 宠物姿态类别(对应关系见PetPoseClass_e
    score 宠物姿态类别得分
  • 相关数据类型及接口

    ALGO_PetPose_Cls

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
  • 相关数据类型及接口

    ALGO_PetPose_Detect

    ALGO_PetPose_Cls

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 属性阈值(宠物姿态识别中无用)
  • 相关数据类型及接口

    ALGO_PetPose_SetParams

4.7. PetPoseClass_e

  • 说明

    宠物姿态类别信息

  • 定义

    typedef enum
    {
        E_PET_POSE_NONE = 0,
        E_PET_POSE_TONGUE_OUT,
        E_PET_POSE_CLEAN,
        E_PET_POSE_CURL,
        E_PET_POSE_STRETCH,
        E_PET_POSE_STAND_UP,
        E_PET_POSE_EAT,
        E_PET_POSE_POOP,
        E_PET_POSE_SHAKE_TAIL,
        E_NUM_PET_POSES
    } PetPoseClass_e;
    
  • 相关数据类型及接口

    PoseCls_t

    ALGO_PetPose_Cls

4.8. PetKeyPoint_e

  • 说明

    宠物姿态关键点类别信息

  • 定义

    typedef enum
    {
        E_PET_LEFT_EYE = 0,
        E_PET_RIGHT_EYE,
        E_PET_NOSE,
        E_PET_LEFT_MOUTH,
        E_PET_RIGHT_MOUTH,
    
        E_PET_LEFT_FRONT_THIGH,
        E_PET_LEFT_FRONT_KNEE,
        E_PET_LEFT_FRONT_PAW,
    
        E_PET_RIGHT_FRONT_THIGH,
        E_PET_RIGHT_FRONT_KNEE,
        E_PET_RIGHT_FRONT_PAW,
    
        E_PET_LEFT_BACK_THIGH,
        E_PET_LEFT_BACK_KNEE,
        E_PET_LEFT_BACK_PAW,
    
        E_PET_RIGHT_BACK_THIGH,
        E_PET_RIGHT_BACK_KNEE,
        E_PET_RIGHT_BACK_PAW,
    
        E_PET_TAIL_ROOT,
        E_PET_TAIL_END,
    
        E_PET_TONGUE,
    
        E_NUM_PET_KEYPTS
    } PetKeyPoint_e;
    
  • 相关数据类型及接口

    PoseBox_t

    ALGO_PetPose_Detect

    ALGO_PetPose_Cls