使用Vision SDK张量运算功能,给定已赋值的输入张量并给输出张量分配好内存,调用张量运算接口执行相应运算并将计算结果值赋给输出张量。
相关接口说明请参考TensorOperations。
调用张量运算接口前,先创建好输入、输出张量,并分配好内存,同时,输入张量需要赋值。
输入输出数据类型必须保持一致。
对于四则运算和位运算,需保持输入、输出张量形状完全一致;对于张量转置、旋转、通道拆分、通道合并、裁剪和扩展接口,输入输出张量形状遵循相应的计算规范。
具体接口功能请参见“TensorOperations”章节。
以Add为例,张量运算调用流程参考如下:
关键步骤说明如下:
以下为以张量加法接口为例的功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
//初始化 MxBase::MxInit(); { // 1. 张量初始化 // 1.1 用户创建输入张量的数据 uint8_t input1[1][3][16][16]; uint8_t input2[1][3][16][16]; for (int i = 0; i < 1; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 16; k++) { for (int l = 0; l < 16; l++) { input1[i][j][k][l] = 8; input2[i][j][k][l] = 2; } } } } // 1.2 用户指定张量形状 std::vector<uint32_t> shape{1, 3, 16, 16}; // 1.3 用户创建输入输出张量对象 MxBase::Tensor tensor1(&input1[0][0][0][0], shape, MxBase::TensorDType::UINT8); MxBase::Tensor tensor2(&input2[0][0][0][0], shape, MxBase::TensorDType::UINT8); MxBase::Tensor tensor3(shape, MxBase::TensorDType::UINT8); tensor3.Malloc(); tensor1.ToDevice(device_id); tensor2.ToDevice(device_id); tensor3.ToDevice(device_id); // 2. 调用算子接口,tensor3即为算子计算输出结果 APP_ERROR ret = MxBase::Add(tensor1, tensor2, tensor3) } //去初始化 MxBase::MxDeInit(); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//初始化 MxBase::MxInit(); { // 1. 创建流及线程注册 // 1.1 创建流 MxBase::AscendStream stream = AscendStream(deviceId); // 1.2 流的线程注册 stream.CreateAscendStream(); // 2. 张量初始化 // 2.1 用户创建输入张量的数据 uint8_t input1[1][3][16][16]; uint8_t input2[1][3][16][16]; for (int i = 0; i < 1; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 16; k++) { for (int l = 0; l < 16; l++) { input1[i][j][k][l] = 8; input2[i][j][k][l] = 2; } } } } // 2.2 用户指定张量形状 std::vector<uint32_t> shape{1, 3, 16, 16}; // 2.3 用户创建输入输出张量对象 MxBase::Tensor tensor1(&input1[0][0][0][0], shape, MxBase::TensorDType::UINT8); MxBase::Tensor tensor2(&input2[0][0][0][0], shape, MxBase::TensorDType::UINT8); MxBase::Tensor tensor3(shape, MxBase::TensorDType::UINT8); tensor3.Malloc(); tensor1.ToDevice(device_id); tensor2.ToDevice(device_id); tensor3.ToDevice(device_id); // 3. 调用算子接口,tensor3即为算子计算输出结果 APP_ERROR ret = MxBase::Add(tensor1, tensor2, tensor3, stream) // 4. 流的同步,获取计算结果 stream.Synchronize(); // 5. 流的销毁 stream.DestroyAscendStream(); } //去初始化 MxBase::MxDeInit(); |