本次实践基于 Yahboom 的 K 210 开发套件。链接在此
本次实录主要是实现在 k 210 开发板上实现训练好的模型进行调用。
训练平台使用 Maixhub
开发板介绍我在这里就不过多说明了。官网文档上都有。
安装必备文件\软件
本次示例以 python 开发为主。如果要使用 c 开发,需要配置 cmake 以及使用 toolchain 文件,这里就不再说明了。
CH 340
CH 340 驱动是一个串口驱动,如果有其他开发板的开发经验,基本这个驱动都是安装过的。
解压CH340压缩包Uart drive(CH340).zip,并且双击打开CH341SER.EXE程序
安装完成之后,用Type-C数据线将K210开发板和电脑进行连接,然后依次右击桌面的‘此电脑’->‘属性’->‘设备管理器’->‘端口(COM和CPT)’,就会识别到相应的CH340端口。
NOTE
注:每台电脑的端口号都会不一样,只要是识别到了CH340就是我们需要的端口。
Kflash
K210的烧录工具为kflash,下载地址
下载完之后解压到本地。
打开K-Flash.exe,通过type-C数据线连接电脑与K210开发板。Device选择K210开发板的串口号。
Baud rate选择波特率。
Chip选择烧录到芯片还是烧录到SRAM,如果选择in-Chip则烧录到芯片,开机自动启动,断电保存;选择in-Memory则烧录到SRAM,断电后不会保存。
Firmware选择程序固件(.bin文件),这里我们选择之前编译生成的hello_world.bin文件。
勾选Open terminal after flash表示烧录完成后自动打开终端。
点击Flash开始烧录固件。
NOTE
这里的烧录过程后续会说到,这里只是简单的使用说明
CanMV IDE开发软件
这个软件就是主要的开发 IDE。
NOTE
请注意版本号,应该下载 v 2.9.2-1
因为后面的版本不再支持 k-210
下载后得到canmv-ide-windows-vx.x.x-gxxxxxx.exe文件,双击打开安装包。
具体安装过程不再赘述。
正式开发
烧录出厂固件
如果想要使用 python 开发程序,比如视觉相关的项目,就需要使用这个固件。
下载完成之后,要进行固件烧录。
打开上面下载的 Kflash ,选择这个固件,然后烧录。
如果失败,请检查设备管理器中是否正常识别到 K 210,以及核对 kflash 中的端口号是否正确。
烧录模型文件
如果你是自己训练的模型文件,一般格式要转换 nncase 形式。文件扩展名为 kmodel
注意,由于 k 210 内存有限,模型文件不要太大。
下载后则需要将模型文件导入到 TF 卡中,请提前准备读卡器。
将 TF 卡接入电脑之后请不要急着将模型导入。请先将 TF 卡格式化
IMPORTANT
注意,一定要将分配单元大小设置为32K
格式化之后再将模型文件放到根目录,不需要创建任何文件夹!
然后将内存卡弹出后插回 k 210 上。
IDE 连接 k 210
打开之前下载好的 CanmvIDE
打开之后先连接 K 210
在下面的弹窗中选择正确的端口号(在设备管理器中可以查看)
IMPORTANT
注意,需要打开“高级设置”,并将模式设置为 Mode-2
如果之前你正确的烧录了固件文件,并且保证端口号正确,这一步应该不会有什么问题。
写代码
再写代码之前需要注意的是,下面运行的代码并没有真正意义上的写入到 k 210 中,只是以缓存的形式运行。
代码如下:
import sensor, image, time, lcd
from maix import KPU
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 100)
clock = time.clock()
obj_name = ("aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor")
od_img = image.Image(size=(320,256))
anchor = (1.3221, 1.73145, 3.19275, 4.00944, 5.05587, 8.09892, 9.47112, 4.84053, 11.2364, 10.0071)
kpu = KPU()
print("ready load model")
# 这里的位置一定是“/sd/”后面加上路径(根目录开始)
<NolebasePageProperties />
kpu.load_kmodel("/sd/voc20_detect.kmodel")
kpu.init_yolo2(anchor, anchor_num=5, img_w=320, img_h=240, net_w=320 , net_h=256 ,layer_w=10 ,layer_h=8, threshold=0.7, nms_value=0.2, classes=20)
while True:
clock.tick()
img = sensor.snapshot()
od_img.draw_image(img, 0,0)
od_img.pix_to_ai()
kpu.run_with_output(od_img)
dect = kpu.regionlayer_yolo2()
fps = clock.fps()
if len(dect) > 0:
print("dect:",dect)
for l in dect :
img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0))
img.draw_string(l[0],l[1], obj_name[l[4]], color=(0, 255, 0), scale=1.5)
img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 128), scale=2.0)
lcd.display(img)
kpu.deinit()
上面的模型文件路径如果你按照我所说的将模型放到了根目录,上面的代码不需要更改。
具体的代码解释就不再赘述了
在连接成功的情况下,点击下面的运行,就可以直接运行当前查看的代码。
不出意外的话,k 210 上即可看到画面,并且模型运行成功。
将运行代码保存到 k 210
在连接的情况下,在上面的工具中选择 保存当前打开的脚本为(main.py)到 CanMV. Cam
将文件写入之后,将下面的连接断开即可实现开机即检测。
结果如下: