本章节讲解如何上手物体分类
示例代码的关键业务流程与二次开发所需的关键接口,由于本示例使用 resnet18 演示了对 CSK6 NPU 的使用,也可以参考它实现其它模型的推理。
物体分类示例包含在 语音视觉多功能开发板 SDK 的 apps/thinker_service
目录下,工程目录名称为 resnet18
。
本示例基于开源项目进行移植适配,仅用于 CV 能力的验证与评估,不代表适用于商用项目。
thinker_service_gcs_init (初始化服务)
↓
thinker_service_gcs_start (载入模型并申请资源)
↓
循环 {
thinker_service_gcs_forward (向引擎传入数据,推理,并得到结果)
}
↓
thinker_service_gcs_stop (释放资源、卸载模型)
↓
thinker_service_gcs_deinit (逆初始化服务)
模型文件位于 resources/images/model.bin
,它是使用 Linger 导出的。你可以将它替换为你自己的模型。替换后,你还需要修改 boards/csk6_duomotai_devkit.overlay
中定义的模型文件长度(字节数):
res_thinker_model_partition: partition@300000 {
label = "thinker_model";
reg = <0x00300000 2932416>; /* 2932416 是模型的长度(字节) */
};
在调用 thinker_service_gcs_start()
后,模型会在 CP 侧被自动载入到 Thinker 引擎。
服务的标准输入和输出数据类型为 tData
。服务提供了一个 thinker_service_gcs_forward(inputs, input_cnt, *outputs, *output_cnt)
接口,可以传入一个或同时传入多个 input,等待引擎推理,并返回一个或多个 output。
tData input;
input.dtype_ = Int8;
input.scale_ = 6;
input.shape_.ndim_ = 4;
input.shape_.dims_[0] = 1;
input.shape_.dims_[1] = INPUT_CHANNELS;
input.shape_.dims_[2] = INPUT_WIDTH;
input.shape_.dims_[3] = INPUT_HEIGHT;
input.dptr_ = my_features;
uint32_t input_cnt = 1;
tData *output;
uint32_t output_cnt;
thinker_service_gcs_forward(&input, input_cnt, &output, &output_cnt);
// output_cnt 会被赋值为模型的 output 数,output 即为该次推理的结果