1. 结构体
1.1 单个AI算法结果
算法结果表示某个算法有没有检测到对应的内容,包含两个参数:算法id和算法结果
例如移动侦测的id为0。 检测到移动,positive为1;未检测到,positive为0
Code: Select all
/**
* @brief AI algorithms result.
*/
typedef struct
{
INT_T alg_id;
BOOL_T positive;
}ALG_RET_T;
1.2 多个算法结果
用于表示某个图片进行的检测及结果。
其中ret_cnt表示后面的rets数组的大小。每个rets数组的元素对应一个算法及结果。
Code: Select all
typedef struct
{
INT_T ret_cnt;
ALG_RET_T rets[0];
}AI_DETECT_RETS_T;
1.3 AI算法描述
包含对应id和字符串名称,例如移动侦测的id为0, 名称为ipc_motion
Code: Select all
typedef struct {
INT_T id;
CHAR_T name[AI_ALG_NAME_LEN];
}AI_ALG_T;
1.4 多个AI算法的描述
用于sdk向固件传递云端的ai算法,其中cnt为算法数量,也是ai_alg数组的大小。
Code: Select all
typedef struct {
INT_T cnt;
AI_ALG_T ai_alg[0];
}AI_ALG_INFO_T;
2. 回调
2.1 支持的算法更新回调
当SDK从云端获取到云端的ai检测订单后,会将云端对应的检测订单发给固件层。
Code: Select all
/**
* @brief callback to update alg algorithms from cloud service.
*/
typedef VOID (*AI_ALG_UPDATE_CB)(AI_ALG_INFO_T *ai_alg_infos);
2.2 获取图片的回调
SDK需要从固件端获取到图片和对应的检测算法结果。
ON_PIC_FREE的回调函数是SDK调用free资源使用,固件层根据自己的需要来实现。
AI_DETECT_GET_AI_PIC_CB从固件层获取图片资源,其中pic_buf为固件层提供,长度放在len的指针地址中;本地AI算法的检测结果,申请AI_DETECT_RETS_T的空间存放,并将地址传递给SDK。SDK在使用完图片后,会调用ON_PIC_FREE回调,触发固件层释放pic_buf和ai_rets_info的空间。
Code: Select all
/**
* @brief free callback when tuya free the pic.
*
*/
typedef VOID (*ON_PIC_FREE)(UCHAR_T **pic_buf, AI_DETECT_RETS_T **ai_rets_info);
/**
* @brief get pic with ai alg results.
*
*/
typedef OPERATE_RET (*AI_DETECT_GET_AI_PIC_CB)(UCHAR_T **pic_buf, INT_T *len, AI_DETECT_RETS_T **ai_rets_info, ON_PIC_FREE *on_free);
2.3 云端检测结果回调
每张图片在云端检测结束后,SDK会调用AI_DETECT_RET_CB,将检测的结果通知给固件层。为方便外部做事件管理,每次回调都会携带一个session id,session id在一次完成的ai检测 start和stop中间唯一。
Code: Select all
/**
* @brief callback to get ai detect results from cloud service.
*
*/
typedef VOID (*AI_DETECT_RET_CB)(AI_DETECT_RETS_T *ai_rets_info, CHAR_T* session_id);
具体实现参考以下代码:
Code: Select all
VOID __on_detect_rets(AI_DETECT_RETS_T *ai_rets_info, CHAR_T *session_id)
{
printf("get ret from cloud\n");
if(ai_rets_info == NULL) {
return;
}
printf("sesion[%s] total:%d\n",session_id, ai_rets_info->ret_cnt);
int i;
for(i=0; i<ai_rets_info->ret_cnt; i++){
printf("[%d][%d]\n", ai_rets_info->rets[i].alg_id, ai_rets_info->rets[i].positive);
}
return;
}
3. 初始化
在mqtt上线后,可以调用初始化接口,接口形式如下:
Code: Select all
/**
* @brief Init ai detect function
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_init(AI_ALG_UPDATE_CB update_cb, AI_DETECT_GET_AI_PIC_CB get_pic_cb, AI_DETECT_RET_CB ret_cb);
4. 退出模块
调用以下接口来退出模块,此接口仅设置退出标志,主线程检测到标志后,退出自动回收。
Code: Select all
/**
* @brief Exit ai detect function
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_exit(VOID);
5. 开始检测
当业务方判断需要云端检测时(例如有移动发生),调用以下接口来触发AI检测
Code: Select all
/**
* @brief When the motion started, use this api to start ai detect,
* to check is there any body or face in the pic.
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_start(VOID);
6. 结束检测
当业务方需要停止云端检测时,调用以下接口来停止
Code: Select all
/**
* @brief When the motion stopped, use this api to stop detect
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_stop(VOID);
7. 暂停和恢复检测
在进入隐私模式或者退出隐私模式时,使用以下接口来暂停和恢复服务
Code: Select all
/**
* @brief IN sleep mode or don't want to detect the pic, use this api to pause
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_pause(VOID);
/**
* @brief use api to resume ai detect
*
* @param VOID
*
* @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
*/
OPERATE_RET tuya_ipc_ai_detect_resume(VOID);