K210系列第一个示例程序

引言

关于K210的受众群体也算不少,在网上许多爱好者写了各种学习教程。本系列文章的目的是帮大家从众多信息中梳理一些关键步骤。

第一篇文章让大家了解K210芯片的性能如何,能做哪些事。

第二篇文章带大家配置好软硬件的开发环境。

本篇从官方示例教程出发,教大家如何在开发板上做图像算法和深度学习的部署。

下面是一些小编推荐的学习链接:

canaan-creative.com/dev:官网的链接,可以在上面下载SDK、datasheet以及演示Demo。

cn.dl.sipeed.com/shareU:包括了各种工具,固件的下载链接

wiki.sipeed.com/:包含了资料和文档的学习指南

MaixPy存储系统是如何设计的?

在给大家演示各种实例程序之前,有必要介绍一下MaixPy的存储系统,因为这块会涉及模型文件该从哪里读取的问题。

K210系列第一个示例程序_第1张图片

开发板内置了一块16M Flash区域,以及一个SD卡插槽,所以如果自己的模型较大可以放置在外插的SD卡中。这里我们说说Flash区域的地址分配,它由三部分组成:

  • 固件区
  • 模型区
  • 文件系统区

固件区的地址从0x000000开始,上一篇中我们通过kflash刷固件就是将系统程序烧在一个位置,K210也正是从此处开始运行程序。

模型区的地址从0x300000开始,可以通过kflash工具烧写到此位置,流程同固件的烧录。因为该区域不受文件系统的管理,所以需要根据烧写时的起始地址进行访问,比如:

v2-13745b797547e16ab0ded1a166558843_b.png

如果模型太大,可以将其拷贝到SD卡中,通过文件路径进行访问,但是读取速度不如直接从Flash中快。

文件系统区的地址从0xD00000开始,预留了3M的空间用于文件存储。该区域的文件系统会被自动挂载到/flash目录。

K210系列第一个示例程序_第2张图片

这里我们会看到在/flash目录下有三个文件:

  • freq.conf
  • main.py
  • config.json

开发板上电后会自动执行boot文件,然后在执行该处的main.py,如果想让自己的程序开机自启动,可以将程序拷贝到boot中或者写入main.py。

SD卡在上电后会被挂载到/sd,值得注意的是只能将数据写入/flash和/sd下。

为啥会有两块图像缓冲区?

在跑AI Demo之前,还有另一个需要关注的点就是MaixPy的图像缓冲区,否则你会发现在处理图像时常常会蹦出下面的错误:

K210系列第一个示例程序_第3张图片

MaixPy设计了两个缓冲区,即RGB565和RGB888。主要因为底层代码对图像操作和显示使用的是RGB565的内存块,而AI加速使用的KPU调用的是RGB888的内存块。

RGB565的格式存放着图像信息的一块内存,其在内存中的排序是[像素1 RGB, 像素2 RGB...]。

RGB88的格式存放着图像信息的一块内存,其在内存中的排序是[所有像素 R, 所有像素 G, 所有像素 B]。

K210系列第一个示例程序_第4张图片

由于在软件层面转换图像格式是一件比较耗时的事情,所以MaixPy在摄像头采集图片的时候,就从硬件上分了两路数据,一份保存在RGB565内存块,一份保存在RGB888内存块。

当执行图像的缩放,裁剪等操作时是从RGB565处取图像;当执行KPU内部运算时是从RGB888处取图片。那么有小伙伴会问,当将图像resize到某个尺寸后,再送入网络进行前向传播是不是会出现下面的情况?

K210系列第一个示例程序_第5张图片

所以这里提供了两个API用于数据同步,当更改了RGB565内存块中的图像数据后,如果希望KPU使用更改后的图像数据,需要执行pix_to_ai()函数将RGB565的数据更新到RGB888内存中,如下图所示:

K210系列第一个示例程序_第6张图片

KPU硬件加速需要注意点啥?

在K210上有一块专用的硬件加速单元,即KPU。类似于我们平时用的GPU,NPU,DSP等玩意。通常了解一款AI加速模块,我们会考虑这几个维度:

  • 支持多大的内存
  • 支持多少种算子
  • 支持哪些框架做模型转换
  • 如何在上面做前向传播

