TensorFlow Lite实现移植到ART-Pi Smart

描述

 

TensorFlow Lite

TensorFlow Lite 官方仓库:

https://github.com/iysheng/tflite-micro

我的ART-Pi-smart仓库:

https://gitee.com/iysheng/ART-Pi-smart

TensorFlow LiteTensorFlow Lite

 

经过了多天的摸索学习,今天将 TensorFlow Lite 的框架移植到了 ART-Pi Smart 上,但是还是存在一点问题,主要是 C++ 和 C 语言混合编译的问题,根据目前我的总结,具体体现在:
  • TensorFlow Lite 在函数中定义的静态对象无法正常构造,必须放在全局变量的位置

  • 全局变量定义的对象只能使用默认的构造函数,无发使用带有参数的构造函数初始对象

 针对上述两个现象,我在运行测试 Hello world 例程时,对 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
根据官方的文档,上述命令就可以将 hello_world 工程相关的文件提取到指定的 /tmp/tflm-tree 目录,下一步做的就是将这部分内容添加到 RT-Thread Smart 工程中,编译出来。相关的代码,我都上传到了我的 ART-Pi Smart 的仓库。如果有问题欢迎和我讨论。展示下,运行起来的效果,为了展示需要,删除了部分空行打印:
  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...
 上述部分是模型估算的正弦函数的数据,我绘制成图表的效果如下:
TensorFlow Lite效果还是不错的,这使用的是官方例程 16 * 16 * 1 的三层模型。  

原文标题:在 ART-Pi Smart 上运行 TensorFlow Lite

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分