bmcv_feature_match

该接口用于将网络得到特征点(int8格式)与数据库中特征点(int8格式)进行比对,输出最佳匹配的top-k。

接口形式:

bm_status_t bmcv_feature_match(
    bm_handle_t     handle,
    bm_device_mem_t input_data_global_addr,
    bm_device_mem_t db_data_global_addr,
    bm_device_mem_t output_sorted_similarity_global_addr,
    bm_device_mem_t output_sorted_index_global_addr,
    int             batch_size,
    int             feature_size,
    int             db_size,
    int             sort_cnt = 1,
    int             rshiftbits = 0);

输入参数说明:

  • bm_handle_t handle

输入参数。bm_handle 句柄。

  • bm_device_mem_t input_data_global_addr

输入参数。所要比对的特征点数据存储的地址。该数据按照 batch_size * feature_size 的数据格式进行排列。batch_size,feature _size 具体含义将在下面进行介绍。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • bm_device_mem_t db_data_global_addr

输入参数。数据库的特征点数据存储的地址。该数据按照 feature_size * db_size 的数据格式进行排列。feature_size,db_size 具体含义将在下面进行介绍。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • bm_device_mem_t output_sorted_similarity_global_addr

输出参数。每个batch得到的比对结果的值中最大几个值(降序排列)存储地址,具体取多少个值由sort_cnt决定。该数据按照 batch_size * sort_cnt 的数据格式进行排列。batch_size 具体含义将在下面进行介绍。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • bm_device_mem_t output_sorted_index_global_addr

输出参数。每个batch得到的比对结果的在数据库中的序号的存储地址。如对于 batch 0 ,如果 output_sorted_similarity_global_addr 中 bacth 0 的数据是由输入数据与数据库的第800组特征点进行比对得到的,那么 output_sorted_index_global_addr 所在地址对应 batch 0 的数据为800. output_sorted_similarity_global_addr 中的数据按照 batch_size * sort_cnt 的数据格式进行排列。batch_size 具体含义将在下面进行介绍。bm_device_mem_t 为内置表示地址的数据类型,可以使用函数 bm_mem_from_system(addr) 将普通用户使用的指针或地址转为该类型,用户可参考示例代码中的使用方式。

  • int batch_size

输入参数。待输入数据的 batch 个数,如输入数据有4组特征点,则该数据的 batch_size 为4。batch_size最大值不应超过8。

  • int feature_size

输入参数。每组数据的特征点个数。feature_size最大值不应该超过4096。

  • int db_size

输入参数。数据库中数据特征点的组数。db_size最大值不应该超过500000。

  • int sort_cnt

输入参数。每个 batch 对比结果中所要排序个数,也就是输出结果个数,如需要最大的3个比对结果,则sort_cnt设置为3。该值默认为1。sort_cnt最大值不应该超过30。

  • int rshiftbits

输入参数。对结果进行右移处理的位数,右移采用round对小数进行取整处理。该参数默认为0。

返回值说明:

  • BM_SUCCESS: 成功

  • 其他:失败

注意事项:

1、输入数据和数据库中数据的数据类型为 char。

2、输出的比对结果数据类型为 short,输出的序号类型为 int。

3、数据库中的数据在内存的排布为 feature_size * db_size,因此需要将一组特征点进行转置之后再放入数据库中。

4、sort_cnt的取值范围为 1 ~ 30。

示例代码

int batch_size = 4;
int feature_size = 512;
int db_size = 1000;
int sort_cnt = 1;
unsigned char src_data_p[4 * 512];
unsigned char db_data_p[512 * 1000];
short output_val[4];
int output_index[4];
for (int i = 0; i < 4 * 512; i++) {
    src_data_p[i] = rand() % 1000;
}
for (int i = 0; i < 512 * 1000; i++) {
    db_data_p[i] = rand() % 1000;
}
bmcv_feature_match(handle,
    bm_mem_from_system(src_data_p),
    bm_mem_from_system(db_data_p),
    bm_mem_from_system(output_val),
    bm_mem_from_system(output_index),
    batch_size,
    feature_size,
    db_size,
    sort_cnt, 8);