下图是一张KPU的工作原理,挂着镇楼。在KPU中一些基础操作并非是单独的加速模块,而是合成一体的加速模块,能够有效避免了CPU干预造成的损耗,但也丧失了一些操作上的灵活性。(图片来源于官方文档,如有侵权,联系删除)

K210系列第一个示例程序_第7张图片

K210对特征图尺寸(包括输入图像尺寸)有一定限制,宽高不得超过320×240,否则就会超出栈内存:

K210系列第一个示例程序_第8张图片

硬件支持的深度学习算子包括卷积、池化、激活、批归一化四大类,每一种算子的支持也有限制,比如:

  • 卷积层支持1×1和3×3两种核;
  • 池化层支持2×2和4×4两种位移;
  • 激活函数支持ReLU,ReLU6,Sigmoid,LReLU;

其他操作往往需要通过替换才能实现,比如:

  • matmul等价于4×4 Pad + 1×1 Conv + 1×1 Crop
  • transpose等价于SpaceToBatch + Conv + BatchToSpace

K210中的模型转换的环节,用户需要将开源框架训练的权重通过nncase工具转换成kmodel格式的模型。nncase是一个神经网络编译器,支持的权重格式包括tflite、caffe、onnx。具体使用可以查阅链接:github.com/kendryte/nnc

示例小程序

寻找绿色块

这是一个传统的图像处理小程序,设置绿色像素点的阈值,在图像中查找绿色的块状物体。跑这个Demo发现此IDE内置了一个调参神器,当我们手动给定一套阈值时,检测结果如图:

K210系列第一个示例程序_第9张图片

可以看到图像周围还是有一些像素点落在了阈值范围中,这时锁定图片,在颜色编辑器中调整阈值范围:

K210系列第一个示例程序_第10张图片

把这套阈值替换到程序代码中,再次检测杂点被过滤了

K210系列第一个示例程序_第11张图片

人脸检测

小编用的官方训练好并转换成kmodel格式的yolov2模型:face_model_at_0x300000.kfpkg,在下载模型的时候需要注意其与固件是否匹配,网上有V3和V4两种版本,该版本和ncc的模型转换有关,二者区别在于:

  • V3版本支持的算子较少,但是基本都采用硬件加速
  • V4版本支持的算子较多,但是部分算子是CPU运行

那么我们在下载固件的时候就要留意是选择***_kmodel_v4_***.bin的固件还是不带v4字样的固件版本。

这里可能大家会疑惑,不是说KPU需要的是kmodel格式的模型文件吗,怎么下载的是kfpkg?

v2-ff6809c74d6ba2de2c3cdeb8e821b82e_b.jpg

其实它是一个压缩文件,解压后我们可以看到里面有一个kmodel的人脸检测模型和一份json配置。可以通过kflash工具将压缩包直接上传到开发板。

这里也有一个疑惑,MaixPy的模型区因为没有文件系统,所以是通过地址进行访问,那么压缩包上传到开发板后,模型要从哪个地址读取呢?

K210系列第一个示例程序_第12张图片

打开压缩包中的flash-list.json配置,我们会发现访问地址原来烧录在这里的,所以当我们涉及多个模型时,可以在配置中分配好各自读取的首地址位置。

比如当我们要做一个人脸关键点检测时,通常需要检测模型+关键点提取模型配合。可以将检测模型存烧录在0x00200000,将关键点模型烧录在0x00300000。在通过kpu.load(address)分别调用。

小编没用摄像头的实时数据(主要不上镜),特地找了张网红脸合集图片,机器视觉应该会用参数说明什么是流水线量产吧~~~嘿嘿!

K210系列第一个示例程序_第13张图片

具体代码没几行,从官方Github即可下载到,略微不同之处在于:

需要先将下载好的图片通过IDE或者串口上传到开发板,这里会保存到/flash目录下;

  1. 读取图片后需要注意尺寸过大会超时内存限制,根据烧录估计的不同可用内存略有浮动,全功能固件只提供2M大小的RAM,精简版估计大约在5M的RAM;
  2. 最后千万记得将RGB565上图像处理的结果同步到RGB888,否则使用KPU后可能等来的是各种报错。

K210系列第一个示例程序_第14张图片

欢迎关注小编公众号,每周分享关于计算机视觉或无人驾驶感知方面的内容。

K210系列第一个示例程序_第15张图片

你可能感兴趣的:(计算机视觉,深度学习,java,人工智能,python)