简介
开发板上手
学习K210最好的教程就是MaixPy官方的WiKi——MaixPy 文档简介 - Sipeed Wiki,本文的绝大部分内容也是从这里面引用的。
鄙人画的开发板已验证通过,详情见立创开源。
若想要验证软件功能,推荐购买Sipeed Maix Bit(带屏幕价格¥190),软件验证玩完成后,即可部署在鄙人设计的超迷你K210平台上。
首先,可以参考官方教程完成对功能的验证和开发环境的熟悉。
K210上手指南
K210可以使用裸机开发,也可以使用MaixPy IDE用Python进行开发。使用MaixPy IDE进行开发时,可以使用OpenMV库,可调用KPU加速神经网络算法。本文主讲使用MaixPy IDE开发将模型部署在K210上。接下来继续讲解。
训练模型
训练什么模型?
支持的模型类型
因为在开发板上面跑的模型是特定格式的,所以需要使用nncase将传统的模型转换成kmodel格式。故,训练模型也要考虑训练出来的模型格式能否被nncase转换。
必看:
K210 KPU硬件加速
nncase开源主页
支持的算子
kmodel V3 模型 和 V4 模型#
由于代码更新, 在过程中产生了两个大版本, V3
和 V4
, 其中 V3
模型是指用 nncase v0.1.0 RC5 转换出来的模型; V4
模型指用 nncase v0.2.0 转换出来的模型
两者有一定的不同,所以现在两者共存, V3
代码量更少,占用内存小,效率也高,但是支持的算子少; V4
支持的算子更多,但是都是软件实现的,没有硬件加速,内存使用更多,所以各有所长。 MaixPy 的固件也可以选择是否支持 V4
。
K210 的硬件环境
K210 有 6MB 通用 RAM 和 2MB KPU 专用 RAM。模型的输入和输出特征图存储在 2MB KPU RAM 中。权重和其他参数存储在 6MB 通用 RAM 中。
可以被 KPU 完全加速的算子
下面的约束需要全部满足。
- 特征图尺寸:输入特征图小于等于 320x240(WxH) 同时输出特征图大于等于 4x4(WxH),通道数在 1 到 1024。
- Same 对称 paddings (TensorFlow 在 stride=2 同时尺寸为偶数时使用非对称 paddings)。
- 普通 Conv2D 和 DepthwiseConv2D,卷积核为 1x1 或 3x3,stride 为 1 或 2。
- MaxPool(2x2 或 4x4) 和 AveragePool(2x2 或 4x4)。
- 任意逐元素激活函数 (ReLU, ReLU6, LeakyRelu, Sigmoid…), KPU 不支持 PReLU。
可以被 KPU 部分加速的算子
- 非对称 paddings 或 valid paddings 卷积, nncase 会在其前后添加必要的 Pad 和 Crop。
- 普通 Conv2D 和 DepthwiseConv2D,卷积核为 1x1 或 3x3,但 stride 不是 1 或 2. nncase 会把它分解为 KPUConv2D 和一个 StridedSlice (可能还需要 Pad)。
- MatMul, nncase 会把它替换为一个 Pad(到 4x4)+ KPUConv2D(1x1 卷积和) + Crop(到 1x1)。
- TransposeConv2D, nncase 会把它替换为一个 SpaceToBatch + KPUConv2D + BatchToSpace。
传统训练方式
能训练出可供nncase转化的模型文件即可,无论是YOLO v3还是YOLO v5,或者是TensorFlow等。
使用Mx-yolo进行训练
美丽、清爽的界面
界面使用了html、css、js共同完成,减少了软件出现崩溃闪退的情况。
更少的参数设置
目标检测和图像分类模型训练不需要再设置种类标签、计算Anchors等设置,这些都将在点击“开始训练”按钮后程序自动完成。
训练模型、测试模型、转换模型一次完成
模型训练完成后,程序将自动验证模型并转换模型,完成后找到训练记录,即可查看模型训练信息、预测结果、Loss图表、混淆矩阵、训练日志等内容。
集成图片标注工具、图片爬取工具、以及K210下载工具
带有汉化版的labelImg,并修复原版labelImg中的多个错误。
新版本的图片爬取工具,目前能够正常爬取主题图像。
更多可关注”import 创客“了解。
MaixHub在线训练
使用MaixHub进行训练
MaixHub主页
开源库
不算丰富,用来学习还可以,做项目不大行。
免费在线训练
免费云服务训练(图像分类、图像检测)
训练流程
转换与部署模型
可参考的教程:
20种目标分类-YOLO转化kmodel教程
口罩检测模型训练及其在K210部署
当然,你还是需要参考这两个网页:
K210 KPU硬件加速
nncase开源主页
还有下面俩网页:
部署模型到K210
nncase指令
其他常见问题:
nncase/FAQ_ZH.md
程序编写
建议先阅读阅读官方例程。
接下来是让让K210调用模型的代码。照猫画虎即可,如果不清楚某些函数的用法,官方WiKi的API手册。
from Maix import GPIO, I2S, FFT
import image, lcd, math,sensor,time,utime
import KPU as kpu
from fpioa_manager import fm
io_led_red = 14
#灯的颜色和对应代码配对,驼峰式
fm.register(io_led_red, fm.fpioa.GPIO0)
led_r=GPIO(GPIO.GPIO0, GPIO.OUT)
#对摄像头进行初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_brightness(2)
sensor.set_vflip(1)
sensor.run(1)
#初始化液晶屏
lcd.init(freq=15000000)
lcd.clear()
clock = time.clock()
#标签类名
classes = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat',
'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', 'person',
'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
#加载SD卡中的模型
task = kpu.load("/sd/yolo.kmodel")
##测试模型是否加载成功,如成功会返回模型地址和模型尺寸 测试使用
#lcd.draw_string(1, 1, str(task), lcd.RED, lcd.BLACK)
#设置锚框大小
anchor = (1.08, 1.19, 3.42, 4.41, 6.63, 11.38, 9.42, 5.11, 16.62, 10.52)
#初始化kpu yolo
#形参:模型尺寸,mp_obj
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
#用于计算FPS值
clock.tick()
img = sensor.snapshot()
code = kpu.run_yolo2(task, img)
print(clock.fps())
if code:
for i in code:
a=img.draw_rectangle(i.rect())
a = lcd.display(img)
for i in code:
if classes[i.classid()]=='person':
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
lcd.draw_string(i.x(), i.y()+12, '%.1f'%i.value(), lcd.RED, lcd.WHITE)
led_r.value(1)
utime.sleep_ms(1500)
else:
lcd.draw_string(i.x(), i.y(), '')
else:
a = lcd.display(img)
a = kpu.deinit(task)
(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
print(clock.fps())
拓展阅读
K210 kmodel 模型储存数据结构
同时运行多个模型、如内存不足