检测算法
REVISION HISTORY¶
Revision No. | Description | Date |
---|---|---|
1.0 | First version | 04/25/2023 |
1.1 | Second version | 10/30/2023 |
1. 概述¶
1.1. 算法说明¶
检测算法包括:行人检测(SYPD)、人非车检测(SYPCN)、人宠物检测(SYPCD)、车牌检测(SYLPD)、人脸检测(SYFD)、人非车宠物检测(SYPCNCD)、火焰烟雾(SYFSD)。具体的检测类别说明如下:
-
行人检测(SYPD)输出的类别共1类,为行人(class_id=0)。
-
人非车检测(SYPCN)输出的类别共6类,分别为行人(class_id=0)、自行车(class_id=1)、轿车(class_id=2) 、摩托车(class_id=3)、公交车(class_id=4)、卡车(class_id=5) 。
-
人宠物检测(SYPCD)输出的类别共3类,分别为行人(class_id=0)、猫(class_id=1)、狗(class_id=2)。
-
车牌检测(SYLPD)输出的类别共1类,分别为车牌(class_id=0)。
-
人脸检测(SYFD)输出的类别共1类,分别人脸(class_id=0)。
-
人非车宠物检测(SYPCNCD)输出的类别共6类,分别为行人(class_id=0)、自行车(class_id=1)、轿车(class_id=2)、摩托车(class_id=3)、公交车(class_id=4)、卡车(class_id=5)、猫(class_id=6)、狗(class_id=7)。
-
火焰烟雾(SYFSD)输出的类别共2类,分别为火焰(class_id=0)、烟雾(class_id=1);
-
人+车+宠物+人头+人脸检测(SD)输出的类别共10类,分别为行人(class_id=0)、自行车(class_id=1)、轿车(class_id=2) 、摩托车(class_id=3)、公交车(class_id=4)、卡车(class_id=5)、猫(class_id=6)、狗(class_id=7)、人头(class_id=8)、人脸(class_id=9)。
-
人+人头+人脸检测(SPD)输出的类别共3类,分别为行人(class_id=0)、人头(class_id=1)、人脸(class_id=2)。
1.2. 算法规格¶
-
行人检测(SYPD)
-
板端资源(在377平台(IPU clock@800MHz)下测得)
Model Name Model Version Resolution Input Format Rom Ram Inference Time PostProcess Time SYPD36 310 640x352 yuv_nv12 772KB 1780KB 6.5ms 约1.0ms SYPD48 310 800x480 yuv_nv12 828KB 2540KB 10.9ms 约1.2ms SYPD58 310 896x512 yuv_nv12 848KB 3048KB 13.0ms 约1.5ms
-
-
人非车检测(SYPCN)
-
板端资源(在377平台下测得)
Model Name Model Version Resolution Input Format Rom Ram Inference Time PostProcess Time SYPCN36s 310 640x352 yuv_nv12 880KB 1928KB 6.6ms 约1.2ms SYPCN48s 310 800x480 yuv_nv12 936KB 2720KB 11.1ms 约1.6ms SYPCN58s 310 896x512 yuv_nv12 960KB 3256KB 13.3ms 约2.0ms SYPCN36l 310 800x480 yuv_nv12 3216KB 5176KB 15.7ms 约1.2ms SYPCN48l 310 896x512 yuv_nv12 3340KB 6660KB 26.4ms 约1.6ms
-
-
人宠物检测(SYPCD)
-
板端资源(在377平台下测得)
Model Name Model Version Resolution Input Format Rom Ram Inference Time PostProcess Time SYPCD36s 310 640x352 yuv_nv12 772KB 1796KB 6.5ms 约1.1ms SYPCD48s 310 800x480 yuv_nv12 828KB 2572KB 11.0ms 约1.5ms SYPCD58s 310 896x512 yuv_nv12 852KB 3092KB 13.1ms 约1.8ms
-
-
火焰烟雾检测(SYFSD)
-
板端资源(在377平台下测得)
Model Name Model Version Resolution Input Format Rom Ram Inference Time PostProcess Time SYFSDY36l 310 640x352 yuv_nv12 2579KB 4489KB 14.76ms 约1.1ms SYFSDY48l 310 800x480 yuv_nv12 2689KB 5940KB 24.67ms 约1.5ms
-
2. API参考¶
该功能模块提供以下API:
API名称 | 功能 |
---|---|
ALGO_DET_CreateHandle | 创建句柄 |
ALGO_DET_InitHandle | 初始化句柄 |
ALGO_DET_SetTracker | 设置后处理跟踪算法开关 |
ALGO_DET_SetStableBox | 设置后处理稳框的开关 |
ALGO_DET_GetInputAttr | 获取模型的属性信息 |
ALGO_DET_SetThreshold | 设置阈值 |
ALGO_DET_Run | 运行检测算法 |
ALGO_DET_DeinitHandle | 停止检测算法 |
ALGO_DET_ReleaseHandle | 释放句柄 |
ALGO_DET_SetTracker2 | 设置后处理跟踪算法开关和参数 |
ALGO_DET_SetStrictMode | 设置strict检测模式参数 |
ALGO_DET_InitHandle2 | 使用模型内存块指针进行算法初始化 |
2.1. ALGO_DET_CreateHandle¶
-
功能
创建句柄
-
语法
MI_S32 ALGO_DET_CreateHandle(void **handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.2. ALGO_DET_InitHandle¶
-
功能
初始化句柄
-
语法
MI_S32 ALGO_DET_InitHandle(void *handle, DetectionInfo_t *init_info);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init_info 检测算法配置项,详见DetectionInfo_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.3. ALGO_DET_SetTracker¶
-
功能
设置后处理跟踪算法参数
-
语法
MI_S32 ALGO_DET_SetTracker(void *handle, MI_S32 tk_type, MI_S32 md_type);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 tk_type tracker算法开关(设置0为关闭,1为开启,默认为关闭) 输入 md_type 运动目标检测开关(设置为0,运动/静止目标均检测,设置为1,仅检测运动目标, 默认为0) 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.4. ALGO_DET_SetStableBox¶
-
功能
设置后处理稳框算法开关
-
语法
MI_S32 ALGO_DET_SetStableBox(void *handle, bool stable);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 stable 稳框算法开关(设置false为关闭,true为开启,默认为关闭) 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.5. ALGO_DET_GetInputAttr¶
-
功能
获取模型的属性信息,包括模型输入分辨率以及输入数据的类型
-
语法
MI_S32 ALGO_DET_GetInputAttr(void *handle, InputAttr_t *input_attr);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input_attr 保存属性信息指针,详见InputAttr_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.6. ALGO_DET_SetThreshold¶
-
功能
设置检测阈值
-
语法
MI_S32 ALGO_DET_SetThreshold(void *handle, MI_FLOAT threshold);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 threshold 阈值 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.7. ALGO_DET_Run¶
-
功能
运行检测算法
-
语法
MI_S32 ALGO_DET_Run(void *handle, const ALGO_Input_t *algo_input, Box_t bboxes[MAX_DET_OBJECT], MI_S32 *num_bboxes);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 algo_input 输入图像的buffer信息 输入 bboxes 用于保存检测结果框的数组 输入 num_bboxes 用于保存检测结果框个数的指针 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.8. ALGO_DET_DeinitHandle¶
-
功能
停止检测算法
-
语法
MI_S32 ALGO_DET_DeinitHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.9. ALGO_DET_ReleaseHandle¶
-
功能
释放句柄占用资源
-
语法
MI_S32 ALGO_DET_ReleaseHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.10. ALGO_DET_SetTracker2¶
-
功能
设置后处理跟踪相关参数(提供更多定制项)
-
语法
MI_S32 ALGO_DET_SetTracker2(void *handle, DetTrackParams_t track_params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 track_params 跟踪参数结构体 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.11. ALGO_DET_SetStrictMode¶
-
功能
设置strict检测模式参数
-
语法
MI_S32 ALGO_DET_SetStrictMode(void *handle, DetStrictModeParams_t params);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 params strict检测模式参数结构体,(详见DetStrictModeParams_t) 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
2.12. ALGO_DET_InitHandle2¶
-
功能
使用模型内存块指针进行算法初始化
-
语法
MI_S32 ALGO_DET_InitHandle2(void *handle, DetectionInfo2_t *init_info);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init_info 检测算法配置项,详见DetectionInfo2_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_det_api.h
- 库文件:libsstaralgo_det.a / libsstaralgo_det.so
3. 结构体说明¶
检测相关结构体定义如下:
数据类型 | 定义 |
---|---|
Rect_t | 定义分辨率大小 |
InputAttr_t | 算法输入结构体 |
Box_t | 算法输出结构体 |
DetectionInfo_t | 算法参数相关结构体 |
ALGO_Input_t | 算法输入图像数据信息 |
DetTrackParams_t | 跟踪算法参数结构体 |
DetStrictModeParams_t | strict检测模式参数结构体 |
DetectionInfo2_t | 使用模型内存块进行初始化的算法参数结构体 |
3.1 Rect_t¶
-
说明
定义分辨率大小
-
定义
typedef struct{ MI_U32 width; MI_U32 height; }Rect_t;
-
成员
成员名称 描述 width 模型输入数据的宽 height 模型输入数据的高 -
相关数据类型及接口
3.2 InputAttr_t¶
-
说明
定义分辨率大小和模型类型
-
定义
typedef struct{ MI_U32 width; MI_U32 height; MI_IPU_ELEMENT_FORMAT format; }InputAttr_t;
-
成员
成员名称 描述 width 模型输入数据的宽 height 模型输入数据的高 format 模型输入数据的类型 -
相关数据类型及接口
3.3 Box_t¶
-
说明
算法输出结构体
-
定义
typedef struct { MI_U32 x; MI_U32 y; MI_U32 width; MI_U32 height; MI_U32 class_id; MI_FLOAT score; MI_U64 pts; }Box_t;
-
成员
成员名称 描述 x,y, width, height 检测结果框的位置 class_id 检测结果框的类别ID score 检测结果框的分值 pts 送入检测帧的时间戳 -
相关数据类型及接口
3.4 DetectionInfo_t¶
-
说明
检测算法相关配置项
-
定义
typedef struct { char ipu_firmware_path[MAX_DET_STRLEN]; // ipu_firmware.bin path char model[MAX_DET_STRLEN]; // detect model path MI_FLOAT threshold; // confidence Rect_t disp_size; MI_BOOL had_create_device; // set true to handle ipu device outside algo lib } DetectionInfo_t;
-
成员
成员名称 描述 ipu_firmware_path[MAX_DET_STRLEN] ipu_firmware_path路径 Model[MAX_DET_STRLEN] 模型文件夹路径 threshold 检测阈值(0~1) disp_size 显示码流的分辨率(用于映射检测框位置) had_create_device 设置是否在外层创建和销毁IPU_Device,默认为false,当同时使用多个算法时,可设置为true以避免重复创建或销毁IPU_Device -
相关数据类型及接口
3.5 ALGO_Input_t¶
-
说明
检测算法相关配置项
-
定义
typedef struct { void *p_vir_addr; MI_PHY phy_addr; MI_U32 buf_size; MI_U64 pts; } ALGO_Input_t;
-
成员
成员名称 描述 p_vir_addr 输入buffer的虚拟地址 phy_addr 输入buffer的物理地址 buf_size 输入buffer的长度 pts 输入buffer时间戳 -
相关数据类型及接口
3.6 DetTrackParams_t¶
-
说明
检测算法跟踪配置项
-
定义
typedef struct { MI_BOOL enable; // false MI_BOOL ignore_static_objects; //false MI_FLOAT static_sensitive; //0.85 MI_BOOL stable_bbox; //false MI_FLOAT stable_sensitive; //0.63 MI_S32 ignore_frame_number; //[0-5] ignore the id first number box of detect,default=0 } DetTrackParams_t;
-
成员
成员名称 描述 enable 是否启用跟踪功能,默认值为false,即不启用 ignore_static_objects 忽略静态目标,默认值为false static_sensitive 判断物体运动的灵敏度,取值0.0~1.0,默认值为0.85,取值越大越倾向于保留小幅运动的框 stable_bbox 是否开启稳框,默认值为false,即不开启 stable_sensitive 稳框算法的灵敏度,取值0.0~1.0,默认值为0.85,取值越小稳框效果越强 ignore_frame_number 设置忽略一个目标的检测到的前n帧,用于过滤偶尔闪现的误检,取值0~5 -
相关数据类型及接口
3.7 DetStrictModeParams_t¶
-
说明
strict检测模式参数结构体
-
定义
typedef struct { MI_BOOL enable; // false } DetStrictModeParams_t;
-
成员
成员名称 描述 enable 是否启用strict检测模式,默认值为false,即不启用 -
相关数据类型及接口
3.8 DetectionInfo2_t¶
-
说明
使用模型内存块进行初始化的算法参数结构体
-
定义
typedef struct { void *model_buffer; MI_U32 model_buffer_len; MI_FLOAT threshold; // confidence Rect_t disp_size; MI_BOOL had_create_device; // set true to handle ipu device outside algo lib } DetectionInfo2_t;
-
成员
成员名称 描述 model_buffer 指向模型的内存块指针 model_buffer_len 指向模型的内存块长度 threshold 检测阈值(0~1) disp_size 显示码流的分辨率(用于映射检测框位置) had_create_device 设置是否在外层创建和销毁IPU_Device, 默认为false,当同时使用多个算法时,可设置为true以避免重复创建或销毁IPU_Device -
相关数据类型及接口
4. 枚举类型说明¶
检测枚举类型定义如下:
数据类型 | 定义 |
---|---|
Label_PD_Person_e | 行人检测算法class_id和类别名称的对应 |
Label_FD_Face_e | 人脸检测算法class_id和类别名称的对应 |
Label_PCN_e | 人非车检测算法class_id和类别名称的对应 |
Label_PCD_e | 人宠物检测算法class_id和类别名称的对应 |
Label_FSD_e | 火焰烟雾检测算法class_id和类别名称的对应 |
Label_SD_e | 人+车+宠物+人头+人脸检测算法class_id和类别名称的对应 |
Label_SPD_e | 人+人头+人脸检测算法class_id和类别名称的对应 |
4.1 Label_PD_Person_e¶
-
说明
检测模型类别和class_id的对应关系
-
定义
typedef enum { E_PD_PERSON = 0 } Label_PD_Person_e;
-
成员
成员名称 描述 E_PD_PERSON 行人类别(class_id=0) -
相关数据类型及接口
4.2 Label_FD_Face_e¶
-
说明
人脸检测模型类别和class_id的对应关系
-
定义
typedef enum { E_FD_FACE = 0, } Label_FD_Face_e;
-
成员
成员名称 描述 E_FD_FACE 人脸类别(class_id=0) -
相关数据类型及接口
4.3 Label_PCN_e¶
-
说明
人非车模型类别和class_id的对应关系
-
定义
typedef enum { E_PCN_PERSON = 0, E_PCN_BICYCLE, E_PCN_CAR, E_PCN_MOTOCYCLE, E_PCN_BUS, E_PCN_TRUCK } Label_PCN_e;
-
成员
成员名称 描述 E_PCN_PERSON 行人类别(class_id=0) E_PCN_BICYCLE 自行车类别(class_id=1) E_PCN_CAR 轿车类别(class_id=2) E_PCN_MOTOCYCLE 摩托车类别(class_id=3) E_PCN_BUS 公交车类别(class_id=4) E_PCN_TRUCK 卡车类别(class_id=5) -
相关数据类型及接口
4.4 Label_PCD_e¶
-
说明
定义人宠物检测模型类别和class_id的对应关系
-
定义
typedef enum { E_PCD_PERSON, E_PCD_CAT, E_PCD_DOG } Label_PCD_e;
-
成员
成员名称 | 描述 |
---|---|
E_PCN_PERSON | 行人类别(class_id=0) |
E_PCN_CAT | 猫类别(class_id=1) |
E_PCN_DOG | 狗类别(class_id=2) |
-
相关数据类型及接口
4.5 Label_FSD_e¶
-
说明
定义火焰烟雾检测模型类别和class_id的对应关系
-
定义
typedef enum { E_FSD_FIRE, E_FSD_SMOKE } Label_FSD_e;
-
成员
成员名称 描述 E_FSD_FIRE 火焰类别(class_id=0) E_FSD_SMOKE 烟雾类别(class_id=1)
4.6 Label_SD_e¶
-
说明
定义人+车+宠物+人头+人脸检测模型类别和class_id的对应关系
-
定义
typedef enum { E_SD_PERSON = 0, E_SD_BICYCLE, E_SD_CAR, E_SD_MOTOCYCLE, E_SD_BUS, E_SD_TRUCK, E_SD_CAT, E_SD_DOG, E_SD_HEAD, E_SD_FACE, } LABEL_SD_e;
-
成员
成员名称 描述 E_SD_PERSON 行人类别(class_id=0) E_SD_BICYCLE 自行车类别(class_id=1) E_SD_CAR 轿车类别(class_id=2) E_SD_MOTOCYCLE 摩托车类别(class_id=3) E_SD_BUS 公交车类别(class_id=4) E_SD_TRUCK 卡车类别(class_id=5) E_SD_CAT 猫类别(class_id=6) E_SD_DOG 狗类别(class_id=7) E_SD_HEAD 人头类别(class_id=8) E_SD_FACE 人脸类别(class_id=9) -
相关数据类型及接口
4.7 Label_SPD_e¶
-
说明
定义人+人头+人脸检测模型类别和class_id的对应关系
-
定义
typedef enum { E_SPD_PERSON = 0, E_SPD_HEAD, E_SPD_FACE } LABEL_SPD_e;
-
成员
成员名称 描述 E_SPD_PERSON 行人类别(class_id=0) E_SPD_HEAD 人头类别(class_id=1) E_SPD_FACE 人脸类别(class_id=2) -
相关数据类型及接口
5. 错误码 ¶
错误码 | 数值 | 描述 |
---|---|---|
E_ALGO_SUCCESS | 0 | 操作成功 |
E_ALGO_HANDLE_NULL | 1 | 算法句柄为空 |
E_ALGO_INVALID_PARAM | 2 | 无效的输入参数 |
E_ALGO_DEVICE_FAULT | 3 | 硬件错误 |
E_ALGO_LOADMODEL_FAIL | 4 | 加载模型失败 |
E_ALGO_INIT_FAIL | 5 | 算法初始化失败 |
E_ALGO_NOT_INIT | 6 | 算法尚未初始化 |
E_ALGO_INPUT_DATA_NULL | 7 | 算法输入数据为空 |
E_ALGO_INVALID_INPUT_SIZE | 8 | 无效的算法输入数据维度 |
E_ALGO_INVALID_LICENSE | 9 | 无效的license许可 |
E_ALGO_MEMORY_OUT | 10 | 内存不足 |
E_ALGO_FILEIO_ERROR | 11 | 文件读写操作错误 |
E_ALGO_INVALID_OUTPUT_SIZE | 12 | 无效的算法输出数据维度 |