TinyMaix在x210开发板上的移植

时间:2024-04-30 22:03:24

目录

说明

环境准备

编译代码

源程序下载

修改tm_port.文件

修改CMake文件

测试程序运行


说明

我们教学中使用的x210开发板使用S5PV210这款CPU,它是根据三星的smdkv210开发板进行裁剪设计的,这个开发板非常的老了,不过在有经费购买新的开发板之前,仍然需要最大限度发掘它的能力。由于开发板的系统非常老,很多新的系统像TensorFlow Lite或者NCNN都无法在其上正常运行,所以我们尝试把嵌入式推理框架移植TinyMaix到x210开发板上。

TinyMaix是面向单片机的超轻量级的神经网络推理库,即TinyML推理库,可以在任意单片机上运行轻量级深度学习模型。有关TinyMaix的说明参见:TinyMaix/README_ZH.md at main · sipeed/TinyMaix · GitHubTinyMaix is a tiny inference library for microcontrollers (TinyML). - TinyMaix/README_ZH.md at main · sipeed/TinyMaixhttps://github.com/sipeed/TinyMaix/blob/main/README_ZH.md

环境准备

编译本软件所采用的是arm-2014.05-29交叉编译工具。

在Linux虚拟机中需要安装cmake,可以使用以下命令:

sudo apt‐get install cmake

编译代码

源程序下载

源代码下载地址:GitHub - sipeed/TinyMaix: TinyMaix is a tiny inference library for microcontrollers (TinyML).TinyMaix is a tiny inference library for microcontrollers (TinyML). - sipeed/TinyMaixhttps://github.com/sipeed/TinyMaix/tree/main

修改tm_port.文件

移植时需要先修改include/tm_port.h文件的内容如下:

#define TM_ARCH         TM_ARCH_NEON

如果希望提高程序运行的速度,也可以修改以下内容:

#define TM_OPT_LEVEL    TM_OPT1

修改CMake文件

TinyMaix目录下的CMakeList.txt文件负责编译TinyMaix的核心文件为静态库。Examples目录下的每个子目录中的CMakeList.txt文件负责编译对应的示例为可执行文件。下面以minist示例说明如何修改CMakeList.txt文件。用文本编辑器打开文件,并修改如下内容:

set(PREFIX "arm-none-linux-gnueabi-")
set(CMAKE_C_COMPILER "${PREFIX}gcc")
set(CMAKE_CXX_COMPILER "${PREFIX}g++")

project(minist)

set(CMAKE_AR "${PREFIX}ar")
set(CMAKE_RANLIB "${PREFIX}ranlib")
set(CMAKE_STRIP "${PREFIX}strip")

set(CMAKE_C_STANDARD 99)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 ")

修改文件后,执行以下命令即可:

cmake ./CMakeList.txt
make

测试程序运行

将minist文件拷贝到开发板上,然后执行即可得到推理结果。这个结果就是对一个像素点阵的内容进行数字的识别,识别的结果是数字2。

[root@x210v3 ~]# /mnt/minist

mnist demo

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,116,125,171,255,255,150, 93,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,169,253,253,253,253,253,253,218, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,169,253,253,253,213,142,176,253,253,122,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0, 52,250,253,210, 32, 12,  0,  6,206,253,140,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0, 77,251,210, 25,  0,  0,  0,122,248,253, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0, 31, 18,  0,  0,  0,  0,209,253,253, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,117,247,253,198, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 76,247,253,231, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,253,253,144,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,176,246,253,159, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 25,234,253,233, 35,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,198,253,253,141,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0, 78,248,253,189, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0, 19,200,253,253,141,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,134,253,253,173, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,248,253,253, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,248,253,253, 43, 20, 20, 20, 20,  5,  0,  5, 20, 20, 37,150,150,150,147, 10,  0,

  0,  0,  0,  0,  0,  0,  0,  0,248,253,253,253,253,253,253,253,168,143,166,253,253,253,253,253,253,253,123,  0,

  0,  0,  0,  0,  0,  0,  0,  0,174,253,253,253,253,253,253,253,253,253,253,253,249,247,247,169,117,117, 57,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,118,123,123,123,166,253,253,253,155,123,123, 41,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

================================ model stat ================================

mdl_type=0 (int8))

out_deq=1

input_cnt=1, output_cnt=1, layer_cnt=6

input 3dims: (28, 28, 1)

output 1dims: (1, 1, 10)

main buf size 1464; sub buf size 0

//Note: PARAM is layer param size, include align padding



Idx     Layer            outshape       inoft   outoft  PARAM   MEMOUT OPS

---     Input            28, 28,  1     -       0       0       784     0

###L71: body oft = 64

###L76: type=0, is_out=0, size=152, in_oft=0, out_oft=784, in_dims=[3,28,28,1], out_dims=[3,13,13,4], in_s=0.004, in_zp=-128, out_s=0.016, out_zp=-128

###L88: Conv2d: kw=3, kh=3, sw=2, sh=2, dw=1, dh=1, act=1, pad=[0,0,0,0], dmul=0, ws_oft=80, w_oft=96, b_oft=136

000     Conv2D           13, 13,  4     0       784     72      676     6084

###L71: body oft = 216

###L76: type=0, is_out=0, size=432, in_oft=784, out_oft=0, in_dims=[3,13,13,4], out_dims=[3,6,6,8], in_s=0.016, in_zp=-128, out_s=0.016, out_zp=-128

###L88: Conv2d: kw=3, kh=3, sw=2, sh=2, dw=1, dh=1, act=1, pad=[0,0,0,0], dmul=0, ws_oft=80, w_oft=112, b_oft=400

001     Conv2D            6,  6,  8     784     0       352     288     10368

###L71: body oft = 648

###L76: type=0, is_out=0, size=1360, in_oft=0, out_oft=1400, in_dims=[3,6,6,8], out_dims=[3,2,2,16], in_s=0.016, in_zp=-128, out_s=0.057, out_zp=-128

###L88: Conv2d: kw=3, kh=3, sw=2, sh=2, dw=1, dh=1, act=1, pad=[0,0,0,0], dmul=0, ws_oft=80, w_oft=144, b_oft=1296

002     Conv2D            2,  2, 16     0       1400    1280    64      4608

###L71: body oft = 2008

###L76: type=1, is_out=0, size=48, in_oft=1400, out_oft=0, in_dims=[3,2,2,16], out_dims=[1,1,1,16], in_s=0.057, in_zp=-128, out_s=0.022, out_zp=-128

003     GAP               1,  1, 16     1400    0       0       16      64

###L71: body oft = 2056

###L76: type=2, is_out=0, size=304, in_oft=0, out_oft=1448, in_dims=[1,1,1,16], out_dims=[1,1,1,10], in_s=0.022, in_zp=-128, out_s=0.151, out_zp=42

###L97: FC: ws_oft=64, w_oft=104, b_oft=264

004     FC                1,  1, 10     0       1448    240     10      160

###L71: body oft = 2360

###L76: type=3, is_out=1, size=48, in_oft=1448, out_oft=0, in_dims=[1,1,1,10], out_dims=[1,1,1,10], in_s=0.151, in_zp=42, out_s=0.004, out_zp=-128

005     Softmax           1,  1, 10     1448    0       0       10      60



Total param ~1.9 KB, OPS ~0.02 MOPS, buffer 1.4 KB



===tm_run use 0.000 ms

0: 0.004

1: 0.004

2: 0.996

3: 0.004

4: 0.000

5: 0.000

6: 0.004

7: 0.004

8: 0.004

9: 0.004

### Predict output is: Number 2, prob 0.996