1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <thread>
17 #include <random>
18 #include <inttypes.h>
19 #include <securec.h>
20 #include "ohos_common.h"
21 #include "gtest/gtest.h"
22 #include "include/c_api/context_c.h"
23 #include "include/c_api/model_c.h"
24 #include "include/c_api/types_c.h"
25 #include "include/c_api/status_c.h"
26 #include "include/c_api/data_type_c.h"
27 #include "include/c_api/tensor_c.h"
28 #include "include/c_api/format_c.h"
29
30 using namespace testing::ext;
31
32 class MSLiteTest: public testing::Test {
33 protected:
SetUpTestCase(void)34 static void SetUpTestCase(void) {}
TearDownTestCase(void)35 static void TearDownTestCase(void) {}
SetUp()36 virtual void SetUp() {}
TearDown()37 virtual void TearDown() {}
38 };
39
40 // function before callback
PrintBeforeCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)41 bool PrintBeforeCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
42 const OH_AI_CallBackParam kernel_Info) {
43 std::cout << "Before forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
44 return true;
45 }
46
47 // function after callback
PrintAfterCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)48 bool PrintAfterCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
49 const OH_AI_CallBackParam kernel_Info) {
50 std::cout << "After forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
51 return true;
52 }
53
54 // add cpu device info
AddContextDeviceCPU(OH_AI_ContextHandle context)55 void AddContextDeviceCPU(OH_AI_ContextHandle context) {
56 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
57 ASSERT_NE(cpu_device_info, nullptr);
58 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
59 printf("==========device_type:%d\n", device_type);
60 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
61 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
62 }
63
IsNNRTAvailable()64 bool IsNNRTAvailable() {
65 size_t num = 0;
66 auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
67 if (desc == nullptr) {
68 return false;
69 }
70 auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
71 if (type != 1) {
72 return false;
73 }
74 OH_AI_DestroyAllNNRTDeviceDescs(&desc);
75 return true;
76 }
77
IsNPU()78 bool IsNPU() {
79 size_t num = 0;
80 auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
81 if (desc == nullptr) {
82 return false;
83 }
84 auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
85 const std::string npu_name_prefix = "NPU_";
86 if (strncmp(npu_name_prefix.c_str(), name, npu_name_prefix.size()) != 0) {
87 return false;
88 }
89 return true;
90 }
91
92 // add nnrt device info
AddContextDeviceNNRT(OH_AI_ContextHandle context)93 void AddContextDeviceNNRT(OH_AI_ContextHandle context) {
94 size_t num = 0;
95 auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
96 if (desc == nullptr) {
97 return;
98 }
99
100 std::cout << "found " << num << " nnrt devices" << std::endl;
101 auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
102 auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
103 auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
104 std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
105
106 OH_AI_DeviceInfoHandle nnrt_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_NNRT);
107 ASSERT_NE(nnrt_device_info, nullptr);
108 OH_AI_DeviceInfoSetDeviceId(nnrt_device_info, id);
109 OH_AI_DestroyAllNNRTDeviceDescs(&desc);
110
111 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
112 printf("==========device_type:%d\n", device_type);
113 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
114
115 OH_AI_DeviceInfoSetPerformanceMode(nnrt_device_info, OH_AI_PERFORMANCE_MEDIUM);
116 ASSERT_EQ(OH_AI_DeviceInfoGetPerformanceMode(nnrt_device_info), OH_AI_PERFORMANCE_MEDIUM);
117 OH_AI_DeviceInfoSetPriority(nnrt_device_info, OH_AI_PRIORITY_MEDIUM);
118 ASSERT_EQ(OH_AI_DeviceInfoGetPriority(nnrt_device_info), OH_AI_PRIORITY_MEDIUM);
119
120 OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
121 }
122
123 // add nnrt device info by type
AddContextDeviceNNRTByType(OH_AI_ContextHandle context)124 void AddContextDeviceNNRTByType(OH_AI_ContextHandle context) {
125 size_t num = 0;
126 auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
127 // 返回值desc是NNRTDeviceDesc结构体数组首地址
128 if (desc == nullptr) {
129 return;
130 }
131 // 目前nnrt仅提供了rk3568的驱动,只有cpu一个设备,故不用判断
132 std::cout << "found " << num << " nnrt devices" << std::endl;
133 auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
134 auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
135 auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
136 std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
137
138 auto nnrt_device_info = OH_AI_CreateNNRTDeviceInfoByType(type);
139 OH_AI_DestroyAllNNRTDeviceDescs(&desc);
140 ASSERT_NE(nnrt_device_info, nullptr);
141
142 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
143 printf("==========device_type:%d\n", device_type);
144 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
145 ASSERT_EQ(OH_AI_DeviceInfoGetDeviceId(nnrt_device_info), id);
146
147 OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
148 }
149
150 // add nnrt device info by name
AddContextDeviceNNRTByName(OH_AI_ContextHandle context)151 void AddContextDeviceNNRTByName(OH_AI_ContextHandle context) {
152 size_t num = 0;
153 auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
154 // 返回值desc是NNRTDeviceDesc结构体数组首地址
155 if (desc == nullptr) {
156 return;
157 }
158 // 目前nnrt仅提供了rk3568的驱动,只有cpu一个设备,故不用判断
159 std::cout << "found " << num << " nnrt devices" << std::endl;
160 auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
161 auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
162 auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
163 std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
164
165 auto nnrt_device_info = OH_AI_CreateNNRTDeviceInfoByName(name);
166 OH_AI_DestroyAllNNRTDeviceDescs(&desc);
167 ASSERT_NE(nnrt_device_info, nullptr);
168
169 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
170 printf("==========device_type:%d\n", device_type);
171 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
172 ASSERT_EQ(OH_AI_DeviceInfoGetDeviceId(nnrt_device_info), id);
173
174 OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
175 }
176
177 // fill data to inputs tensor
FillInputsData(OH_AI_TensorHandleArray inputs,string model_name,bool is_transpose)178 void FillInputsData(OH_AI_TensorHandleArray inputs, string model_name, bool is_transpose) {
179 for (size_t i = 0; i < inputs.handle_num; ++i) {
180 printf("==========ReadFile==========\n");
181 size_t size1;
182 size_t *ptr_size1 = &size1;
183 string input_data_path = "/data/test/" + model_name + "_" + std::to_string(i) + ".input";
184 const char *imagePath = input_data_path.c_str();
185 char *imageBuf = ReadFile(imagePath, ptr_size1);
186 ASSERT_NE(imageBuf, nullptr);
187 OH_AI_TensorHandle tensor = inputs.handle_list[i];
188 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
189 printf("Tensor name: %s. \n", OH_AI_TensorGetName(tensor));
190 float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(inputs.handle_list[i]));
191 ASSERT_NE(input_data, nullptr);
192 if (is_transpose) {
193 printf("==========Transpose==========\n");
194 size_t shape_num;
195 const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
196 auto imageBuf_nhwc = new char[size1];
197 PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
198 memcpy_s(input_data, size1, imageBuf_nhwc, size1);
199 delete[] imageBuf_nhwc;
200 } else {
201 memcpy_s(input_data, size1, imageBuf, size1);
202 }
203 printf("input data after filling is: ");
204 for (int j = 0; j < element_num && j <= 20; ++j) {
205 printf("%f ", input_data[j]);
206 }
207 printf("\n");
208 delete[] imageBuf;
209 }
210 }
211
212 // compare result after predict
CompareResult(OH_AI_TensorHandleArray outputs,string model_name,float atol=0.01,float rtol=0.01)213 void CompareResult(OH_AI_TensorHandleArray outputs, string model_name, float atol = 0.01, float rtol = 0.01) {
214 printf("==========GetOutput==========\n");
215 for (size_t i = 0; i < outputs.handle_num; ++i) {
216 OH_AI_TensorHandle tensor = outputs.handle_list[i];
217 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
218 printf("Tensor name: %s .\n", OH_AI_TensorGetName(tensor));
219 float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
220 printf("output data is:");
221 for (int j = 0; j < element_num && j <= 20; ++j) {
222 printf("%f ", output_data[j]);
223 }
224 printf("\n");
225 printf("==========compFp32WithTData==========\n");
226 string output_file = "/data/test/" + model_name + std::to_string(i) + ".output";
227 bool result = compFp32WithTData(output_data, output_file, atol, rtol, false);
228 EXPECT_EQ(result, true);
229 }
230 }
231
232 // model build and predict
ModelPredict(OH_AI_ModelHandle model,OH_AI_ContextHandle context,string model_name,OH_AI_ShapeInfo shape_infos,bool build_by_graph,bool is_transpose,bool is_callback)233 void ModelPredict(OH_AI_ModelHandle model, OH_AI_ContextHandle context, string model_name,
234 OH_AI_ShapeInfo shape_infos, bool build_by_graph, bool is_transpose, bool is_callback) {
235 string model_path = "/data/test/" + model_name + ".ms";
236 const char *graphPath = model_path.c_str();
237 OH_AI_Status ret = OH_AI_STATUS_SUCCESS;
238 if (build_by_graph) {
239 printf("==========Build model by graphBuf==========\n");
240 size_t size;
241 size_t *ptr_size = &size;
242 char *graphBuf = ReadFile(graphPath, ptr_size);
243 ASSERT_NE(graphBuf, nullptr);
244 ret = OH_AI_ModelBuild(model, graphBuf, size, OH_AI_MODELTYPE_MINDIR, context);
245 delete[] graphBuf;
246 } else {
247 printf("==========Build model==========\n");
248 ret = OH_AI_ModelBuildFromFile(model, graphPath, OH_AI_MODELTYPE_MINDIR, context);
249 }
250 printf("==========build model return code:%d\n", ret);
251 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
252 printf("==========GetInputs==========\n");
253 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
254 ASSERT_NE(inputs.handle_list, nullptr);
255 if (shape_infos.shape_num != 0) {
256 printf("==========Resizes==========\n");
257 OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
258 printf("==========Resizes return code:%d\n", resize_ret);
259 ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
260 }
261
262 FillInputsData(inputs, model_name, is_transpose);
263 OH_AI_TensorHandleArray outputs;
264 OH_AI_Status predict_ret = OH_AI_STATUS_SUCCESS;
265 if (is_callback) {
266 printf("==========Model Predict Callback==========\n");
267 OH_AI_KernelCallBack before_call_back = PrintBeforeCallback;
268 OH_AI_KernelCallBack after_call_back = PrintAfterCallback;
269 predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, before_call_back, after_call_back);
270 }else {
271 printf("==========Model Predict==========\n");
272 predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
273 }
274 printf("==========Model Predict End==========\n");
275 ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
276 printf("=========CompareResult===========\n");
277 CompareResult(outputs, model_name);
278 printf("=========OH_AI_ModelDestroy===========\n");
279 OH_AI_ModelDestroy(&model);
280 printf("=========OH_AI_ModelDestroy End===========\n");
281 }
282
283 // predict on cpu
Predict_CPU()284 void Predict_CPU() {
285 printf("==========Init Context==========\n");
286 OH_AI_ContextHandle context = OH_AI_ContextCreate();
287 ASSERT_NE(context, nullptr);
288 AddContextDeviceCPU(context);
289 printf("==========Create model==========\n");
290 OH_AI_ModelHandle model = OH_AI_ModelCreate();
291 ASSERT_NE(model, nullptr);
292 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
293 }
294
295 // 正常场景:Context设置CPU,默认场景,不设置线程绑核
296 HWTEST(MSLiteTest, OHOS_Context_CPU_0001, Function | MediumTest | Level1) {
297 printf("==========Init Context==========\n");
298 OH_AI_ContextHandle context = OH_AI_ContextCreate();
299 ASSERT_NE(context, nullptr);
300 AddContextDeviceCPU(context);
301 printf("==========Create model==========\n");
302 OH_AI_ModelHandle model = OH_AI_ModelCreate();
303 ASSERT_NE(model, nullptr);
304 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
305 }
306
307 // 正常场景:Context设置CPU,4线程
308 HWTEST(MSLiteTest, OHOS_Context_CPU_0002, Function | MediumTest | Level1) {
309 printf("==========Init Context==========\n");
310 OH_AI_ContextHandle context = OH_AI_ContextCreate();
311 ASSERT_NE(context, nullptr);
312 OH_AI_ContextSetThreadNum(context, 4);
313 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
314 printf("==========thread_num:%d\n", thread_num);
315 ASSERT_EQ(thread_num, 4);
316 AddContextDeviceCPU(context);
317 printf("==========Create model==========\n");
318 OH_AI_ModelHandle model = OH_AI_ModelCreate();
319 ASSERT_NE(model, nullptr);
320 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
321 }
322
323 // 正常场景:Context设置CPU,2线程
324 HWTEST(MSLiteTest, OHOS_Context_CPU_0003, Function | MediumTest | Level1) {
325 printf("==========Init Context==========\n");
326 OH_AI_ContextHandle context = OH_AI_ContextCreate();
327 ASSERT_NE(context, nullptr);
328 OH_AI_ContextSetThreadNum(context, 2);
329 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
330 printf("==========thread_num:%d\n", thread_num);
331 ASSERT_EQ(thread_num, 2);
332 AddContextDeviceCPU(context);
333 printf("==========Create model==========\n");
334 OH_AI_ModelHandle model = OH_AI_ModelCreate();
335 ASSERT_NE(model, nullptr);
336 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
337 }
338
339 // 正常场景:Context设置CPU,1线程
340 HWTEST(MSLiteTest, OHOS_Context_CPU_0004, Function | MediumTest | Level1) {
341 printf("==========Init Context==========\n");
342 OH_AI_ContextHandle context = OH_AI_ContextCreate();
343 ASSERT_NE(context, nullptr);
344 OH_AI_ContextSetThreadNum(context, 1);
345 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
346 printf("==========thread_num:%d\n", thread_num);
347 ASSERT_EQ(thread_num, 1);
348 AddContextDeviceCPU(context);
349 printf("==========Create model==========\n");
350 OH_AI_ModelHandle model = OH_AI_ModelCreate();
351 ASSERT_NE(model, nullptr);
352 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
353 }
354
355 // 异常场景:Context设置CPU,0线程
356 HWTEST(MSLiteTest, OHOS_Context_CPU_0005, Function | MediumTest | Level1) {
357 printf("==========Init Context==========\n");
358 OH_AI_ContextHandle context = OH_AI_ContextCreate();
359 ASSERT_NE(context, nullptr);
360 OH_AI_ContextSetThreadNum(context, 0);
361 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
362 printf("==========thread_num:%d\n", thread_num);
363 ASSERT_EQ(thread_num, 0);
364 AddContextDeviceCPU(context);
365 printf("==========Create model==========\n");
366 OH_AI_ModelHandle model = OH_AI_ModelCreate();
367 ASSERT_NE(model, nullptr);
368 printf("==========Build model==========\n");
369 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
370 printf("==========build model return code:%d\n", ret);
371 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NOT_SUPPORT);
372 OH_AI_ModelDestroy(&model);
373 }
374
375 // 正常场景:Context设置CPU,不绑核
376 HWTEST(MSLiteTest, OHOS_Context_CPU_0006, Function | MediumTest | Level1) {
377 printf("==========Init Context==========\n");
378 OH_AI_ContextHandle context = OH_AI_ContextCreate();
379 ASSERT_NE(context, nullptr);
380 OH_AI_ContextSetThreadNum(context, 4);
381 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
382 printf("==========thread_num:%d\n", thread_num);
383 ASSERT_EQ(thread_num, 4);
384 OH_AI_ContextSetThreadAffinityMode(context, 0);
385 int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
386 printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
387 ASSERT_EQ(thread_affinity_mode, 0);
388 AddContextDeviceCPU(context);
389 printf("==========Create model==========\n");
390 OH_AI_ModelHandle model = OH_AI_ModelCreate();
391 ASSERT_NE(model, nullptr);
392 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
393 }
394
395 // 正常场景:Context设置CPU,绑大核
396 HWTEST(MSLiteTest, OHOS_Context_CPU_0007, Function | MediumTest | Level1) {
397 printf("==========Init Context==========\n");
398 OH_AI_ContextHandle context = OH_AI_ContextCreate();
399 ASSERT_NE(context, nullptr);
400 OH_AI_ContextSetThreadNum(context, 4);
401 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
402 printf("==========thread_num:%d\n", thread_num);
403 ASSERT_EQ(thread_num, 4);
404 OH_AI_ContextSetThreadAffinityMode(context, 1);
405 int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
406 printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
407 ASSERT_EQ(thread_affinity_mode, 1);
408 AddContextDeviceCPU(context);
409 printf("==========Create model==========\n");
410 OH_AI_ModelHandle model = OH_AI_ModelCreate();
411 ASSERT_NE(model, nullptr);
412 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
413 }
414
415 // 正常场景:Context设置CPU,绑中核
416 HWTEST(MSLiteTest, OHOS_Context_CPU_0008, Function | MediumTest | Level1) {
417 printf("==========Init Context==========\n");
418 OH_AI_ContextHandle context = OH_AI_ContextCreate();
419 ASSERT_NE(context, nullptr);
420 OH_AI_ContextSetThreadNum(context, 4);
421 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
422 printf("==========thread_num:%d\n", thread_num);
423 ASSERT_EQ(thread_num, 4);
424 OH_AI_ContextSetThreadAffinityMode(context, 2);
425 int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
426 printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
427 ASSERT_EQ(thread_affinity_mode, 2);
428 AddContextDeviceCPU(context);
429 printf("==========Create model==========\n");
430 OH_AI_ModelHandle model = OH_AI_ModelCreate();
431 ASSERT_NE(model, nullptr);
432 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
433 }
434
435 // 异常场景:Context设置CPU,绑核失败
436 HWTEST(MSLiteTest, OHOS_Context_CPU_0009, Function | MediumTest | Level1) {
437 printf("==========Init Context==========\n");
438 OH_AI_ContextHandle context = OH_AI_ContextCreate();
439 ASSERT_NE(context, nullptr);
440 OH_AI_ContextSetThreadNum(context, 4);
441 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
442 printf("==========thread_num:%d\n", thread_num);
443 ASSERT_EQ(thread_num, 4);
444 OH_AI_ContextSetThreadAffinityMode(context, 3);
445 int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
446 printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
447 ASSERT_EQ(thread_affinity_mode, 3);
448 AddContextDeviceCPU(context);
449 printf("==========Create model==========\n");
450 OH_AI_ModelHandle model = OH_AI_ModelCreate();
451 ASSERT_NE(model, nullptr);
452 printf("==========Build model==========\n");
453 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
454 printf("==========build model return code:%d\n", ret);
455 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
456 OH_AI_ModelDestroy(&model);
457 }
458
459 // 正常场景:Context设置CPU,绑核列表{0,1,2,3}
460 HWTEST(MSLiteTest, OHOS_Context_CPU_0010, Function | MediumTest | Level1) {
461 printf("==========Init Context==========\n");
462 OH_AI_ContextHandle context = OH_AI_ContextCreate();
463 ASSERT_NE(context, nullptr);
464 OH_AI_ContextSetThreadNum(context, 4);
465 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
466 printf("==========thread_num:%d\n", thread_num);
467 ASSERT_EQ(thread_num, 4);
468 constexpr size_t core_num = 4;
469 int32_t core_list[core_num] = {0, 1, 2, 3};
470 OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
471 size_t ret_core_num;
472 const int32_t *ret_core_list = nullptr;
473 ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
474 ASSERT_EQ(ret_core_num, core_num);
475 for (size_t i = 0; i < ret_core_num; i++) {
476 printf("==========ret_core_list:%d\n", ret_core_list[i]);
477 ASSERT_EQ(ret_core_list[i], core_list[i]);
478 }
479 AddContextDeviceCPU(context);
480 printf("==========Create model==========\n");
481 OH_AI_ModelHandle model = OH_AI_ModelCreate();
482 ASSERT_NE(model, nullptr);
483 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
484 }
485
486 // 正常场景:Context设置CPU,绑核列表和模式同时开启
487 HWTEST(MSLiteTest, OHOS_Context_CPU_0011, Function | MediumTest | Level1) {
488 printf("==========Init Context==========\n");
489 OH_AI_ContextHandle context = OH_AI_ContextCreate();
490 ASSERT_NE(context, nullptr);
491 OH_AI_ContextSetThreadNum(context, 4);
492 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
493 printf("==========thread_num:%d\n", thread_num);
494 ASSERT_EQ(thread_num, 4);
495 OH_AI_ContextSetThreadAffinityMode(context, 1);
496 int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
497 printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
498 constexpr size_t core_num = 4;
499 int32_t core_list[core_num] = {0, 1, 3, 4};
500 OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
501 size_t ret_core_num;
502 const int32_t *ret_core_list = nullptr;
503 ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
504 ASSERT_EQ(ret_core_num, core_num);
505 for (size_t i = 0; i < ret_core_num; i++) {
506 printf("==========ret_core_list:%d\n", ret_core_list[i]);
507 ASSERT_EQ(ret_core_list[i], core_list[i]);
508 }
509 AddContextDeviceCPU(context);
510 printf("==========Create model==========\n");
511 OH_AI_ModelHandle model = OH_AI_ModelCreate();
512 ASSERT_NE(model, nullptr);
513 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
514 }
515
516 // 正常场景:Context设置CPU,开启并行
517 HWTEST(MSLiteTest, OHOS_Context_CPU_0012, Function | MediumTest | Level1) {
518 printf("==========Init Context==========\n");
519 OH_AI_ContextHandle context = OH_AI_ContextCreate();
520 ASSERT_NE(context, nullptr);
521 OH_AI_ContextSetThreadNum(context, 4);
522 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
523 printf("==========thread_num:%d\n", thread_num);
524 ASSERT_EQ(thread_num, 4);
525 OH_AI_ContextSetEnableParallel(context, true);
526 bool is_parallel = OH_AI_ContextGetEnableParallel(context);
527 printf("==========is_parallel:%d\n", is_parallel);
528 ASSERT_EQ(is_parallel, true);
529 AddContextDeviceCPU(context);
530 printf("==========Create model==========\n");
531 OH_AI_ModelHandle model = OH_AI_ModelCreate();
532 ASSERT_NE(model, nullptr);
533 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
534 }
535
536 // 正常场景:Context设置CPU,关闭并行
537 HWTEST(MSLiteTest, OHOS_Context_CPU_0013, Function | MediumTest | Level1) {
538 printf("==========Init Context==========\n");
539 OH_AI_ContextHandle context = OH_AI_ContextCreate();
540 ASSERT_NE(context, nullptr);
541 OH_AI_ContextSetThreadNum(context, 4);
542 int32_t thread_num = OH_AI_ContextGetThreadNum(context);
543 printf("==========thread_num:%d\n", thread_num);
544 ASSERT_EQ(thread_num, 4);
545 OH_AI_ContextSetEnableParallel(context, false);
546 bool is_parallel = OH_AI_ContextGetEnableParallel(context);
547 printf("==========is_parallel:%d\n", is_parallel);
548 ASSERT_EQ(is_parallel, false);
549 AddContextDeviceCPU(context);
550 printf("==========Create model==========\n");
551 OH_AI_ModelHandle model = OH_AI_ModelCreate();
552 ASSERT_NE(model, nullptr);
553 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
554 }
555
556 // 正常场景:Context设置CPU,开启fp16
557 HWTEST(MSLiteTest, OHOS_Context_CPU_0014, Function | MediumTest | Level1) {
558 printf("==========Init Context==========\n");
559 OH_AI_ContextHandle context = OH_AI_ContextCreate();
560 ASSERT_NE(context, nullptr);
561 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
562 ASSERT_NE(cpu_device_info, nullptr);
563 OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, true);
564 bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
565 printf("==========is_fp16:%d\n", is_fp16);
566 ASSERT_EQ(is_fp16, true);
567 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
568 printf("==========Create model==========\n");
569 OH_AI_ModelHandle model = OH_AI_ModelCreate();
570 ASSERT_NE(model, nullptr);
571 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
572 }
573
574 // 正常场景:Context设置CPU,关闭fp16
575 HWTEST(MSLiteTest, OHOS_Context_CPU_0015, Function | MediumTest | Level1) {
576 printf("==========Init Context==========\n");
577 OH_AI_ContextHandle context = OH_AI_ContextCreate();
578 ASSERT_NE(context, nullptr);
579 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
580 ASSERT_NE(cpu_device_info, nullptr);
581 OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
582 bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
583 printf("==========is_fp16:%d\n", is_fp16);
584 ASSERT_EQ(is_fp16, false);
585 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
586 printf("==========Create model==========\n");
587 OH_AI_ModelHandle model = OH_AI_ModelCreate();
588 ASSERT_NE(model, nullptr);
589 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
590 }
591
592 // 正常场景:Context设置CPU,设置厂商名称
593 HWTEST(MSLiteTest, OHOS_Context_CPU_0016, Function | MediumTest | Level1) {
594 printf("==========Init Context==========\n");
595 OH_AI_ContextHandle context = OH_AI_ContextCreate();
596 ASSERT_NE(context, nullptr);
597 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
598 ASSERT_NE(cpu_device_info, nullptr);
599 OH_AI_DeviceInfoSetProvider(cpu_device_info, "vendor_new");
600 ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProvider(cpu_device_info), "vendor_new"), 0);
601 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
602 printf("==========Create model==========\n");
603 OH_AI_ModelHandle model = OH_AI_ModelCreate();
604 ASSERT_NE(model, nullptr);
605 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
606 }
607
608 // 正常场景:Context设置CPU,设置厂商设备类型
609 HWTEST(MSLiteTest, OHOS_Context_CPU_0017, Function | MediumTest | Level1) {
610 printf("==========Init Context==========\n");
611 OH_AI_ContextHandle context = OH_AI_ContextCreate();
612 ASSERT_NE(context, nullptr);
613 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
614 ASSERT_NE(cpu_device_info, nullptr);
615 OH_AI_DeviceInfoSetProviderDevice(cpu_device_info, "cpu_new");
616 ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProviderDevice(cpu_device_info), "cpu_new"), 0);
617 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
618 printf("==========Create model==========\n");
619 OH_AI_ModelHandle model = OH_AI_ModelCreate();
620 ASSERT_NE(model, nullptr);
621 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
622 }
623
624 // 正常场景:Context设置CPU,销毁MSDeviceInfo
625 HWTEST(MSLiteTest, OHOS_Context_CPU_0018, Function | MediumTest | Level1) {
626 printf("==========Init Context==========\n");
627 OH_AI_ContextHandle context = OH_AI_ContextCreate();
628 ASSERT_NE(context, nullptr);
629 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
630 ASSERT_NE(cpu_device_info, nullptr);
631 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
632 printf("==========device_type:%d\n", device_type);
633 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
634 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
635 OH_AI_DeviceInfoDestroy(&cpu_device_info);
636 ASSERT_EQ(cpu_device_info, nullptr);
637 }
638
639 // 正常场景:Context设置CPU,销毁OH_AI_Context
640 HWTEST(MSLiteTest, OHOS_Context_CPU_0019, Function | MediumTest | Level1) {
641 printf("==========Init Context==========\n");
642 OH_AI_ContextHandle context = OH_AI_ContextCreate();
643 ASSERT_NE(context, nullptr);
644 OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
645 ASSERT_NE(cpu_device_info, nullptr);
646 OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
647 printf("==========device_type:%d\n", device_type);
648 ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
649 OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
650 OH_AI_ContextDestroy(&context);
651 ASSERT_EQ(context, nullptr);
652 }
653
654 // 异常场景:Context不设置device info
655 HWTEST(MSLiteTest, OHOS_Context_CPU_0020, Function | MediumTest | Level1) {
656 printf("==========Init Context==========\n");
657 OH_AI_ContextHandle context = OH_AI_ContextCreate();
658 ASSERT_NE(context, nullptr);
659 printf("==========Create model==========\n");
660 OH_AI_ModelHandle model = OH_AI_ModelCreate();
661 ASSERT_NE(model, nullptr);
662 printf("==========Build model==========\n");
663 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
664 printf("==========build model return code:%d\n", ret);
665 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
666 OH_AI_ModelDestroy(&model);
667 }
668
669 // 正常场景:Context设置NPU,频率为1
670 HWTEST(MSLiteTest, OHOS_Context_NPU_0002, Function | MediumTest | Level1) {
671 printf("==========Init Context==========\n");
672 OH_AI_ContextHandle context = OH_AI_ContextCreate();
673 ASSERT_NE(context, nullptr);
674 OH_AI_DeviceInfoHandle npu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_KIRIN_NPU);
675 ASSERT_NE(npu_device_info, nullptr);
676 OH_AI_DeviceInfoSetFrequency(npu_device_info, 1);
677 int frequency = OH_AI_DeviceInfoGetFrequency(npu_device_info);
678 ASSERT_EQ(frequency, 1);
679 OH_AI_ContextAddDeviceInfo(context, npu_device_info);
680 printf("==========Create model==========\n");
681 OH_AI_ModelHandle model = OH_AI_ModelCreate();
682 ASSERT_NE(model, nullptr);
683 }
684
685 // 正常场景:ModelBuild,调用指针方法
686 HWTEST(MSLiteTest, OHOS_Model_Build_0001, Function | MediumTest | Level1) {
687 printf("==========Init Context==========\n");
688 OH_AI_ContextHandle context = OH_AI_ContextCreate();
689 ASSERT_NE(context, nullptr);
690 AddContextDeviceCPU(context);
691 printf("==========Create model==========\n");
692 OH_AI_ModelHandle model = OH_AI_ModelCreate();
693 ASSERT_NE(model, nullptr);
694 ModelPredict(model, context, "ml_face_isface", {}, true, true, false);
695 }
696
697 // 异常场景:ModelBuild,model_data指向的不是模型数据
698 HWTEST(MSLiteTest, OHOS_Model_Build_0002, Function | MediumTest | Level1) {
699 printf("==========ReadFile==========\n");
700 size_t size1;
701 size_t *ptr_size1 = &size1;
702 const char *imagePath = "/data/test/ml_face_isface.input";
703 char *imageBuf = ReadFile(imagePath, ptr_size1);
704 ASSERT_NE(imageBuf, nullptr);
705 printf("==========Init Context==========\n");
706 OH_AI_ContextHandle context = OH_AI_ContextCreate();
707 ASSERT_NE(context, nullptr);
708 AddContextDeviceCPU(context);
709 printf("==========Create model==========\n");
710 OH_AI_ModelHandle model = OH_AI_ModelCreate();
711 ASSERT_NE(model, nullptr);
712 printf("==========Build model==========\n");
713 OH_AI_Status ret = OH_AI_ModelBuild(model, imageBuf, size1, OH_AI_MODELTYPE_MINDIR, context);
714 printf("==========build model return code:%d\n", ret);
715 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
716 delete[] imageBuf;
717 OH_AI_ModelDestroy(&model);
718 }
719
720 // 异常场景:ModelBuild,model_data为空
721 HWTEST(MSLiteTest, OHOS_Model_Build_0003, Function | MediumTest | Level1) {
722 printf("==========Init Context==========\n");
723 OH_AI_ContextHandle context = OH_AI_ContextCreate();
724 ASSERT_NE(context, nullptr);
725 AddContextDeviceCPU(context);
726 printf("==========Create model==========\n");
727 OH_AI_ModelHandle model = OH_AI_ModelCreate();
728 ASSERT_NE(model, nullptr);
729 printf("==========Build model==========\n");
730 OH_AI_Status ret = OH_AI_ModelBuild(model, nullptr, 0, OH_AI_MODELTYPE_MINDIR, context);
731 printf("==========build model return code:%d\n", ret);
732 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
733 OH_AI_ModelDestroy(&model);
734 }
735
736 // 异常场景:ModelBuild,data_size为0
737 HWTEST(MSLiteTest, OHOS_Model_Build_0004, Function | MediumTest | Level1) {
738 printf("==========ReadFile==========\n");
739 size_t size;
740 size_t *ptr_size = &size;
741 const char *graphPath = "/data/test/ml_face_isface.ms";
742 char *graphBuf = ReadFile(graphPath, ptr_size);
743 ASSERT_NE(graphBuf, nullptr);
744 printf("==========Init Context==========\n");
745 OH_AI_ContextHandle context = OH_AI_ContextCreate();
746 ASSERT_NE(context, nullptr);
747 AddContextDeviceCPU(context);
748 printf("==========Create model==========\n");
749 OH_AI_ModelHandle model = OH_AI_ModelCreate();
750 ASSERT_NE(model, nullptr);
751 printf("==========Build model==========\n");
752 OH_AI_Status ret = OH_AI_ModelBuild(model, graphBuf, 0, OH_AI_MODELTYPE_MINDIR, context);
753 printf("==========build model return code:%d\n", ret);
754 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
755 delete[] graphBuf;
756 OH_AI_ModelDestroy(&model);
757 }
758
759 // 异常场景:ModelBuild,读取路径方法,且路径不是模型数据路径
760 HWTEST(MSLiteTest, OHOS_Model_Build_0005, Function | MediumTest | Level1) {
761 printf("==========Init Context==========\n");
762 OH_AI_ContextHandle context = OH_AI_ContextCreate();
763 ASSERT_NE(context, nullptr);
764 AddContextDeviceCPU(context);
765 printf("==========Create model==========\n");
766 OH_AI_ModelHandle model = OH_AI_ModelCreate();
767 ASSERT_NE(model, nullptr);
768 printf("==========Build model==========\n");
769 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.input", OH_AI_MODELTYPE_MINDIR, context);
770 printf("==========build model return code:%d\n", ret);
771 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
772 OH_AI_ModelDestroy(&model);
773 }
774
775 // 异常场景:ModelBuild,读取路径方法,路径为空
776 HWTEST(MSLiteTest, OHOS_Model_Build_0006, Function | MediumTest | Level1) {
777 printf("==========Init Context==========\n");
778 OH_AI_ContextHandle context = OH_AI_ContextCreate();
779 ASSERT_NE(context, nullptr);
780 AddContextDeviceCPU(context);
781 printf("==========Create model==========\n");
782 OH_AI_ModelHandle model = OH_AI_ModelCreate();
783 ASSERT_NE(model, nullptr);
784 printf("==========Build model==========\n");
785 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "", OH_AI_MODELTYPE_MINDIR, context);
786 printf("==========build model return code:%d\n", ret);
787 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
788 OH_AI_ModelDestroy(&model);
789 }
790
791 // 异常场景:ModelBuild,model_type不支持
792 HWTEST(MSLiteTest, OHOS_Model_Build_0007, Function | MediumTest | Level1) {
793 printf("==========Init Context==========\n");
794 OH_AI_ContextHandle context = OH_AI_ContextCreate();
795 ASSERT_NE(context, nullptr);
796 AddContextDeviceCPU(context);
797 printf("==========Create model==========\n");
798 OH_AI_ModelHandle model = OH_AI_ModelCreate();
799 ASSERT_NE(model, nullptr);
800 printf("==========Build model==========\n");
801 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_INVALID, context);
802 printf("==========build model return code:%d\n", ret);
803 ASSERT_EQ(ret, OH_AI_STATUS_LITE_PARAM_INVALID);
804 OH_AI_ModelDestroy(&model);
805 }
806
807 // 异常场景:ModelBuild,model_context为空
808 HWTEST(MSLiteTest, OHOS_Model_Build_0008, Function | MediumTest | Level1) {
809 printf("==========Init Context==========\n");
810 OH_AI_ContextHandle context = OH_AI_ContextCreate();
811 ASSERT_NE(context, nullptr);
812 AddContextDeviceCPU(context);
813 printf("==========Create model==========\n");
814 OH_AI_ModelHandle model = OH_AI_ModelCreate();
815 ASSERT_NE(model, nullptr);
816 printf("==========Build model==========\n");
817 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, nullptr);
818 printf("==========build model return code:%d\n", ret);
819 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
820 OH_AI_ModelDestroy(&model);
821 }
822
823 // 正常场景:ModelBuild,调用GetOutputs获取输出
824 HWTEST(MSLiteTest, OHOS_Model_Build_0009, Function | MediumTest | Level1) {
825 printf("==========Init Context==========\n");
826 OH_AI_ContextHandle context = OH_AI_ContextCreate();
827 ASSERT_NE(context, nullptr);
828 AddContextDeviceCPU(context);
829 printf("==========Create model==========\n");
830 OH_AI_ModelHandle model = OH_AI_ModelCreate();
831 ASSERT_NE(model, nullptr);
832 printf("==========Model build==========\n");
833 OH_AI_ModelBuildFromFile(model,"/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
834 printf("==========Model Predict==========\n");
835 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
836 OH_AI_TensorHandleArray output;
837 FillInputsData(inputs,"ml_face_isface",false);
838 OH_AI_Status ret = OH_AI_ModelPredict(model, inputs, &output, nullptr, nullptr);
839 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
840 printf("==========GetOutput==========\n");
841 OH_AI_TensorHandleArray outputs = OH_AI_ModelGetOutputs(model);
842 for (size_t i = 0; i < outputs.handle_num; ++i) {
843 OH_AI_TensorHandle tensor = outputs.handle_list[i];
844 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
845 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
846 float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
847 printf("output data is:");
848 for (int j = 0; j < element_num && j <= 20; ++j) {
849 printf("%f ", output_data[j]);
850 }
851 printf("\n");
852 printf("==========compFp32WithTData==========\n");
853 string expectedDataFile = "/data/test/ml_face_isface" + std::to_string(i) + ".output";
854 bool result = compFp32WithTData(output_data, expectedDataFile, 0.01, 0.01, false);
855 EXPECT_EQ(result, true);
856 }
857 }
858
859 // 正常场景:ModelResize,shape与之前一致
860 HWTEST(MSLiteTest, OHOS_Model_Resize_0001, Function | MediumTest | Level1) {
861 printf("==========Init Context==========\n");
862 OH_AI_ContextHandle context = OH_AI_ContextCreate();
863 ASSERT_NE(context, nullptr);
864 AddContextDeviceCPU(context);
865 printf("==========Create model==========\n");
866 OH_AI_ModelHandle model = OH_AI_ModelCreate();
867 ASSERT_NE(model, nullptr);
868 ModelPredict(model, context, "ml_ocr_cn", {4, {1, 32, 512, 1}}, false, true, false);
869 }
870
871 // 正常场景:ModelResize,shape与之前不一致
872 HWTEST(MSLiteTest, OHOS_Model_Resize_0002, Function | MediumTest | Level1) {
873 printf("==========Init Context==========\n");
874 OH_AI_ContextHandle context = OH_AI_ContextCreate();
875 ASSERT_NE(context, nullptr);
876 AddContextDeviceCPU(context);
877 printf("==========Create model==========\n");
878 OH_AI_ModelHandle model = OH_AI_ModelCreate();
879 ASSERT_NE(model, nullptr);
880 printf("==========Build model==========\n");
881 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
882 printf("==========build model return code:%d\n", ret);
883 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
884 printf("==========GetInputs==========\n");
885 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
886 ASSERT_NE(inputs.handle_list, nullptr);
887 printf("==========Resizes==========\n");
888 OH_AI_ShapeInfo shape_infos = {4, {1, 64, 256, 1}};
889 OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
890 printf("==========Resizes return code:%d\n", resize_ret);
891 ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
892 FillInputsData(inputs, "ml_ocr_cn", false);
893 OH_AI_TensorHandleArray outputs;
894 printf("==========Model Predict==========\n");
895 OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
896 ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
897 }
898
899 // 异常场景:ModelResize,shape为三维
900 HWTEST(MSLiteTest, OHOS_Model_Resize_0003, Function | MediumTest | Level1) {
901 printf("==========Init Context==========\n");
902 OH_AI_ContextHandle context = OH_AI_ContextCreate();
903 ASSERT_NE(context, nullptr);
904 AddContextDeviceCPU(context);
905 printf("==========Create model==========\n");
906 OH_AI_ModelHandle model = OH_AI_ModelCreate();
907 ASSERT_NE(model, nullptr);
908 printf("==========Build model==========\n");
909 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
910 printf("==========build model return code:%d\n", ret);
911 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
912 printf("==========GetInputs==========\n");
913 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
914 ASSERT_NE(inputs.handle_list, nullptr);
915 printf("==========Resizes==========\n");
916 OH_AI_ShapeInfo shape_infos = {4, {1, 32, 1}};
917 ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
918 printf("==========Resizes return code:%d\n", ret);
919 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
920 OH_AI_ModelDestroy(&model);
921 }
922
923 // 异常场景:ModelResize,shape值有负数
924 HWTEST(MSLiteTest, OHOS_Model_Resize_0004, Function | MediumTest | Level1) {
925 printf("==========Init Context==========\n");
926 OH_AI_ContextHandle context = OH_AI_ContextCreate();
927 ASSERT_NE(context, nullptr);
928 AddContextDeviceCPU(context);
929 printf("==========Create model==========\n");
930 OH_AI_ModelHandle model = OH_AI_ModelCreate();
931 ASSERT_NE(model, nullptr);
932 printf("==========Build model==========\n");
933 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
934 printf("==========build model return code:%d\n", ret);
935 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
936 printf("==========GetInputs==========\n");
937 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
938 ASSERT_NE(inputs.handle_list, nullptr);
939 printf("==========Resizes==========\n");
940 OH_AI_ShapeInfo shape_infos = {4, {1, -32, 32, 1}};
941 ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
942 printf("==========Resizes return code:%d\n", ret);
943 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
944 OH_AI_ModelDestroy(&model);
945 }
946
947 // 异常场景:ModelResize,不支持resize的模型
948 HWTEST(MSLiteTest, OHOS_Model_Resize_0005, Function | MediumTest | Level1) {
949 printf("==========Init Context==========\n");
950 OH_AI_ContextHandle context = OH_AI_ContextCreate();
951 ASSERT_NE(context, nullptr);
952 AddContextDeviceCPU(context);
953 printf("==========Create model==========\n");
954 OH_AI_ModelHandle model = OH_AI_ModelCreate();
955 ASSERT_NE(model, nullptr);
956 printf("==========Build model==========\n");
957 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
958 printf("==========build model return code:%d\n", ret);
959 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
960 printf("==========GetInputs==========\n");
961 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
962 ASSERT_NE(inputs.handle_list, nullptr);
963 printf("==========Resizes==========\n");
964 OH_AI_ShapeInfo shape_infos = {4, {1, 96, 96, 1}};
965 ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
966 printf("==========Resizes return code:%d\n", ret);
967 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
968 OH_AI_ModelDestroy(&model);
969 }
970
971 // 正常场景:ModelPredict
972 HWTEST(MSLiteTest, OHOS_Model_Predict_0001, Function | MediumTest | Level1) {
973 printf("==========Init Context==========\n");
974 OH_AI_ContextHandle context = OH_AI_ContextCreate();
975 ASSERT_NE(context, nullptr);
976 AddContextDeviceCPU(context);
977 printf("==========Create model==========\n");
978 OH_AI_ModelHandle model = OH_AI_ModelCreate();
979 ASSERT_NE(model, nullptr);
980 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
981 }
982
983 // 异常场景:ModelPredict,model被销毁
984 HWTEST(MSLiteTest, OHOS_Model_Predict_0002, Function | MediumTest | Level1) {
985 printf("==========Init Context==========\n");
986 OH_AI_ContextHandle context = OH_AI_ContextCreate();
987 ASSERT_NE(context, nullptr);
988 AddContextDeviceCPU(context);
989 printf("==========Create model==========\n");
990 OH_AI_ModelHandle model = OH_AI_ModelCreate();
991 ASSERT_NE(model, nullptr);
992 printf("==========Build model==========\n");
993 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
994 printf("==========build model return code:%d\n", ret);
995 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
996 printf("==========GetInputs==========\n");
997 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
998 ASSERT_NE(inputs.handle_list, nullptr);
999 FillInputsData(inputs, "ml_face_isface", true);
1000 printf("==========Model Predict==========\n");
1001 OH_AI_TensorHandleArray outputs;
1002 OH_AI_ModelDestroy(&model);
1003 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1004 printf("==========Model Predict return code:%d\n", ret);
1005 ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
1006 }
1007
1008 // 异常场景:ModelPredict,input为空
1009 HWTEST(MSLiteTest, OHOS_Model_Predict_0003, Function | MediumTest | Level1) {
1010 printf("==========Init Context==========\n");
1011 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1012 ASSERT_NE(context, nullptr);
1013 AddContextDeviceCPU(context);
1014 printf("==========Create model==========\n");
1015 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1016 ASSERT_NE(model, nullptr);
1017 printf("==========Build model==========\n");
1018 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1019 printf("==========build model return code:%d\n", ret);
1020 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1021 printf("==========Model Predict==========\n");
1022 OH_AI_TensorHandleArray inputs;
1023 OH_AI_TensorHandleArray outputs;
1024 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1025 printf("==========Model Predict return code:%d\n", ret);
1026 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
1027 OH_AI_ModelDestroy(&model);
1028 }
1029
1030 // 正常场景:ModelPredict,传入回调函数
1031 HWTEST(MSLiteTest, OHOS_Model_Predict_0004, Function | MediumTest | Level1) {
1032 printf("==========Init Context==========\n");
1033 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1034 ASSERT_NE(context, nullptr);
1035 AddContextDeviceCPU(context);
1036 printf("==========Create model==========\n");
1037 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1038 ASSERT_NE(model, nullptr);
1039 ModelPredict(model, context, "ml_face_isface", {}, false, true, true);
1040 }
1041
1042 // 正常场景:ModelGetInputByTensorName
1043 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0001, Function | MediumTest | Level1) {
1044 printf("==========ReadFile==========\n");
1045 size_t size1;
1046 size_t *ptr_size1 = &size1;
1047 const char *imagePath = "/data/test/ml_face_isface.input";
1048 char *imageBuf = ReadFile(imagePath, ptr_size1);
1049 ASSERT_NE(imageBuf, nullptr);
1050 printf("==========Init Context==========\n");
1051 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1052 ASSERT_NE(context, nullptr);
1053 AddContextDeviceCPU(context);
1054 printf("==========Create model==========\n");
1055 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1056 ASSERT_NE(model, nullptr);
1057 printf("==========Build model==========\n");
1058 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1059 printf("==========build model return code:%d\n", ret);
1060 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1061 printf("==========GetInputs==========\n");
1062 OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "data");
1063 ASSERT_NE(tensor, nullptr);
1064 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1065 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1066 float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1067 ASSERT_NE(input_data, nullptr);
1068 printf("==========Transpose==========\n");
1069 size_t shape_num;
1070 const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
1071 auto imageBuf_nhwc = new char[size1];
1072 PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
1073 memcpy_s(input_data, size1, imageBuf_nhwc, size1);
1074 printf("input data is:");
1075 for (int j = 0; j < element_num && j <= 20; ++j) {
1076 printf("%f ", input_data[j]);
1077 }
1078 printf("\n");
1079 printf("==========Model Predict==========\n");
1080 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1081 ASSERT_NE(inputs.handle_list, nullptr);
1082 OH_AI_TensorHandleArray outputs;
1083 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1084 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1085 CompareResult(outputs, "ml_face_isface");
1086 delete[] imageBuf;
1087 OH_AI_ModelDestroy(&model);
1088 }
1089
1090 // 异常场景:ModelGetInputByTensorName,名称不存在
1091 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0002, Function | MediumTest | Level1) {
1092 printf("==========Init Context==========\n");
1093 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1094 ASSERT_NE(context, nullptr);
1095 AddContextDeviceCPU(context);
1096 printf("==========Create model==========\n");
1097 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1098 ASSERT_NE(model, nullptr);
1099 printf("==========Build model==========\n");
1100 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1101 printf("==========build model return code:%d\n", ret);
1102 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1103 printf("==========GetInputs==========\n");
1104 OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "aaa");
1105 ASSERT_EQ(tensor, nullptr);
1106 OH_AI_ModelDestroy(&model);
1107 }
1108
1109 // 正常场景:ModelGetOutputByTensorName
1110 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0001, Function | MediumTest | Level1) {
1111 printf("==========Init Context==========\n");
1112 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1113 ASSERT_NE(context, nullptr);
1114 AddContextDeviceCPU(context);
1115 printf("==========Create model==========\n");
1116 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1117 ASSERT_NE(model, nullptr);
1118 printf("==========Build model==========\n");
1119 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1120 printf("==========build model return code:%d\n", ret);
1121 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1122 printf("==========GetInputs==========\n");
1123 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1124 ASSERT_NE(inputs.handle_list, nullptr);
1125 FillInputsData(inputs, "ml_face_isface", true);
1126 printf("==========Model Predict==========\n");
1127 OH_AI_TensorHandleArray outputs;
1128 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1129 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1130 printf("==========GetOutput==========\n");
1131 OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "prob");
1132 ASSERT_NE(tensor, nullptr);
1133 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1134 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1135 float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1136 printf("output data is:");
1137 for (int j = 0; j < element_num && j <= 20; ++j) {
1138 printf("%f ", output_data[j]);
1139 }
1140 printf("\n");
1141 printf("==========compFp32WithTData==========\n");
1142 bool result = compFp32WithTData(output_data, "/data/test/ml_face_isface0.output", 0.01, 0.01, false);
1143 EXPECT_EQ(result, true);
1144 OH_AI_ModelDestroy(&model);
1145 }
1146
1147 // 异常场景:ModelGetOutputByTensorName,名称不存在
1148 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0002, Function | MediumTest | Level1) {
1149 printf("==========Init Context==========\n");
1150 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1151 ASSERT_NE(context, nullptr);
1152 AddContextDeviceCPU(context);
1153 printf("==========Create model==========\n");
1154 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1155 ASSERT_NE(model, nullptr);
1156 printf("==========Build model==========\n");
1157 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1158 printf("==========build model return code:%d\n", ret);
1159 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1160 printf("==========GetInputs==========\n");
1161 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1162 ASSERT_NE(inputs.handle_list, nullptr);
1163 FillInputsData(inputs, "ml_face_isface", true);
1164 printf("==========Model Predict==========\n");
1165 OH_AI_TensorHandleArray outputs;
1166 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1167 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1168 printf("==========GetOutput==========\n");
1169 OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "aaa");
1170 ASSERT_EQ(tensor, nullptr);
1171 OH_AI_ModelDestroy(&model);
1172 }
1173
1174 // 正常场景:MSTensorCreate,创建tensor
1175 HWTEST(MSLiteTest, OHOS_Tensor_Create_0001, Function | MediumTest | Level1) {
1176 printf("==========Init Context==========\n");
1177 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1178 ASSERT_NE(context, nullptr);
1179 AddContextDeviceCPU(context);
1180 printf("==========Create model==========\n");
1181 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1182 ASSERT_NE(model, nullptr);
1183 printf("==========Build model==========\n");
1184 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1185 printf("==========build model return code:%d\n", ret);
1186 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1187 printf("==========GetInputs==========\n");
1188 constexpr size_t create_shape_num = 4;
1189 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1190 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1191 create_shape_num, nullptr, 0);
1192 ASSERT_NE(tensor, nullptr);
1193 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1194 inputs.handle_list[0] = tensor;
1195 FillInputsData(inputs, "ml_face_isface", true);
1196 printf("==========Model Predict==========\n");
1197 OH_AI_TensorHandleArray outputs;
1198 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1199 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1200 CompareResult(outputs, "ml_face_isface");
1201 OH_AI_ModelDestroy(&model);
1202 }
1203
1204 // 正常场景:MSTensorDestroy,销毁tensor
1205 HWTEST(MSLiteTest, OHOS_Tensor_Create_0002, Function | MediumTest | Level1) {
1206 printf("==========ReadFile==========\n");
1207 size_t size1;
1208 size_t *ptr_size1 = &size1;
1209 const char *imagePath = "/data/test/ml_face_isface.input";
1210 char *imageBuf = ReadFile(imagePath, ptr_size1);
1211 ASSERT_NE(imageBuf, nullptr);
1212 printf("==========OH_AI_TensorCreate==========\n");
1213 constexpr size_t create_shape_num = 4;
1214 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1215 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1216 create_shape_num, imageBuf, size1);
1217 ASSERT_NE(tensor, nullptr);
1218 delete[] imageBuf;
1219 OH_AI_TensorDestroy(&tensor);
1220 ASSERT_EQ(tensor, nullptr);
1221 }
1222
1223 // 正常场景:MSTensorGetName,获取tensor名称
1224 HWTEST(MSLiteTest, OHOS_Tensor_Create_0003, Function | MediumTest | Level1) {
1225 printf("==========ReadFile==========\n");
1226 size_t size1;
1227 size_t *ptr_size1 = &size1;
1228 const char *imagePath = "/data/test/ml_face_isface.input";
1229 char *imageBuf = ReadFile(imagePath, ptr_size1);
1230 ASSERT_NE(imageBuf, nullptr);
1231 printf("==========OH_AI_TensorCreate==========\n");
1232 constexpr size_t create_shape_num = 4;
1233 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1234 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1235 create_shape_num, imageBuf, size1);
1236 ASSERT_NE(tensor, nullptr);
1237 const char *tensor_name = OH_AI_TensorGetName(tensor);
1238 ASSERT_EQ(strcmp(tensor_name, "data"), 0);
1239 delete[] imageBuf;
1240 OH_AI_TensorDestroy(&tensor);
1241 }
1242
1243 // 正常场景:MSTensorGetName,设置tensor名称
1244 HWTEST(MSLiteTest, OHOS_Tensor_Create_0004, Function | MediumTest | Level1) {
1245 printf("==========ReadFile==========\n");
1246 size_t size1;
1247 size_t *ptr_size1 = &size1;
1248 const char *imagePath = "/data/test/ml_face_isface.input";
1249 char *imageBuf = ReadFile(imagePath, ptr_size1);
1250 ASSERT_NE(imageBuf, nullptr);
1251 printf("==========OH_AI_TensorCreate==========\n");
1252 constexpr size_t create_shape_num = 4;
1253 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1254 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1255 create_shape_num, imageBuf, size1);
1256 ASSERT_NE(tensor, nullptr);
1257 OH_AI_TensorSetName(tensor, "new_data");
1258 const char *tensor_name = OH_AI_TensorGetName(tensor);
1259 ASSERT_EQ(strcmp(tensor_name, "new_data"), 0);
1260 delete[] imageBuf;
1261 OH_AI_TensorDestroy(&tensor);
1262 }
1263
1264 // 正常场景:MSTensorGetDataType,获取tensor数据类型
1265 HWTEST(MSLiteTest, OHOS_Tensor_Create_0005, Function | MediumTest | Level1) {
1266 printf("==========ReadFile==========\n");
1267 size_t size1;
1268 size_t *ptr_size1 = &size1;
1269 const char *imagePath = "/data/test/ml_face_isface.input";
1270 char *imageBuf = ReadFile(imagePath, ptr_size1);
1271 ASSERT_NE(imageBuf, nullptr);
1272 printf("==========OH_AI_TensorCreate==========\n");
1273 constexpr size_t create_shape_num = 4;
1274 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1275 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1276 create_shape_num, imageBuf, size1);
1277 ASSERT_NE(tensor, nullptr);
1278 OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1279 ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT32);
1280 delete[] imageBuf;
1281 OH_AI_TensorDestroy(&tensor);
1282 }
1283
1284 // 正常场景:MSTensorSetDataType,设置tensor数据类型
1285 HWTEST(MSLiteTest, OHOS_Tensor_Create_0006, Function | MediumTest | Level1) {
1286 printf("==========ReadFile==========\n");
1287 size_t size1;
1288 size_t *ptr_size1 = &size1;
1289 const char *imagePath = "/data/test/ml_face_isface.input";
1290 char *imageBuf = ReadFile(imagePath, ptr_size1);
1291 ASSERT_NE(imageBuf, nullptr);
1292 printf("==========OH_AI_TensorCreate==========\n");
1293 constexpr size_t create_shape_num = 4;
1294 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1295 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1296 create_shape_num, imageBuf, size1);
1297 ASSERT_NE(tensor, nullptr);
1298 OH_AI_TensorSetDataType(tensor, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1299 OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1300 ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1301 delete[] imageBuf;
1302 OH_AI_TensorDestroy(&tensor);
1303 }
1304
1305 // 正常场景:MSTensorGetShape,获取tensor维度
1306 HWTEST(MSLiteTest, OHOS_Tensor_Create_0007, Function | MediumTest | Level1) {
1307 printf("==========ReadFile==========\n");
1308 size_t size1;
1309 size_t *ptr_size1 = &size1;
1310 const char *imagePath = "/data/test/ml_face_isface.input";
1311 char *imageBuf = ReadFile(imagePath, ptr_size1);
1312 ASSERT_NE(imageBuf, nullptr);
1313 printf("==========OH_AI_TensorCreate==========\n");
1314 constexpr size_t create_shape_num = 4;
1315 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1316 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1317 create_shape_num, imageBuf, size1);
1318 ASSERT_NE(tensor, nullptr);
1319 size_t ret_shape_num;
1320 const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1321 ASSERT_EQ(ret_shape_num, create_shape_num);
1322 for (size_t i = 0; i < ret_shape_num; i++) {
1323 ASSERT_EQ(ret_shape[i], create_shape[i]);
1324 }
1325 delete[] imageBuf;
1326 OH_AI_TensorDestroy(&tensor);
1327 }
1328
1329 // 正常场景:MSTensorSetShape,设置tensor维度
1330 HWTEST(MSLiteTest, OHOS_Tensor_Create_0008, Function | MediumTest | Level1) {
1331 printf("==========ReadFile==========\n");
1332 size_t size1;
1333 size_t *ptr_size1 = &size1;
1334 const char *imagePath = "/data/test/ml_face_isface.input";
1335 char *imageBuf = ReadFile(imagePath, ptr_size1);
1336 ASSERT_NE(imageBuf, nullptr);
1337 printf("==========OH_AI_TensorCreate==========\n");
1338 constexpr size_t create_shape_num = 4;
1339 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1340 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1341 create_shape_num, imageBuf, size1);
1342 ASSERT_NE(tensor, nullptr);
1343 size_t ret_shape_num;
1344 const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1345 ASSERT_EQ(ret_shape_num, create_shape_num);
1346 for (size_t i = 0; i < ret_shape_num; i++) {
1347 ASSERT_EQ(ret_shape[i], create_shape[i]);
1348 }
1349 constexpr size_t new_shape_num = 4;
1350 int64_t new_shape[new_shape_num] = {1, 32, 32, 1};
1351 OH_AI_TensorSetShape(tensor, new_shape, new_shape_num);
1352 size_t new_ret_shape_num;
1353 const int64_t *new_ret_shape = OH_AI_TensorGetShape(tensor, &new_ret_shape_num);
1354 ASSERT_EQ(new_ret_shape_num, new_shape_num);
1355 for (size_t i = 0; i < new_ret_shape_num; i++) {
1356 ASSERT_EQ(new_ret_shape[i], new_shape[i]);
1357 }
1358 delete[] imageBuf;
1359 OH_AI_TensorDestroy(&tensor);
1360 }
1361
1362 // 正常场景:MSTensorGetFormat,获取tensor格式
1363 HWTEST(MSLiteTest, OHOS_Tensor_Create_0009, Function | MediumTest | Level1) {
1364 printf("==========ReadFile==========\n");
1365 size_t size1;
1366 size_t *ptr_size1 = &size1;
1367 const char *imagePath = "/data/test/ml_face_isface.input";
1368 char *imageBuf = ReadFile(imagePath, ptr_size1);
1369 ASSERT_NE(imageBuf, nullptr);
1370 printf("==========OH_AI_TensorCreate==========\n");
1371 constexpr size_t create_shape_num = 4;
1372 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1373 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1374 create_shape_num, imageBuf, size1);
1375 ASSERT_NE(tensor, nullptr);
1376 OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1377 ASSERT_EQ(data_format, OH_AI_FORMAT_NCHW);
1378 delete[] imageBuf;
1379 OH_AI_TensorDestroy(&tensor);
1380 }
1381
1382 // 正常场景:MSTensorSetFormat,设置tensor格式
1383 HWTEST(MSLiteTest, OHOS_Tensor_Create_0010, Function | MediumTest | Level1) {
1384 printf("==========ReadFile==========\n");
1385 size_t size1;
1386 size_t *ptr_size1 = &size1;
1387 const char *imagePath = "/data/test/ml_face_isface.input";
1388 char *imageBuf = ReadFile(imagePath, ptr_size1);
1389 ASSERT_NE(imageBuf, nullptr);
1390 printf("==========OH_AI_TensorCreate==========\n");
1391 constexpr size_t create_shape_num = 4;
1392 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1393 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1394 create_shape_num, imageBuf, size1);
1395 ASSERT_NE(tensor, nullptr);
1396 OH_AI_TensorSetFormat(tensor, OH_AI_FORMAT_NHWC);
1397 OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1398 ASSERT_EQ(data_format, OH_AI_FORMAT_NHWC);
1399 delete[] imageBuf;
1400 OH_AI_TensorDestroy(&tensor);
1401 }
1402
1403 // 正常场景:MSTensorGetData,获取tensor数据
1404 HWTEST(MSLiteTest, OHOS_Tensor_Create_0011, Function | MediumTest | Level1) {
1405 printf("==========ReadFile==========\n");
1406 size_t size1;
1407 size_t *ptr_size1 = &size1;
1408 const char *imagePath = "/data/test/ml_face_isface.input";
1409 char *imageBuf = ReadFile(imagePath, ptr_size1);
1410 ASSERT_NE(imageBuf, nullptr);
1411 printf("==========OH_AI_TensorCreate==========\n");
1412 constexpr size_t create_shape_num = 4;
1413 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1414 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1415 create_shape_num, imageBuf, size1);
1416 ASSERT_NE(tensor, nullptr);
1417 const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1418 ASSERT_NE(ret_data, nullptr);
1419 printf("return data is:");
1420 for (int i = 0; i < 20; ++i) {
1421 printf("%f ", ret_data[i]);
1422 }
1423 printf("\n");
1424 delete[] imageBuf;
1425 OH_AI_TensorDestroy(&tensor);
1426 }
1427
1428 // 正常场景:MSTensorSetData,设置tensor数据
1429 HWTEST(MSLiteTest, OHOS_Tensor_Create_0012, Function | MediumTest | Level1) {
1430 printf("==========ReadFile==========\n");
1431 size_t size1;
1432 size_t *ptr_size1 = &size1;
1433 const char *imagePath = "/data/test/ml_face_isface.input";
1434 char *imageBuf = ReadFile(imagePath, ptr_size1);
1435 ASSERT_NE(imageBuf, nullptr);
1436 printf("==========OH_AI_TensorCreate==========\n");
1437 constexpr size_t create_shape_num = 4;
1438 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1439 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1440 create_shape_num, imageBuf, size1);
1441 ASSERT_NE(tensor, nullptr);
1442 constexpr size_t data_len = 6;
1443 float data[data_len] = {1, 2, 3, 4, 5, 6};
1444 OH_AI_TensorSetData(tensor, data);
1445 const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1446 ASSERT_NE(ret_data, nullptr);
1447 printf("return data is:");
1448 for (size_t i = 0; i < data_len; i++) {
1449 ASSERT_EQ(ret_data[i], data[i]);
1450 printf("%f ", ret_data[i]);
1451 }
1452 printf("\n");
1453 delete[] imageBuf;
1454 OH_AI_TensorDestroy(&tensor);
1455 }
1456
1457 // 正常场景:MSTensorGetElementNum,获取tensor元素
1458 HWTEST(MSLiteTest, OHOS_Tensor_Create_0013, Function | MediumTest | Level1) {
1459 printf("==========ReadFile==========\n");
1460 size_t size1;
1461 size_t *ptr_size1 = &size1;
1462 const char *imagePath = "/data/test/ml_face_isface.input";
1463 char *imageBuf = ReadFile(imagePath, ptr_size1);
1464 ASSERT_NE(imageBuf, nullptr);
1465 printf("==========OH_AI_TensorCreate==========\n");
1466 constexpr size_t create_shape_num = 4;
1467 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1468 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1469 create_shape_num, imageBuf, size1);
1470 ASSERT_NE(tensor, nullptr);
1471 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1472 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1473 ASSERT_EQ(element_num, 6912);
1474 delete[] imageBuf;
1475 OH_AI_TensorDestroy(&tensor);
1476 }
1477
1478 // 正常场景:MSTensorGetDataSize,获取tensor大小
1479 HWTEST(MSLiteTest, OHOS_Tensor_Create_0014, Function | MediumTest | Level1) {
1480 printf("==========ReadFile==========\n");
1481 size_t size1;
1482 size_t *ptr_size1 = &size1;
1483 const char *imagePath = "/data/test/ml_face_isface.input";
1484 char *imageBuf = ReadFile(imagePath, ptr_size1);
1485 ASSERT_NE(imageBuf, nullptr);
1486 printf("==========OH_AI_TensorCreate==========\n");
1487 constexpr size_t create_shape_num = 4;
1488 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1489 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1490 create_shape_num, imageBuf, size1);
1491 ASSERT_NE(tensor, nullptr);
1492 size_t data_size = OH_AI_TensorGetDataSize(tensor);
1493 printf("Tensor data size: %zu.\n", data_size);
1494 ASSERT_EQ(data_size, 6912 * sizeof(float));
1495 delete[] imageBuf;
1496 OH_AI_TensorDestroy(&tensor);
1497 }
1498
1499 // 正常场景:MSTensorGetMutableData,获取tensor可变数据指针
1500 HWTEST(MSLiteTest, OHOS_Tensor_Create_0015, Function | MediumTest | Level1) {
1501 printf("==========ReadFile==========\n");
1502 size_t size1;
1503 size_t *ptr_size1 = &size1;
1504 const char *imagePath = "/data/test/ml_face_isface.input";
1505 char *imageBuf = ReadFile(imagePath, ptr_size1);
1506 ASSERT_NE(imageBuf, nullptr);
1507 printf("==========OH_AI_TensorCreate==========\n");
1508 constexpr size_t create_shape_num = 4;
1509 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1510 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1511 create_shape_num, imageBuf, size1);
1512 ASSERT_NE(tensor, nullptr);
1513 float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1514 ASSERT_NE(input_data, nullptr);
1515 delete[] imageBuf;
1516 OH_AI_TensorDestroy(&tensor);
1517 }
1518
1519 // 正常场景:MSTensorClone,拷贝tensor
1520 HWTEST(MSLiteTest, OHOS_Tensor_Create_0016, Function | MediumTest | Level1) {
1521 printf("==========ReadFile==========\n");
1522 size_t size1;
1523 size_t *ptr_size1 = &size1;
1524 const char *imagePath = "/data/test/ml_face_isface.input";
1525 char *imageBuf = ReadFile(imagePath, ptr_size1);
1526 ASSERT_NE(imageBuf, nullptr);
1527 printf("==========OH_AI_TensorCreate==========\n");
1528 constexpr size_t create_shape_num = 4;
1529 int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1530 OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1531 create_shape_num, imageBuf, size1);
1532 ASSERT_NE(tensor, nullptr);
1533 OH_AI_TensorHandle clone = OH_AI_TensorClone(tensor);
1534 ASSERT_NE(clone, nullptr);
1535 ASSERT_EQ(strcmp(OH_AI_TensorGetName(clone), "data_duplicate"), 0);
1536 delete[] imageBuf;
1537 OH_AI_TensorDestroy(&tensor);
1538 OH_AI_TensorDestroy(&clone);
1539 }
1540
1541 // 正常场景:单输入模型
1542 HWTEST(MSLiteTest, OHOS_Input_0001, Function | MediumTest | Level1) {
1543 printf("==========Init Context==========\n");
1544 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1545 ASSERT_NE(context, nullptr);
1546 AddContextDeviceCPU(context);
1547 printf("==========Create model==========\n");
1548 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1549 ASSERT_NE(model, nullptr);
1550 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1551 }
1552
1553 // 正常场景:多输入模型
1554 HWTEST(MSLiteTest, OHOS_Input_0002, Function | MediumTest | Level1) {
1555 printf("==========Init Context==========\n");
1556 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1557 ASSERT_NE(context, nullptr);
1558 AddContextDeviceCPU(context);
1559 printf("==========Create model==========\n");
1560 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1561 ASSERT_NE(model, nullptr);
1562 printf("==========Build model==========\n");
1563 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite.ms",
1564 OH_AI_MODELTYPE_MINDIR, context);
1565 printf("==========build model return code:%d\n", ret);
1566 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1567 printf("==========GetInputs==========\n");
1568 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1569 ASSERT_NE(inputs.handle_list, nullptr);
1570 FillInputsData(inputs, "ml_headpose_pb2tflite", false);
1571 printf("==========Model Predict==========\n");
1572 OH_AI_TensorHandleArray outputs;
1573 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1574 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1575 CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
1576 OH_AI_ModelDestroy(&model);
1577 }
1578
1579 // 正常场景:输入为uint8模型
1580 HWTEST(MSLiteTest, OHOS_Input_0003, Function | MediumTest | Level1) {
1581 printf("==========ReadFile==========\n");
1582 size_t size1;
1583 size_t *ptr_size1 = &size1;
1584 const char *imagePath = "/data/test/aiy_vision_classifier_plants_V1_3.input";
1585 char *imageBuf = ReadFile(imagePath, ptr_size1);
1586 ASSERT_NE(imageBuf, nullptr);
1587 printf("==========Init Context==========\n");
1588 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1589 ASSERT_NE(context, nullptr);
1590 AddContextDeviceCPU(context);
1591 printf("==========Create model==========\n");
1592 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1593 ASSERT_NE(model, nullptr);
1594 printf("==========Build model==========\n");
1595 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/aiy_vision_classifier_plants_V1_3.ms", OH_AI_MODELTYPE_MINDIR,
1596 context);
1597 printf("==========build model return code:%d\n", ret);
1598 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1599 printf("==========GetInputs==========\n");
1600 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1601 ASSERT_NE(inputs.handle_list, nullptr);
1602 for (size_t i = 0; i < inputs.handle_num; ++i) {
1603 OH_AI_TensorHandle tensor = inputs.handle_list[i];
1604 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1605 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1606 void *input_data = OH_AI_TensorGetMutableData(inputs.handle_list[i]);
1607 ASSERT_NE(input_data, nullptr);
1608 memcpy(input_data, imageBuf, size1);
1609 }
1610 printf("==========Model Predict==========\n");
1611 OH_AI_TensorHandleArray outputs;
1612 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1613 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1614 printf("==========GetOutput==========\n");
1615 for (size_t i = 0; i < outputs.handle_num; ++i) {
1616 OH_AI_TensorHandle tensor = outputs.handle_list[i];
1617 int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1618 printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1619 uint8_t *output_data = reinterpret_cast<uint8_t *>(OH_AI_TensorGetMutableData(tensor));
1620 printf("output data is:");
1621 for (int j = 0; j < element_num && j <= 20; ++j) {
1622 printf("%d ", output_data[j]);
1623 }
1624 printf("\n");
1625 printf("==========compFp32WithTData==========\n");
1626 string expectedDataFile = "/data/test/aiy_vision_classifier_plants_V1_3" + std::to_string(i) + ".output";
1627 bool result = compUint8WithTData(output_data, expectedDataFile, 0.01, 0.01, false);
1628 EXPECT_EQ(result, true);
1629 }
1630 delete[] imageBuf;
1631 OH_AI_ModelDestroy(&model);
1632 }
1633
1634 // 正常场景:量化模型
1635 HWTEST(MSLiteTest, OHOS_Input_0004, Function | MediumTest | Level1) {
1636 printf("==========Init Context==========\n");
1637 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1638 ASSERT_NE(context, nullptr);
1639 AddContextDeviceCPU(context);
1640 printf("==========Create model==========\n");
1641 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1642 ASSERT_NE(model, nullptr);
1643 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1644 }
1645
1646 // 正常场景:循环多次执行推理流程
1647 HWTEST(MSLiteTest, OHOS_Multiple_0001, Function | MediumTest | Level1) {
1648 for (size_t num = 0; num < 50; ++num) {
1649 Predict_CPU();
1650 }
1651 }
1652
1653 // 异常场景:Model创建一次,Build多次
1654 HWTEST(MSLiteTest, OHOS_Multiple_0002, Function | MediumTest | Level1) {
1655 printf("==========Init Context==========\n");
1656 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1657 ASSERT_NE(context, nullptr);
1658 AddContextDeviceCPU(context);
1659 printf("==========Create model==========\n");
1660 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1661 ASSERT_NE(model, nullptr);
1662 printf("==========Build model==========\n");
1663 int ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1664 printf("==========build model return code:%d\n", ret);
1665 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1666 printf("==========Build model==========\n");
1667 int ret2 = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1668 printf("==========build model return code:%d\n", ret2);
1669 ASSERT_EQ(ret2, OH_AI_STATUS_SUCCESS);
1670 OH_AI_ModelDestroy(&model);
1671 }
1672
1673 // 正常场景:Model创建一次,Build一次,Predict多次
1674 HWTEST(MSLiteTest, OHOS_Multiple_0003, Function | MediumTest | Level1) {
1675 printf("==========Init Context==========\n");
1676 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1677 ASSERT_NE(context, nullptr);
1678 AddContextDeviceCPU(context);
1679 printf("==========Create model==========\n");
1680 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1681 ASSERT_NE(model, nullptr);
1682 printf("==========Build model==========\n");
1683 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1684 printf("==========build model return code:%d\n", ret);
1685 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1686 printf("==========GetInputs==========\n");
1687 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1688 ASSERT_NE(inputs.handle_list, nullptr);
1689 FillInputsData(inputs, "ml_face_isface", true);
1690 OH_AI_TensorHandleArray outputs;
1691 for (size_t i = 0; i < 50; ++i) {
1692 printf("==========Model Predict==========\n");
1693 OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1694 ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
1695 }
1696 CompareResult(outputs, "ml_face_isface");
1697 OH_AI_ModelDestroy(&model);
1698 }
1699
1700 // 正常场景:多次创建和销毁Model
1701 HWTEST(MSLiteTest, OHOS_Multiple_0004, Function | MediumTest | Level1) {
1702 for (size_t i = 0; i < 50; ++i) {
1703 printf("==========Init Context==========\n");
1704 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1705 ASSERT_NE(context, nullptr);
1706 AddContextDeviceCPU(context);
1707 printf("==========Create model==========\n");
1708 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1709 ASSERT_NE(model, nullptr);
1710 printf("==========Build model==========\n");
1711 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1712 printf("==========build model return code:%d\n", ret);
1713 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1714 printf("==========Build model==========\n");
1715 OH_AI_ModelDestroy(&model);
1716 }
1717 }
1718
1719 // 正常场景:两个模型都在CPU上并行推理
1720 HWTEST(MSLiteTest, OHOS_Parallel_0001, Function | MediumTest | Level1) {
1721 std::cout << "run start" << std::endl;
1722 std::thread t1(Predict_CPU);
1723 std::cout << "1111111111111" << std::endl;
1724 std::thread t2(Predict_CPU);
1725 std::cout << "2222222222222" << std::endl;
1726 t1.join();
1727 t2.join();
1728 }
1729
1730 // 正常场景:r1.3转换的模型在r1.5上推理
1731 HWTEST(MSLiteTest, OHOS_Compatible_0001, Function | MediumTest | Level1) {
1732 printf("==========Init Context==========\n");
1733 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1734 ASSERT_NE(context, nullptr);
1735 AddContextDeviceCPU(context);
1736 printf("==========Create model==========\n");
1737 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1738 ASSERT_NE(model, nullptr);
1739 printf("==========Build model==========\n");
1740 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_r13.ms",
1741 OH_AI_MODELTYPE_MINDIR, context);
1742 printf("==========build model return code:%d\n", ret);
1743 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1744 printf("==========GetInputs==========\n");
1745 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1746 ASSERT_NE(inputs.handle_list, nullptr);
1747 FillInputsData(inputs, "ml_face_isface", true);
1748 printf("==========Model Predict==========\n");
1749 OH_AI_TensorHandleArray outputs;
1750 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1751 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1752 CompareResult(outputs, "ml_face_isface");
1753 OH_AI_ModelDestroy(&model);
1754 }
1755
1756
1757 // 正常场景:离线模型支持NNRT后端,单模型输入
1758 HWTEST(MSLiteTest, OHOS_OfflineModel_0001, Function | MediumTest | Level1) {
1759 if (!IsNNRTAvailable()) {
1760 printf("NNRt is not available, skip this test");
1761 return;
1762 }
1763
1764 printf("==========Init Context==========\n");
1765 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1766 ASSERT_NE(context, nullptr);
1767 AddContextDeviceNNRT(context);
1768 printf("==========Create model==========\n");
1769 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1770 ASSERT_NE(model, nullptr);
1771 printf("==========Build model==========\n");
1772 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms",
1773 OH_AI_MODELTYPE_MINDIR, context);
1774 printf("==========build model return code:%d\n", ret);
1775 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1776 printf("==========GetInputs==========\n");
1777 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1778 ASSERT_NE(inputs.handle_list, nullptr);
1779 FillInputsData(inputs, "ml_face_isface", true);
1780 printf("==========Model Predict==========\n");
1781 OH_AI_TensorHandleArray outputs;
1782 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1783 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1784 CompareResult(outputs, "ml_face_isface");
1785 OH_AI_ModelDestroy(&model);
1786 }
1787
1788 // 正常场景:离线模型支持NNRT后端,多输入模型
1789 HWTEST(MSLiteTest, OHOS_OfflineModel_0002, Function | MediumTest | Level1) {
1790 if (!IsNNRTAvailable()) {
1791 printf("NNRt is not available, skip this test");
1792 return;
1793 }
1794
1795 printf("==========Init Context==========\n");
1796 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1797 ASSERT_NE(context, nullptr);
1798 AddContextDeviceNNRT(context);
1799 printf("==========Create model==========\n");
1800 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1801 ASSERT_NE(model, nullptr);
1802 printf("==========Build model==========\n");
1803 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite_offline_model.ms",
1804 OH_AI_MODELTYPE_MINDIR, context);
1805 printf("==========build model return code:%d\n", ret);
1806 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1807 printf("==========GetInputs==========\n");
1808 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1809 ASSERT_NE(inputs.handle_list, nullptr);
1810 FillInputsData(inputs, "ml_headpose_pb2tflite", false);
1811 printf("==========Model Predict==========\n");
1812 OH_AI_TensorHandleArray outputs;
1813 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1814 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1815 CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
1816 OH_AI_ModelDestroy(&model);
1817 }
1818
1819
1820 // 正常场景:离线模型支持NNRT后端,Model创建一次,Build一次,Predict多次
1821 HWTEST(MSLiteTest, OHOS_OfflineModel_0004, Function | MediumTest | Level1) {
1822 if (!IsNNRTAvailable()) {
1823 printf("NNRt is not available, skip this test");
1824 return;
1825 }
1826
1827 printf("==========Init Context==========\n");
1828 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1829 ASSERT_NE(context, nullptr);
1830 AddContextDeviceNNRT(context);
1831 printf("==========Create model==========\n");
1832 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1833 ASSERT_NE(model, nullptr);
1834 printf("==========Build model==========\n");
1835 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1836 printf("==========build model return code:%d\n", ret);
1837 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1838 printf("==========GetInputs==========\n");
1839 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1840 ASSERT_NE(inputs.handle_list, nullptr);
1841 FillInputsData(inputs, "ml_face_isface", true);
1842 OH_AI_TensorHandleArray outputs;
1843 for (size_t i = 0; i < 50; ++i) {
1844 printf("==========Model Predict==========\n");
1845 OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1846 ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
1847 }
1848 CompareResult(outputs, "ml_face_isface");
1849 OH_AI_ModelDestroy(&model);
1850 }
1851
1852
1853 // 正常场景:离线模型支持NNRT后端,Model创建一次,Build多次
1854 HWTEST(MSLiteTest, OHOS_OfflineModel_0005, Function | MediumTest | Level1) {
1855 if (!IsNNRTAvailable()) {
1856 printf("NNRt is not available, skip this test");
1857 return;
1858 }
1859
1860 printf("==========Init Context==========\n");
1861 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1862 ASSERT_NE(context, nullptr);
1863 AddContextDeviceNNRT(context);
1864 printf("==========Create model==========\n");
1865 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1866 ASSERT_NE(model, nullptr);
1867 printf("==========Build model==========\n");
1868 int ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1869 printf("==========build model return code:%d\n", ret);
1870 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1871 printf("==========Build model==========\n");
1872 int ret2 = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1873 printf("==========build model return code:%d\n", ret2);
1874 ASSERT_EQ(ret2, OH_AI_STATUS_SUCCESS);
1875 OH_AI_ModelDestroy(&model);
1876 }
1877
1878
1879 // 异常场景:离线模型支持NNRT后端,ModelPredict,input为空
1880 HWTEST(MSLiteTest, OHOS_OfflineModel_0006, Function | MediumTest | Level1) {
1881 if (!IsNNRTAvailable()) {
1882 printf("NNRt is not available, skip this test");
1883 return;
1884 }
1885
1886 printf("==========Init Context==========\n");
1887 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1888 ASSERT_NE(context, nullptr);
1889 AddContextDeviceNNRT(context);
1890 printf("==========Create model==========\n");
1891 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1892 ASSERT_NE(model, nullptr);
1893 printf("==========Build model==========\n");
1894 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1895 printf("==========build model return code:%d\n", ret);
1896 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1897 printf("==========Model Predict==========\n");
1898 OH_AI_TensorHandleArray inputs;
1899 OH_AI_TensorHandleArray outputs;
1900 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1901 printf("==========Model Predict return code:%d\n", ret);
1902 ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
1903 OH_AI_ModelDestroy(&model);
1904 }
1905
1906
1907 // 异常场景:非离线模型支持NNRT后端,ms模型未转换为NNRT后端模型
1908 HWTEST(MSLiteTest, OHOS_OfflineModel_0007, Function | MediumTest | Level1) {
1909 if (!IsNNRTAvailable()) {
1910 printf("NNRt is not available, skip this test");
1911 return;
1912 }
1913
1914 printf("==========Init Context==========\n");
1915 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1916 ASSERT_NE(context, nullptr);
1917 AddContextDeviceNNRT(context);
1918 AddContextDeviceCPU(context); // nnrt算子支持有限,加cpu设备走异构推理
1919 printf("==========Create model==========\n");
1920 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1921 ASSERT_NE(model, nullptr);
1922 ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1923 }
1924
1925 // 正常场景:覆盖模型ml_ocr_cn
1926 HWTEST(MSLiteTest, OHOS_OfflineModel_0008, Function | MediumTest | Level1) {
1927 if (!IsNNRTAvailable()) {
1928 printf("NNRt is not available, skip this test");
1929 return;
1930 }
1931
1932 printf("==========Init Context==========\n");
1933 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1934 ASSERT_NE(context, nullptr);
1935 AddContextDeviceNNRT(context);
1936 printf("==========Create model==========\n");
1937 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1938 ASSERT_NE(model, nullptr);
1939 printf("==========Build model==========\n");
1940 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn_offline_model.ms",
1941 OH_AI_MODELTYPE_MINDIR, context);
1942 printf("==========build model return code:%d\n", ret);
1943 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1944 printf("==========GetInputs==========\n");
1945 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1946 ASSERT_NE(inputs.handle_list, nullptr);
1947 FillInputsData(inputs, "ml_ocr_cn", false);
1948 printf("==========Model Predict==========\n");
1949 OH_AI_TensorHandleArray outputs;
1950 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1951 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1952 CompareResult(outputs, "ml_ocr_cn");
1953 OH_AI_ModelDestroy(&model);
1954 }
1955
1956 // 正常场景:离线模型覆盖NPU
1957 HWTEST(MSLiteTest, OHOS_OfflineModel_0009, Function | MediumTest | Level1) {
1958 if (!IsNPU()) {
1959 printf("NNRt is not NPU, skip this test");
1960 return;
1961 }
1962
1963 printf("==========Init Context==========\n");
1964 OH_AI_ContextHandle context = OH_AI_ContextCreate();
1965 ASSERT_NE(context, nullptr);
1966 AddContextDeviceNNRT(context);
1967 printf("==========Create model==========\n");
1968 OH_AI_ModelHandle model = OH_AI_ModelCreate();
1969 ASSERT_NE(model, nullptr);
1970 printf("==========Build model==========\n");
1971 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/tinynet.om.ms",
1972 OH_AI_MODELTYPE_MINDIR, context);
1973 printf("==========build model return code:%d\n", ret);
1974 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1975 printf("==========GetInputs==========\n");
1976 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1977 ASSERT_NE(inputs.handle_list, nullptr);
1978 for (size_t i = 0; i < inputs.handle_num; ++i) {
1979 OH_AI_TensorHandle tensor = inputs.handle_list[i];
1980 float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1981 size_t element_num = OH_AI_TensorGetElementNum(tensor);
1982 std::random_device rd;
1983 std::mt19937 gen(rd());
1984 std::uniform_real_distribution<float> dis(0.0f,1.0f);
1985 for (int z=0;z<element_num;z++) {
1986 input_data[z] = dis(gen);
1987 }
1988 }
1989 printf("==========Model Predict==========\n");
1990 OH_AI_TensorHandleArray outputs;
1991 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1992 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1993 OH_AI_ModelDestroy(&model);
1994 }
1995
1996 // 正常场景:delegate异构,使用低级接口创建nnrt device info,选取第一个NNRT设备
1997 HWTEST(MSLiteTest, OHOS_NNRT_0001, Function | MediumTest | Level1) {
1998 printf("==========Init Context==========\n");
1999 OH_AI_ContextHandle context = OH_AI_ContextCreate();
2000 ASSERT_NE(context, nullptr);
2001 AddContextDeviceNNRT(context);
2002 AddContextDeviceCPU(context);
2003 printf("==========Create model==========\n");
2004 OH_AI_ModelHandle model = OH_AI_ModelCreate();
2005 ASSERT_NE(model, nullptr);
2006 printf("==========Build model==========\n");
2007 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2008 OH_AI_MODELTYPE_MINDIR, context);
2009 printf("==========build model return code:%d\n", ret);
2010 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2011 printf("==========GetInputs==========\n");
2012 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2013 ASSERT_NE(inputs.handle_list, nullptr);
2014 FillInputsData(inputs, "ml_face_isface", true);
2015 printf("==========Model Predict==========\n");
2016 OH_AI_TensorHandleArray outputs;
2017 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2018 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2019 CompareResult(outputs, "ml_face_isface");
2020 OH_AI_ModelDestroy(&model);
2021 }
2022
2023 // 正常场景:delegate异构,使用高级接口创建nnrt device info,根据类型确定NNRT设备
2024 HWTEST(MSLiteTest, OHOS_NNRT_0002, Function | MediumTest | Level1) {
2025 printf("==========Init Context==========\n");
2026 OH_AI_ContextHandle context = OH_AI_ContextCreate();
2027 ASSERT_NE(context, nullptr);
2028 AddContextDeviceNNRTByType(context);
2029 AddContextDeviceCPU(context);
2030 printf("==========Create model==========\n");
2031 OH_AI_ModelHandle model = OH_AI_ModelCreate();
2032 ASSERT_NE(model, nullptr);
2033 printf("==========Build model==========\n");
2034 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2035 OH_AI_MODELTYPE_MINDIR, context);
2036 printf("==========build model return code:%d\n", ret);
2037 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2038 printf("==========GetInputs==========\n");
2039 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2040 ASSERT_NE(inputs.handle_list, nullptr);
2041 FillInputsData(inputs, "ml_face_isface", true);
2042 printf("==========Model Predict==========\n");
2043 OH_AI_TensorHandleArray outputs;
2044 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2045 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2046 CompareResult(outputs, "ml_face_isface");
2047 OH_AI_ModelDestroy(&model);
2048 }
2049
2050 // 正常场景:delegate异构,使用高级接口创建nnrt device info,根据名称确定NNRT设备
2051 HWTEST(MSLiteTest, OHOS_NNRT_0003, Function | MediumTest | Level1) {
2052 printf("==========Init Context==========\n");
2053 OH_AI_ContextHandle context = OH_AI_ContextCreate();
2054 ASSERT_NE(context, nullptr);
2055 AddContextDeviceNNRTByName(context);
2056 AddContextDeviceCPU(context);
2057 printf("==========Create model==========\n");
2058 OH_AI_ModelHandle model = OH_AI_ModelCreate();
2059 ASSERT_NE(model, nullptr);
2060 printf("==========Build model==========\n");
2061 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2062 OH_AI_MODELTYPE_MINDIR, context);
2063 printf("==========build model return code:%d\n", ret);
2064 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2065 printf("==========GetInputs==========\n");
2066 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2067 ASSERT_NE(inputs.handle_list, nullptr);
2068 FillInputsData(inputs, "ml_face_isface", true);
2069 printf("==========Model Predict==========\n");
2070 OH_AI_TensorHandleArray outputs;
2071 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2072 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2073 CompareResult(outputs, "ml_face_isface");
2074 OH_AI_ModelDestroy(&model);
2075 }
2076
2077 // 正常场景:delegate异构,使用高低级接口创建nnrt device info,多输入单输出
2078 HWTEST(MSLiteTest, OHOS_NNRT_0004, Function | MediumTest | Level1) {
2079 printf("==========Init Context==========\n");
2080 OH_AI_ContextHandle context = OH_AI_ContextCreate();
2081 ASSERT_NE(context, nullptr);
2082 AddContextDeviceNNRT(context);
2083 AddContextDeviceCPU(context);
2084 printf("==========Create model==========\n");
2085 OH_AI_ModelHandle model = OH_AI_ModelCreate();
2086 ASSERT_NE(model, nullptr);
2087 printf("==========Build model==========\n");
2088 OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite.ms",
2089 OH_AI_MODELTYPE_MINDIR, context);
2090 printf("==========build model return code:%d\n", ret);
2091 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2092 printf("==========GetInputs==========\n");
2093 OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2094 ASSERT_NE(inputs.handle_list, nullptr);
2095 FillInputsData(inputs, "ml_headpose_pb2tflite", false);
2096 printf("==========Model Predict==========\n");
2097 OH_AI_TensorHandleArray outputs;
2098 ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2099 ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2100 CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
2101 OH_AI_ModelDestroy(&model);
2102 }
2103
2104