检测算法¶
REVISION HISTORY¶
| Revision No. | Description | Date |
|---|---|---|
| 1.0 | First version | 04/25/2023 |
| 1.1 | Second version | 10/30/2023 |
| 3.0 | Third version | 04/11/2024 |
| 3.1 | Remove deprecated models introduction | 10/31/2024 |
| 3.2 | Add ALGO_DET_SortResult API | 12/03/2024 |
| 3.3 | Adjust models description | 12/06/2024 |
1. 概述¶
1.1. 算法说明¶
主要检测算法的检测类别说明如下:
| 模型 | 功能 | 输入维度(w*h) | 输入格式 |
|---|---|---|---|
| sbdy36.img | 包裹检测(小),输出的类别共1类,分别为包裹(class_id=0) | 640*352 | yuvsp420_nv12 |
| sbdy36l.img | 包裹检测(大),输出的类别共1类,分别为包裹(class_id=0) | 640*352 | yuvsp420_nv12 |
| sbdy48.img | 包裹检测(小),输出的类别共1类,分别为包裹(class_id=0) | 800*480 | yuvsp420_nv12 |
| sbdy48l.img | 包裹检测(大),输出的类别共1类,分别为包裹(class_id=0) | 800*480 | yuvsp420_nv12 |
| sdy36.img | 人+车+宠物+人头+人脸检测(小),输出的类别共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) | 640*352 | yuvsp420_nv12 |
| sdy36l.img | 人+车+宠物+人头+人脸检测(大) ,输出的类别共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) | 640*352 | yuvsp420_nv12 |
| sdy48.img | 人+车+宠物+人头+人脸检测(小) ,输出的类别共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) | 800*480 | yuvsp420_nv12 |
| sdy48l.img | 人+车+宠物+人头+人脸检测(大),输出的类别共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) | 800*480 | yuvsp420_nv12 |
| sfsdy36.img | 火焰烟雾检测,输出的类别共2类,分别为火焰(class_id=0)、烟雾(class_id=1) | 640*352 | yuvsp420_nv12 |
| sfsdy48.img | 火焰烟雾检测,输出的类别共2类,分别为火焰(class_id=0)、烟雾(class_id=1) | 800*480 | yuvsp420_nv12 |
| spdy36.img | 人+人头+人脸检测(小),输出的类别共3类,分别为行人(class_id=0)、人头(class_id=1)、人脸(class_id=2) | 640*352 | yuvsp420_nv12 |
| spdy36l.img | 人+人头+人脸检测(大),输出的类别共3类,分别为行人(class_id=0)、人头(class_id=1)、人脸(class_id=2) | 640*352 | yuvsp420_nv12 |
| spdy48.img | 人+人头+人脸检测(小),输出的类别共3类,分别为行人(class_id=0)、人头(class_id=1)、人脸(class_id=2) | 800*480 | yuvsp420_nv12 |
| spdy48l.img | 人+人头+人脸检测(大),输出的类别共3类,分别为行人(class_id=0)、人头(class_id=1)、人脸(class_id=2) | 800*480 | yuvsp420_nv12 |
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 | 设置严格检测模式参数 |
| ALGO_DET_InitHandle2 | 使用模型内存块指针进行算法初始化 |
| ALGO_DET_SortResult | 对检测结果进行排序 |
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
2.13. ALGO_DET_SortResult¶
-
功能
对检测结果进行排序
-
语法
MI_S32 ALGO_DET_SortResult(void *handle, const Sort_Input_t *sort_input, Box_t bboxes[MAX_DET_OBJECT], MI_S32 *num_bboxes); -
形参
参数名称 描述 输入/输出 handle 句柄 输入 sort_input 排序输入结构体 输入 bboxes 用于保存排序结果框的数组 输入 num_bboxes 用于保存排序结果框个数的指针 输入 -
返回值
返回值 描述 0 成功。注意:该接口会修改输入bboxes 和 num_bboxes 其它 失败(详见错误码) -
依赖
- 头文件: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 | 使用模型内存块进行初始化的算法参数结构体 |
| Sort_Input_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 -
相关数据类型及接口
3.9 Sort_Input_t¶
-
说明
检测算法相关配置项
-
定义
typedef struct { MI_S32 class_indexs[MAX_DET_CLASSES]; MI_S32 class_num; SORT_TYPE_e sort_type; }Sort_Input_t; -
成员
成员名称 描述 class_indexs 需要排序的类别索引 class_num 需要排序的类别数目 sort_type 排序方法类型 -
相关数据类型及接口
4. 枚举类型说明¶
检测枚举类型定义如下:
| 数据类型 | 定义 |
|---|---|
| Label_FD_Face_e | 人脸检测算法class_id和类别名称的对应 |
| Label_FSD_e | 烟火检测算法class_id和类别名称的对应 |
| Label_SD_e | 人+车+宠物+人头+人脸检测算法class_id和类别名称的对应 |
| Label_SPD_e | 人+人头+人脸检测算法class_id和类别名称的对应 |
| Label_BD_e | 包裹检测算法class_id和类别名称的对应 |
| Label_S12D_e | 人+车+宠物+人头/脸+牛羊检测算法class_id和类别名称的对应 |
| Label_COWSHEEP_e | 牛羊检测算法class_id和类别名称的对应 |
| Label_HOMEWORK_e | 做作业/玩手机检测算法class_id和类别名称的对应 |
4.1 Label_FD_Face_e¶
-
说明
人脸检测模型类别和class_id的对应关系
-
定义
typedef enum { E_FD_FACE = 0, }Label_FD_Face_e; -
成员
成员名称 描述 E_FD_FACE 人脸类别(class_id=0) -
相关数据类型及接口
4.2 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.3 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.4 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) -
相关数据类型及接口
4.5 Label_BD_e¶
-
说明
定义包裹检测模型类别和class_id的对应关系
-
定义
typedef enum { E_BD_BAG = 0, }LABEL_BD_e; -
成员
成员名称 描述 E_BD_BAG 包裹类别(class_id=0) -
相关数据类型及接口
4.6 Label_S12D_e¶
-
说明
定义人+车+宠物+人头/脸+牛羊检测模型类别和class_id的对应关系
-
定义
typedef enum { E_S12D_PERSON = 0, E_S12D_BICYCLE, E_S12D_CAR, E_S12D_MOTOCYCLE, E_S12D_BUS, E_S12D_TRUCK, E_S12D_CAT, E_S12D_DOG, E_S12D_HEAD, E_S12D_FACE, E_S12D_COW, E_S12D_SHEEP, } LABEL_S12D_e; -
成员
成员名称 描述 E_S12D_PERSON 行人类别(class_id=0) E_S12D_BICYCLE 自行车类别(class_id=1) E_S12D_CAR 轿车类别(class_id=2) E_S12D_MOTOCYCLE 摩托车类别(class_id=3) E_S12D_BUS 公交车类别(class_id=4) E_S12D_TRUCK 卡车类别(class_id=5) E_S12D_CAT 猫类别(class_id=6) E_S12D_DOG 狗类别(class_id=7) E_S12D_HEAD 人头类别(class_id=8) E_S12D_FACE 人脸类别(class_id=9) E_S12D_COW 牛类别(class_id=10) E_S12D_SHEEP 羊类别(class_id=11) -
相关数据类型及接口
4.7 Label_COWSHEEP_e¶
-
说明
定义牛羊检测模型类别和class_id的对应关系
-
定义
typedef enum { E_COWSHEEP_COW = 0, E_COWSHEEP_SHEEP, } LABEL_COWSHEEP_e; -
成员
成员名称 描述 E_COWSHEEP_COW 牛类别(class_id=0) E_COWSHEEP_SHEEP 羊类别(class_id=1) -
相关数据类型及接口
4.8 Label_HOMEWORK_e¶
-
说明
定义做作业/玩手机类别和class_id的对应关系
-
定义
typedef enum { E_HOMEWORK_READ= 0, E_HOMEWORK_WRITE, E_HOMEWORK_PHONE } LABEL_HOMEWORK_e; -
成员
成员名称 描述 E_HOMEWORK_READ 读书类别(class_id=0) E_HOMEWORK_WRITE 写字类别(class_id=1) E_HOMEWORK_PHONE 玩手机类别(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 | 无效的算法输出数据维度 |
| E_ALGO_INVALID_DECODE_MODE | 13 | 无效的解码模式 |
| E_ALGO_MODEL_INVOKE_ERROR | 14 | 模型invoke错误 |