TinyML-6:移植到nrf52840淘宝开发板(带源码)

2021-01-24 22:23:23 浏览数 (3)

技术到了最后,都是要在实际生活中实践,才有活力;而不是曲高和寡,光是鼓吹技术多牛逼,没有切实改变生活,提高体验,产生经济价值,那样的技术都是耍流氓。

同样的,TInyML如果只在官方的几个平台玩,只跑hello word、magic wand多没有意思。笔者不是说一步到位,把Tensorflow lite micro玩出花,可以随便跨平台,搞出有趣应用;只是摸索出一套方法部分实践上解决跨平台的问题,可以移植到任意NRF52840的板子,有慧根的读者根据思路可以进一步扩展到其他平台。

来由

买了官方推荐的 ARDUINO NANO 33 BLE SENSE (¥330 海淘)的板子,同时手里有青风52840的板子(套件¥198,核心板¥20),想法很朴素:在TinyML官方例程跑熟练的基础上,把框架移植到同一芯片的平台的国内性价比模块上搞些好玩的应用。

过程

把同一核心芯片的应用从一个硬件平台(开发板)移植到另一个硬件平台;这样就能“旧瓶装新酒”,老平台的BLE通讯技术加上TyniML AI技术,岂不是母牛上天!想起来似乎很容易;但是问题没有那么简单。下图是我的探索路径,四处碰壁、断断续续。

image.pngimage.png

问题总结

问题总结起来有:

  • 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 官方论坛看到一个官方实习生也在解决类似问题,不过他用的另外一个高大上的双核硬件,思路由此打开了。下面是示意图:

image.pngimage.png

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背后的运行机制

0 人点赞