引言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

开发板上电后会自动执行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内存中,如下图所示:

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

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

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

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

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

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

  • 卷积层支持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。具体使用可以查阅链接:https://github.com/kendryte/nncase

示例小程序

寻找绿色块

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

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

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

人脸检测

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

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

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

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

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

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

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

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

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

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

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

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

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

K210系列第一个示例程序相关推荐

  1. C++ Boost库:简介和第一个示例程序

    文章目录 1. 简介 2. Boost库开发环境搭建 3. 一个简单的示例程序 4. hpp文件简介 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cas ...

  2. Spring开发环境搭建和第一个示例程序

    前言 虽然之前用过Spring,但是今天试着去搭建依然遇到了困难,而且上网找教程,很多写的是在web里使用Spring MVC的示例,官方文档里的getting start一开始就讲原理去了(可能打开 ...

  3. Panda3D学习 (1):小行星示例程序

    这是第一篇关于Panda3D的学习笔记,不求能给大家以帮助,只希望记录下自己学习的过程. 今天学习的是panda3D自带的第一个示例程序,小行星.相比起完整的把所有语法看一遍,我更喜欢从实践中学习. ...

  4. Remoting系列(二)----建立第一个入门程序

    http://www.cnblogs.com/Ring1981/archive/2006/07/23/455043.aspx Remoting系列(二)----建立第一个入门程序 下面的Remotin ...

  5. 【微信小程序系列】微信小程序超简单教程,基本语法,获取用户基本数据信息,实现对云数据库的增删改查及小程序外部api的引用示例(附源码)

    [微信小程序系列]微信小程序超简单教程 小程序项目结构 静态页面的构成 HTML:结构 css:样式 js:行为 小程序 页面全部存放在pages, 而且pages目录只能存放页面 页面包括4个文件, ...

  6. Electron系列教程——第二篇:第一个示例

    Electron系列教程--第二篇:第一个示例 一.楔子 在正式开始音乐播放器项目之前,还需要来个简单的案例,以便更好的理解Electron.如果你已经使用过Electron,可以跳过这篇. 本篇将实 ...

  7. OSG for Android新手教程系列(三)——HelloWorld,第一个示例

    在上一篇教程中,我对OSG for Android的项目配置进行了讲解.在本篇教程中,我将通过一个最简单的示例,来讲解如何在Android项目中使用OSG.网上几乎所有的第一个示例,用的都是OSG库中 ...

  8. 游戏开发计算机图形学杂项知识系列:OpenGL红宝书中第一个渲染程序Triangles常见问题归总

    游戏开发计算机图形学杂项知识系列:OpenGL红宝书中第一个渲染程序Triangles常见问题归总 声明:未经作者允许,严禁商用,转载请标明出处和来源,谢谢 转载自:https://www.cnblo ...

  9. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

最新文章

  1. 限制IP 访问 Oracle 的方法
  2. IIS网站打不开错误解决方案集锦(一):编译器错误消息: 编译器失败,错误代码为 -1073741502。...
  3. android studio编译找不到程序包,【图片】哥哥们,android studio 打包的安装包手机无法识别怎么破【androidstudio吧】_百度贴吧...
  4. 基于matlab 论文知网,基于MATLAB的校园图像处理与分析
  5. win7下的nginx小demo
  6. c语言归并排序数组不固定,归并排序非递归实现C语言
  7. 方向导数、梯度与梯度下降
  8. Android图片完整性检验,Android安全测试之应用完整性校验检测
  9. 基于二叉链表的树结构相等的判断
  10. 基于UDP的网络群聊系统
  11. 【python】微信朋友圈数据分析及可视化(爬虫+数据挖掘)
  12. c语言编程悬臂梁受力分析,悬臂梁受力分析.doc
  13. 奇怪的键盘按a截图了
  14. t00ls.php,php学习心历(2)-中文分词
  15. 三角形的缩放动画,不会做的看过来!
  16. PreferenceActivity 分屏显示 分析
  17. w ndows 10关机,Win10设置定时开关机休眠唤醒的方法
  18. jq加载json数据实现三级联动
  19. c语言“递归系列”:递归实现x的n次方
  20. Scala的安装和环境变量配置

热门文章

  1. [paper reading] RetinaNet
  2. [高光谱] (6w字巨详细) GitHub开源项目Hyperspectral-Classification的解析
  3. matlab2c使用c++实现matlab函数系列教程-acos函数
  4. zynq文档学习之GPIO和MIO和EMIO的基本介绍
  5. 华为鸿蒙os2.0系统beta,华为发布HarmonyOS 2系统:万物互联时代鸿蒙大一统
  6. Elasticsearch 日期时间处理
  7. 前端技术分享和发展网站总结
  8. 痴情研究java内存中的对象
  9. WebService实现文件上传下载
  10. Java Socket文件上传