技术到了最后,都是要在实际生活中实践,才有活力;而不是曲高和寡,光是鼓吹技术多牛逼,没有切实改变生活,提高体验,产生经济价值,那样的技术都是耍流氓。
同样的,TInyML如果只在官方的几个平台玩,只跑hello word、magic wand多没有意思。笔者不是说一步到位,把Tensorflow lite micro玩出花,可以随便跨平台,搞出有趣应用;只是摸索出一套方法部分实践上解决跨平台的问题,可以移植到任意NRF52840的板子,有慧根的读者根据思路可以进一步扩展到其他平台。
来由
买了官方推荐的 ARDUINO NANO 33 BLE SENSE (¥330 海淘)的板子,同时手里有青风52840的板子(套件¥198,核心板¥20),想法很朴素:在TinyML官方例程跑熟练的基础上,把框架移植到同一芯片的平台的国内性价比模块上搞些好玩的应用。
过程
把同一核心芯片的应用从一个硬件平台(开发板)移植到另一个硬件平台;这样就能“旧瓶装新酒”,老平台的BLE通讯技术加上TyniML AI技术,岂不是母牛上天!想起来似乎很容易;但是问题没有那么简单。下图是我的探索路径,四处碰壁、断断续续。
问题总结
问题总结起来有:
- RTOS方面:ArduinoBLE33的OS是Mbed Arduino中间件,而52840淘宝板移植Mbed Arduino是个问题;
- 硬件(引脚)切换:ArduinoBLE33没有开源原理图,代码所涉及Pin管脚,是经过Arduino转换暴露出来的;曾经费劲力气铜鼓PIO框架系统把Arduino系统导入到青风52840,由于引脚不一致始终得不到预想的相应;
- SDK和C 11不匹配:TFLite的库或者程序是用C 11编译的,NRF老的SDK不支持C 11,MDK也需要设置不同编译选项才能支持,新的NRF芯片的SDK改了个NCF的新名称,有很多高大上的特性,但是想用NUS(Nordic Uart Service)不支持了。
工作项目时间因素最终改变原来的平台,选择ST硬件平台。ST Cube AI对TFLite Micro做了一层自己的封装,好用到爆。你生成的模型无论是keras还是saved_model都支持,直接导入。
不过个人私下因为个人兴趣想办法解决了。
问题解决
简单的说,在Nordic 官方论坛看到一个官方实习生也在解决类似问题,不过他用的另外一个高大上的双核硬件,思路由此打开了。下面是示意图:
1) 利用tflite-micro的make工具链生成工程(作为lib的include)
代码语言:txt复制#生成 TARGET nrf5340pdk_nrf5340_cpuapp TARGET cortex-m4 的工程
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=nrf5340pdk_nrf5340_cpuapp TARGET_ARCH=cortex-m4 generate_hello_world_make_project
2) 利用生成 zephyr 编译库(参考build log) libtensorflow-microlite.a
代码语言:txt复制west -vvv build -b nrf5340pdk_nrf5340_cpuapp -p
3) 生成的工程路径
代码语言:txt复制tensorflow/lite/micro/tools/make/gen/
├── nrf5340pdk_nrf5340_cpuapp_cortex-m33
│ ├── lib
│ │ └── libtensorflow-microlite.a
│ └── obj
│ └── tensorflow
├── nrf5340pdk_nrf5340_cpuapp_cortex-m4
│ ├── lib
│ │ └── libtensorflow-microlite.a
│ ├── obj
│ │ └── tensorflow
│ └── prj
│ └── hello_world
show me the code
https://github.com/flavorfan/nrf52840-fan
基于zypyr实现,关键技术其实就是zypyr的custom board支持,还有编译时支持external project 把tensorflow lite一起编译了,后面再把它搞成zypyr的库。以后开发就直接用这个库了。
Further Reading
- TinyML实践-1:What & Why TinyML?
- TinyML实践-2:How TinyML Works?
- TinyML实践-3:牛运动姿态识别的落地实现
- TinyML-4:(Quantization) 为什么int8足够用于ML
- TinyML-5:TFLite Quantization背后的运行机制