跨模态分割算法
REVISION HISTORY¶
Revision No. | Description | Date |
---|---|---|
1.0 | First version | 11/01/2023 |
1. 算法说明¶
跨模态分割算法(Open Vocabulary Segmentation,简称OvSeg),可以根据文本提示搜索得到图像中的对应目标,并输出目标在图像中所处的mask区域,具备开放域目标的检测和分割能力。
2. API参考¶
该功能模块提供以下API:
API名称 | 功能 |
---|---|
ALGO_OVSEG_CreateHandle | 创建句柄 |
ALGO_OVSEG_InitHandle | 初始化句柄 |
ALGO_OVSEG_GetInputAttr | 获取模型的属性信息 |
ALGO_OVSEG_SetThreshold | 设置阈值 |
ALGO_OVSEG_RunDet | 运行检测算法 |
ALGO_OVSEG_RunSeg | 运行分割算法 |
ALGO_OVSEG_DeinitHandle | 终止算法 |
ALGO_OVSEG_ReleaseHandle | 释放句柄 |
2.1 ALGO_OVSEG_CreateHandle¶
-
功能
创建句柄
-
语法
MI_S32 ALGO_OVSEG_CreateHandle(void **handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.2 ALGO_OVSEG_InitHandle¶
-
功能
初始化句柄
-
语法
MI_S32 ALGO_OVSEG_InitHandle(void *handle, OvSegInitInfo_t *init_info);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 init_info 检测算法配置项,详见OvSegInitInfo_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.3 ALGO_OVSEG_GetInputAttr¶
-
功能
获取模型的属性信息,包括模型输入分辨率以及输入数据的类型
-
语法
MI_S32 ALGO_OVSEG_GetInputAttr(void *handle, OvSegInputAttr_t *input_attr);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 input_attr 保存属性信息指针,详见OvSegInputAttr_t 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.4 ALGO_OVSEG_SetThreshold¶
-
功能
设置检测阈值
-
语法
MI_S32 ALGO_OVSEG_SetThreshold(void *handle, OvSegThreshold_t threshold);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 threshold 阈值 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.5 ALGO_OVSEG_RunDet¶
-
功能
运行检测算法,得到目标框(目前仅输出超过阈值并且分值最高的一个框)
-
语法
MI_S32 ALGO_OVSEG_RunDet(void* handle, const OvSegAlgo_Input_t *img_input, char* text, OvSegBox_t *bboxes, MI_S16* num_boxes);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 img_input 输入图像的buffer信息 输入 text 输入希望检测到的目标的文本 输入 bboxes 用于保存检测结果框的数组 输入 num_bboxes 用于保存检测结果框个数的指针 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.6 ALGO_OVSEG_RunSeg¶
-
功能
运行分割算法,得到检测目标的分割mask
-
语法
MI_S32 ALGO_OVSEG_RunSeg(void* handle, const OvSegAlgo_Input_t *img_input, const OvSegBox_t *in_box, MI_U8* out_mask, MI_S16 out_mask_w, MI_S16 out_mask_h, MI_S16 out_mask_stride);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 img_input 输入图像的buffer信息 输入 in_box 输入检测得到的目标框 输入 out_mask 输出分割结果的mask指针 输出 out_mask_w 输出分割结果的mask的宽度 输出 out_mask_h 输出分割结果的mask的高度 输出 out_mask_h 输出分割结果的mask每一行的字节数(用于适应存在内存对齐的情况) 输出 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.7 ALGO_OVSEG_DeinitHandle¶
-
功能
停止算法
-
语法
MI_S32 ALGO_OVSEG_DeinitHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
2.8 ALGO_OVSEG_ReleaseHandle¶
-
功能
释放句柄占用资源
-
语法
MI_S32 ALGO_OVSEG_ReleaseHandle(void *handle);
-
形参
参数名称 描述 输入/输出 handle 句柄 输入 -
返回值
返回值 描述 0 成功 其它 失败(详见错误码) -
依赖
- 头文件:sstar_ovseg_api.h
- 库文件:libsstaralgo_ovseg.a
3. 数据类型¶
检测相关结构体定义如下:
数据类型 | 定义 |
---|---|
OvSegInitInfo_t | 算法初始化参数结构体 |
OvSegInputAttr_t | 算法输入图像buffer结构体 |
OvSegThreshold_t | 算法输入阈值结构体 |
OvSegBox_t | 算法输出框结构体 |
OvSegAlgo_Input_t | 算法输入图像数据信息 |
3.1 OvSegInitInfo_t¶
-
说明
算法初始化参数结构体
-
定义
typedef struct { char ipu_firmware_path[OVSEG_MAX_STRLEN]; char det_model_path[OVSEG_MAX_STRLEN]; char seg_model_path[OVSEG_MAX_STRLEN]; char vocab_path[OVSEG_MAX_STRLEN]; }OvSegInitInfo_t;
-
成员
成员名称 描述 ipu_firmware_path[MAX_OVSEG_STRLEN] ipu_firmware_path路径 det_model_path[MAX_OVSEG_STRLEN] 检测模型文件路径 seg_model_path[MAX_OVSEG_STRLEN] 分割模型文件路径 vocab_path 词表文件路径 -
相关数据类型及接口
3.2 OvSegInputAttr_t¶
-
说明
定义分辨率大小和模型输入像素类型
-
定义
typedef struct{ MI_U32 width; MI_U32 height; MI_IPU_ELEMENT_FORMAT format; }OvSegInputAttr_t;
-
成员
成员名称 描述 width 模型输入数据的宽 height 模型输入数据的高 format 模型输入数据的类型 -
相关数据类型及接口
3.3 OvSegThreshold_t¶
-
说明
定义模型的阈值
-
定义
typedef struct { MI_FLOAT det_threshold; MI_FLOAT seg_threshold; }OvSegThreshold_t;
-
成员
成员名称 描述 det_threshold 检测模型的阈值 seg_threshold 分割模型的阈值 -
相关数据类型及接口
3.4 OvSegBox_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.5 OvSegAlgo_Input_t¶
-
说明
检测/分割算法的输入buffer数据结构
-
定义
typedef struct { void *p_vir_addr; MI_PHY phy_addr; MI_U32 buf_size; MI_U64 pts; }OvSegAlgo_Input_t;
-
成员
成员名称 描述 p_vir_addr 输入buffer的虚拟地址 phy_addr 输入buffer的物理地址 buf_size 输入buffer的长度 pts 输入buffer时间戳 -
相关数据类型及接口
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 | 无效的算法输出数据维度 |