Page 1 of 1

【技术干货】tuyaos-ipc-OS_6.0 AI detect对接指南

Posted: 2023年 Apr 21日 11:07
by 0x1abin

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);