人脸姿态识别算法


REVISION HISTORY

Revision No.
Description
Date
101
  • Initial release
  • 03/22/2024

    1. 算法描述

    人脸姿态识别算法主要对人脸部眼睛和嘴巴姿态进行识别,姿态属性有:

    • 眼睛(睁眼/闭眼)
    • 嘴巴(张嘴/闭嘴)

    2. 接口调用流程

    算法接口调用流程为 ALGO_HeadPose_CreateHandle->ALGO_HeadPose_InitHandle->ALGO_HeadPose_GetInputAttr->ALGO_HeadPose_SetParams->ALGO_HeadPose_Detect->ALGO_HeadPose_Attr->ALGO_HeadPose_DeinitHandle->ALGO_HeadPose_ReleaseHandle.

    3. 功能模块API

    API名 功能
    ALGO_HeadPose_CreateHandle 创建句柄
    ALGO_HeadPose_InitHandle 初始化句柄
    ALGO_HeadPose_GetInputAttr 获取输入属性
    ALGO_HeadPose_SetParams 设置参数
    ALGO_HeadPose_Detect 人脸姿态检测
    ALGO_HeadPose_Attr 人脸姿态属性识别
    ALGO_HeadPose_DeinitHandle 句柄反初始化
    ALGO_HeadPose_ReleaseHandle 释放句柄

    3.1. ALGO_HeadPose_CreateHandle

    • 功能

      创建句柄

    • 语法

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

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

      0:成功。

      非0:失败。

    • 依赖

      头文件:sgs_pose_api.h

      库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

    3.2. ALGO_HeadPose_InitHandle

    • 功能

      初始化句柄

    • 语法

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

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

      0:成功。

      非0:失败。

    • 依赖

      头文件:sgs_pose_api.h

      库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

    3.3. ALGO_HeadPose_GetInputAttr

    • 功能

      获取输入属性

    • 语法

      MI_S32 ALGO_HeadPose_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_HeadPose_SetParams

    • 功能

      设置参数

    • 语法

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

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

      0:成功。

      非0:失败。

    • 依赖

      头文件:sgs_pose_api.h

      库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

    3.5. ALGO_HeadPose_Detect

    • 功能

      人脸姿态检测

    • 语法

      MI_S32 ALGO_HeadPose_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_HeadPose_Attr

    • 功能

      人脸姿态属性识别,识别眼睛和嘴巴是哪种姿态属性

    • 语法

      MI_S32 ALGO_HeadPose_Attr(void *handle,  const PoseInput_t *input, PoseBox_t* box, PoseCls_t attrs[E_NUM_HEAD_POSE_ATTR], int *num_attrs);
      
    • 形参

      参数名称 描述 输入/输出
      handle 句柄 输入
      input 识别模型输入数据224*224 yuv420_nv12 输入
      box 人脸姿态检测框 输入
      attrs 人脸姿态属性结果 输出
      num_attrs 人脸姿态属性数量 输出
    • 返回值

      0:成功。

      非0:失败。

    • 依赖

      头文件:sgs_pose_api.h

      库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

    3.7. ALGO_HeadPose_DeinitHandle

    • 功能

      句柄反初始化

    • 语法

      MI_S32 ALGO_HeadPose_DeinitHandle(void *handle);
      
    • 形参

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

      0:成功。

      非0:失败。

    • 依赖

      头文件:sgs_pose_api.h

      库文件:libsgsalgo_pose.so, libsgsalgo_pose.a

    3.8. ALGO_HeadPose_ReleaseHandle

    • 功能

      释放句柄

    • 语法

      MI_S32 ALGO_HeadPose_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 输入参数结构体
    HeadPoseAttr_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/headpose_det48y_20230628.img)
      cls_model 识别模型路径(如:./models/headpose_land_20240321.img)
      create_device 是否创建device:若为false,需要在算法库外自行创建device;若为true,在算法库内部自动创建device
      destroy_device 是否销毁device:若为false,需要在算法库外自行销毁device,若为true,在算法库内部自动销毁device
    • 相关接口

      ALGO_HeadPose_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_HeadPose_Detect

      ALGO_HeadPose_Attr

    4.3. PoseInputAttr_t

    • 说明

      模型输入属性结构体

    • 定义

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

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

      ALGO_HeadPose_GetInputAttr

    4.4. PoseCls_t

    • 说明

      人脸姿态属性识别结果结构体

    • 定义

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

      成员名称 描述
      cls 人脸姿态属性(对应关系见HeadPoseAttr_e)
      score 人脸姿态属性得分
    • 相关数据类型及接口

      ALGO_HeadPose_Attr

    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_HeadPose_Detect

      ALGO_HeadPose_Attr

    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_HeadPose_SetParams

    4.7. HeadPoseAttr_e

    • 说明

      人脸姿态属性信息

    • 定义

      typedef enum
      {
          E_EYE_OPENNESS = 0,
          E_MOUTH_OPENNESS,
          E_NUM_HEAD_POSE_ATTR
      } HeadPoseAttr_e;
      
    • 相关数据类型及接口

      PoseCls_t

      ALGO_HeadPose_Attr