关于K210的受众群体也算不少,在网上许多爱好者写了各种学习教程。本系列文章的目的是帮大家从众多信息中梳理一些关键步骤。
第一篇文章让大家了解K210芯片的性能如何,能做哪些事。
第二篇文章带大家配置好软硬件的开发环境。
本篇从官方示例教程出发,教大家如何在开发板上做图像算法和深度学习的部署。
下面是一些小编推荐的学习链接:
https://canaan-creative.com/developer:官网的链接,可以在上面下载SDK、datasheet以及演示Demo。
https://cn.dl.sipeed.com/shareURL/MAIX/MaixPy:包括了各种工具,固件的下载链接
https://wiki.sipeed.com/:包含了资料和文档的学习指南
在给大家演示各种实例程序之前,有必要介绍一下MaixPy的存储系统,因为这块会涉及模型文件该从哪里读取的问题。
开发板内置了一块16M Flash区域,以及一个SD卡插槽,所以如果自己的模型较大可以放置在外插的SD卡中。这里我们说说Flash区域的地址分配,它由三部分组成:
固件区的地址从0x000000开始,上一篇中我们通过kflash刷固件就是将系统程序烧在一个位置,K210也正是从此处开始运行程序。
模型区的地址从0x300000开始,可以通过kflash工具烧写到此位置,流程同固件的烧录。因为该区域不受文件系统的管理,所以需要根据烧写时的起始地址进行访问,比如:
如果模型太大,可以将其拷贝到SD卡中,通过文件路径进行访问,但是读取速度不如直接从Flash中快。
文件系统区的地址从0xD00000开始,预留了3M的空间用于文件存储。该区域的文件系统会被自动挂载到/flash目录。
这里我们会看到在/flash目录下有三个文件:
开发板上电后会自动执行boot文件,然后在执行该处的main.py,如果想让自己的程序开机自启动,可以将程序拷贝到boot中或者写入main.py。
SD卡在上电后会被挂载到/sd,值得注意的是只能将数据写入/flash和/sd下。
在跑AI Demo之前,还有另一个需要关注的点就是MaixPy的图像缓冲区,否则你会发现在处理图像时常常会蹦出下面的错误:
MaixPy设计了两个缓冲区,即RGB565和RGB888。主要因为底层代码对图像操作和显示使用的是RGB565的内存块,而AI加速使用的KPU调用的是RGB888的内存块。
RGB565的格式存放着图像信息的一块内存,其在内存中的排序是[像素1 RGB, 像素2 RGB...]。
RGB88的格式存放着图像信息的一块内存,其在内存中的排序是[所有像素 R, 所有像素 G, 所有像素 B]。
由于在软件层面转换图像格式是一件比较耗时的事情,所以MaixPy在摄像头采集图片的时候,就从硬件上分了两路数据,一份保存在RGB565内存块,一份保存在RGB888内存块。
当执行图像的缩放,裁剪等操作时是从RGB565处取图像;当执行KPU内部运算时是从RGB888处取图片。那么有小伙伴会问,当将图像resize到某个尺寸后,再送入网络进行前向传播是不是会出现下面的情况?
所以这里提供了两个API用于数据同步,当更改了RGB565内存块中的图像数据后,如果希望KPU使用更改后的图像数据,需要执行pix_to_ai()函数将RGB565的数据更新到RGB888内存中,如下图所示:
在K210上有一块专用的硬件加速单元,即KPU。类似于我们平时用的GPU,NPU,DSP等玩意。通常了解一款AI加速模块,我们会考虑这几个维度:
下图是一张KPU的工作原理,挂着镇楼。在KPU中一些基础操作并非是单独的加速模块,而是合成一体的加速模块,能够有效避免了CPU干预造成的损耗,但也丧失了一些操作上的灵活性。(图片来源于官方文档,如有侵权,联系删除)
K210对特征图尺寸(包括输入图像尺寸)有一定限制,宽高不得超过320×240,否则就会超出栈内存:
硬件支持的深度学习算子包括卷积、池化、激活、批归一化四大类,每一种算子的支持也有限制,比如:
其他操作往往需要通过替换才能实现,比如:
K210中的模型转换的环节,用户需要将开源框架训练的权重通过nncase工具转换成kmodel格式的模型。nncase是一个神经网络编译器,支持的权重格式包括tflite、caffe、onnx。具体使用可以查阅链接:https://github.com/kendryte/nncase
寻找绿色块
这是一个传统的图像处理小程序,设置绿色像素点的阈值,在图像中查找绿色的块状物体。跑这个Demo发现此IDE内置了一个调参神器,当我们手动给定一套阈值时,检测结果如图:
可以看到图像周围还是有一些像素点落在了阈值范围中,这时锁定图片,在颜色编辑器中调整阈值范围:
把这套阈值替换到程序代码中,再次检测杂点被过滤了
人脸检测
小编用的官方训练好并转换成kmodel格式的yolov2模型:face_model_at_0x300000.kfpkg,在下载模型的时候需要注意其与固件是否匹配,网上有V3和V4两种版本,该版本和ncc的模型转换有关,二者区别在于:
那么我们在下载固件的时候就要留意是选择***_kmodel_v4_***.bin的固件还是不带v4字样的固件版本。
这里可能大家会疑惑,不是说KPU需要的是kmodel格式的模型文件吗,怎么下载的是kfpkg?
其实它是一个压缩文件,解压后我们可以看到里面有一个kmodel的人脸检测模型和一份json配置。可以通过kflash工具将压缩包直接上传到开发板。
这里也有一个疑惑,MaixPy的模型区因为没有文件系统,所以是通过地址进行访问,那么压缩包上传到开发板后,模型要从哪个地址读取呢?
打开压缩包中的flash-list.json配置,我们会发现访问地址原来烧录在这里的,所以当我们涉及多个模型时,可以在配置中分配好各自读取的首地址位置。
比如当我们要做一个人脸关键点检测时,通常需要检测模型+关键点提取模型配合。可以将检测模型存烧录在0x00200000,将关键点模型烧录在0x00300000。在通过kpu.load(address)分别调用。
小编没用摄像头的实时数据(主要不上镜),特地找了张网红脸合集图片,机器视觉应该会用参数说明什么是流水线量产吧~~~嘿嘿!
具体代码没几行,从官方Github即可下载到,略微不同之处在于:
需要先将下载好的图片通过IDE或者串口上传到开发板,这里会保存到/flash目录下;
欢迎关注小编公众号,每周分享关于计算机视觉或无人驾驶感知方面的内容。