TensorFlow Lite 官方仓库:
https://github.com/iysheng/tflite-micro
我的ART-Pi-smart仓库:
https://gitee.com/iysheng/ART-Pi-smart
经过了多天的摸索学习,今天将 TensorFlow Lite 的框架移植到了 ART-Pi Smart 上,但是还是存在一点问题,主要是 C++ 和 C 语言混合编译的问题,根据目前我的总结,具体体现在:
TensorFlow Lite 在函数中定义的静态对象无法正常构造,必须放在全局变量的位置
全局变量定义的对象只能使用默认的构造函数,无发使用带有参数的构造函数初始对象
1diff --git a/kernel/bsp/imx6ull-artpi-smart/applications/tflm_tree/examples/hello_world/main_functions.cc b/kernel/bsp/imx6ull-artpi-smart/applications/tflm_tree/examples/hello_world/main_functions.cc
2index a585ba7..a318c32 100644
3--- a/kernel/bsp/imx6ull-artpi-smart/applications/tflm_tree/examples/hello_world/main_functions.cc
4+++ b/kernel/bsp/imx6ull-artpi-smart/applications/tflm_tree/examples/hello_world/main_functions.cc
5@@ -37,18 +37,30 @@ constexpr int kTensorArenaSize = 2000;
6 uint8_t tensor_arena[kTensorArenaSize];
7 } // namespace
8
9+static tflite::MicroErrorReporter micro_error_reporter;
10+ // This pulls in all the operation implementations we need.
11+ // NOLINTNEXTLINE(runtime-global-variables)
12+ static tflite::AllOpsResolver resolver;
13+ static tflite::MicroInterpreter *static_interpreter;
14+
15 // The name of this function is important for Arduino compatibility.
16 void setup() {
17+
18+ DebugLog("setup begin.
");
19 tflite::InitializeTarget();
20
21+ DebugLog("initial ok.
");
22+
23 // Set up logging. Google style is to avoid globals or statics because of
24 // lifetime uncertainty, but since this has a trivial destructor it's okay.
25 // NOLINTNEXTLINE(runtime-global-variables)
26- static tflite::MicroErrorReporter micro_error_reporter;
27+ /* 这个地方有问题 */
28 error_reporter = µ_error_reporter;
29
30 // Map the model into a usable data structure. This doesn't involve any
31 // copying or parsing, it's a very lightweight operation.
32+ // printf("value:%x %u
", g_hello_world_model_data[0], g_hello_world_model_data_size);
33+
34 model = tflite::GetModel(g_hello_world_model_data);
35 if (model->version() != TFLITE_SCHEMA_VERSION) {
36 TF_LITE_REPORT_ERROR(error_reporter,
37@@ -57,15 +69,10 @@ void setup() {
38 model->version(), TFLITE_SCHEMA_VERSION);
39 return;
40 }
41-
42- // This pulls in all the operation implementations we need.
43- // NOLINTNEXTLINE(runtime-global-variables)
44- static tflite::AllOpsResolver resolver;
45-
46 // Build an interpreter to run the model with.
47- static tflite::MicroInterpreter static_interpreter(
48+ static_interpreter = new tflite::MicroInterpreter(
49 model, resolver, tensor_arena, kTensorArenaSize, error_reporter);
50- interpreter = &static_interpreter;
51+ interpreter = static_interpreter;
52
53 // Allocate memory from the tensor_arena for the model's tensors.
54 TfLiteStatus allocate_status = interpreter->AllocateTensors();
55@@ -102,6 +109,7 @@ int loop() {
56 if (invoke_status != kTfLiteOk) {
57 TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed on x: %f
",
58 static_cast<double>(x));
59+ printf("invoke status:%x
", invoke_status);
60 return -1;
61 }
参考的资料主要有:
1、tinyML基TensorFlow Lite在Arduino
2、https://github.com/iysheng/tflite-micro/blob/main/tensorflow/lite/micro/docs/new_platform_support.md
特别关键的一点是提取基础框架的文件:python3 tensorflow/lite/micro/tools/project_generation/create_tflm_tree.py -e hello_world /tmp/tflm-tree
1U-Boot 2017.03-g002b758ac9-dirty (Jul 08 2021 - 10:45:12 +0000)
2CPU: Freescale i.MX6ULL rev1.1 696 MHz (running at 396 MHz)
3CPU: Industrial temperature grade (-40C to 105C) at 44C
4Reset cause: POR
5Model: Freescale i.MX6 ULL 14x14 EVK Board
6Board: MX6ULL 14x14 EVK
7DRAM: 512 MiB
8MMC: FSL_SDHC: 0, FSL_SDHC: 1
9Display: TFT7016 (1024x600)
10Video: 1024x600x24
11In: serial
12Out: serial
13Err: serial
14switch to partitions #0, OK
15mmc1(part 0) is current device
16Net: eth0: ethernet@02188000 [PRIME]
17Normal Boot
18Hit any key to stop autoboot: 3 2 1 0
19ethernet@02188000 Waiting for PHY auto negotiation to complete.... done
20Using ethernet@02188000 device
21TFTP from server 10.20.52.39; our IP address is 10.20.52.89
22Filename 'rtthread.bin'.
23Load address: 0x80001000
24Loading: *#################################################################
25 ###############################################################
26 159.2 KiB/s
27done
28Bytes transferred = 1866656 (1c7ba0 hex)
29## Starting application at 0x80001000 ...
30 | /
31- RT - Thread Smart Operating System
32 / | 5.0.0 build Apr 30 2022
33 2006 - 2020 Copyright by rt-thread team
34do components initialization.
35initialize rti_board_end:0 done
36initialize dfs_init:0 done
37initialize rt_mmcsd_core_init:0 done
38initialize rt_usbd_winusb_class_register:0 done
39initialize futex_system_init:0 done
40initialize pmutex_system_init:0 done
41initialize lwip_system_initlwIP-2.1.2 initialized!
42:0 done
43initialize ulog_console_backend_init:0 done
44initialize ulog_init:0 done
45initialize rt_hw_adc_init:0 done
46initialize rt_hw_csi_init:0 done
47initialize rt_hw_dbg_mm_init:0 done
48initialize imx6ul_eth_initred first va=f00here 0000
49here 1111 mmu_l2=c107c000
50[31m[63] E/drv.enet: emac device init success
51[0m:0 done
52initialize rt_hw_i2c_init[32m[70] I/I2C: I2C bus [i2c1] registered
53[0m[32m[75] I/I2C: I2C bus [i2c3] registered
54[0m[32m[79] I/I2C: I2C bus [i2c4] registered
55[0m:0 done
56initialize rt_hw_elcd_init[86] D/drv.lcd: fb address => 0x811c0000
57:0 done
58initialize rt_hw_pwm_init:0 done
59initialize rt_hw_rtc_init:0 done
60initialize imxrt_mci_init:0 done
61initialize rt_hw_spi_init:0 done
62initialize gt911_init[31m[158] E/drv.enet: PHY Link down, please check the cable connection and link partner setting.
63[0m[32m[192] I/SDIO: emmc card capacity 3817472 KB.
64[0mfound part[0], begin: 2098176, size: 500.0MB
65found part[1], begin: 526386176, size: 1.0GB
66found part[2], begin: 1600128000, size: 10.0MB
67found part[3], begin: 1610613760, size: 200.0MB
68[32m[328] I/touch: rt_touch init success
69[0m[32m[332] I/gt911: touch device gt911 init success
70[0m:0 done
71initialize rt_usbd_init:0 done
72initialize rt_hw_wdt_init:0 done
73initialize null_device_init:0 done
74initialize random_device_init:0 done
75initialize urandom_device_init:0 done
76initialize zero_device_init:0 done
77initialize rt_work_sys_workqueue_init:0 done
78initialize ptmx_register:0 done
79initialize critical_init:0 done
80initialize rt_hw_ov5640_init:0 done
81initialize cplusplus_system_init:0 done
82initialize elm_init:0 done
83initialize dfs_romfs_init:0 done
84initialize rt_i2c_core_init:0 done
85initialize libc_system_init:0 done
86initialize clock_time_system_init:0 done
87initialize sal_init[32m[390] I/sal.skt: Socket Abstraction Layer initialize success.
88[0m:0 done
89initialize mnt_initemmc file system initialization done!
90:0 done
91initialize TF_lite_init[5309] D/drv.enet: enet1 link up
92:0 done
93initialize em_initopen em failed!
94:-1 done
95initialize set_adc_init:0 done
96initialize set_pwm_default:0 done
97initialize rt_sysinfo_init:0 done
98initialize finsh_system_init:0 done
99Red say: hello rt-smart.
100open lcd okwatchdog start ing.....
101test tf.
102setup begin.
103go here
104initial ok.
105get mode begin.
106get here ?
107get here 000?
108construct the class.
109init ok.
110x_value: 1.0*2^-127, y_value: 1.0297613*2^-7
111x_value: 1.0053092*2^-5, y_value: 1.8020826*2^-5
112x_value: 1.0053092*2^-4, y_value: 1.1584818*2^-4
113x_value: 1.507964*2^-4, y_value: 1.9308027*2^-4
114x_value: 1.0053092*2^-3, y_value: 1.0941217*2^-3
115x_value: 1.2566366*2^-3, y_value: 1.4802819*2^-3
116x_value: 1.507964*2^-3, y_value: 1.6733624*2^-3
117x_value: 1.7592913*2^-3, y_value: 1.8664425*2^-3
118x_value: 1.0053092*2^-2, y_value: 1.0619412*2^-2
119x_value: 1.130973*2^-2, y_value: 1.1584818*2^-2
特别地:
1x_value: 1.0*2^-127, y_value: 1.0297613*2^-7
2x_value: 1.0053092*2^-5, y_value: 1.8020826*2^-5
3x_value: 1.0053092*2^-4, y_value: 1.1584818*2^-4
4x_value: 1.507964*2^-4, y_value: 1.9308027*2^-4
5x_value: 1.0053092*2^-3, y_value: 1.0941217*2^-3
6x_value: 1.2566366*2^-3, y_value: 1.4802819*2^-3
7x_value: 1.507964*2^-3, y_value: 1.6733624*2^-3
8x_value: 1.7592913*2^-3, y_value: 1.8664425*2^-3
9x_value: 1.0053092*2^-2, y_value: 1.0619412*2^-2
10x_value: 1.130973*2^-2, y_value: 1.1584818*2^-2
11...
上述部分是模型估算的正弦函数的数据,我绘制成图表的效果如下:原文标题:在 ART-Pi Smart 上运行 TensorFlow Lite
文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。
全部0条评论
快来发表一下你的评论吧 !