K210 MAIX DOCK 初探(一)——记"raccoon"检测调试记录
都说K210是业界良心,上周有幸入手一个欲探究竟,实物如下图所示。

在github上挑选了个“raccoon”检测例程用于调试,代码地址https://github.com/TonyZ1Min/yolo-for-k210,该仓库的文档做得比较详细,首先进行PC端的训练,训练完后能在工程目录下得到tmp.h5(7.4M左右)的训练模型,然后用ncc工具将其转化成kmodel文件,得到test.kmodel (1.8M左右),接下就是MCU端的配置。
首先给MCU上电,用kflash工具刷入MaixPy(这里使用的是maixpy_v0.5.0_22_g7ac6b09.bin,地址为0x000000)固件,一个清新亮眼的界面映入眼帘,如下图所示

按照接下来步骤应该将之前生成的kmodel同样地用kflash烧录进去,地址设为0x300000(5个零!),但烧录进去后,发现MaixPy IDE连不上MCU了,于是只得把MaixPy重新刷一遍才能重新连上,可见,把kmodel直接烧进板子的flash是不行的!这个问题怎么解决呢,查找了多个blog,有人提到要把MaixPy与kmodel一起烧进flash,并设置不同的地址,抱着试一试的想法,我在kflash工具中先加入MaixPy文件,地址为0x000000,如下图

再点【增加文件】选择kmodel文件,地址为0300000,如图

选择【打包为kfpkg】,将kmodel文件与Maixpy文件打包为kfpkg文件,之后再加载该文件,烧入flash

即可连接成功!而后在MaixPy IDE中调入以下测试程序
1 # Untitled - By: Administrator - 周二 6月 23 2020
2
3 import sensor,image,lcd,time
4 import KPU as kpu
5
6 lcd.init(freq=15000000)
7 sensor.reset()
8 sensor.set_pixformat(sensor.RGB565)
9 sensor.set_framesize(sensor.QVGA)
10 #sensor.set_hmirror(1)
11 #sensor.set_vflip(1)
12 sensor.set_windowing((224, 224))
13 sensor.set_brightness(2)
14 #sensor.set_contrast(-1)
15 #sensor.set_auto_gain(1,2)
16
17 sensor.run(1)
18 clock = time.clock()
19 classes = ['class_1']
20 task = kpu.load(0x300000)
21 anchor = (1, 1.2, 2, 3, 4, 3, 6, 4, 5, 6.5)
22 a = kpu.init_yolo2(task, 0.17, 0.3, 5, anchor)
23
24 while(True):
25 clock.tick()
26 img = sensor.snapshot()
27 #lcd.display(img)
28
29 code = kpu.run_yolo2(task, img)
30 print(clock.fps())
31 if code:
32 for i in code:
33 a=img.draw_rectangle(i.rect())
34 a = lcd.display(img)
35 print(i.classid(),i.value())
36 for i in code:
37 lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
38 lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
39 else:
40 a = lcd.display(img)
41
42 a = kpu.deinit(task)
选择运行后,发现黑屏!瞬间有被骗的感觉!只好进入调试模式,但MaixPy IDE没有单步调试,各位大佬有什么好的调试工具也欢迎评论一个,感谢万分!我用的是串口调试工具,putty 发现是模型加载,即task=kpu.load(0x300000)出了问题,若没有这句话,显示摄像机捕捉的画面是没有问题的!但这句话本身并没有问题呀!是哪里的问题呢?经过串口调试发现,其实在连通板子后加载模型就没有问题,但如果在以上代码处加载就会报“out of memory”的错误,这作何解释??但至少说明一点加载模型的位置不对,于是调整代码,如下:
# Untitled - By: Administrator - 周二 6月 23 2020
import sensor,image,lcd,time
import KPU as kpu
task = kpu.load(0x300000)
lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
#sensor.set_hmirror(1)
#sensor.set_vflip(1)
sensor.set_windowing((224, 224))
sensor.set_brightness(2)
#sensor.set_contrast(-1)
#sensor.set_auto_gain(1,2)
sensor.run(1)
clock = time.clock()
classes = ['class_1']
anchor = (1, 1.2, 2, 3, 4, 3, 6, 4, 5, 6.5)
a = kpu.init_yolo2(task, 0.17, 0.3, 5, anchor)
while(True):
clock.tick()
img = sensor.snapshot()
#lcd.display(img)
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)
print(i.classid(),i.value())
for i in code:
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
else:
a = lcd.display(img)
a = kpu.deinit(task)
即可正常运行!效果如图

总体来说,K210的帧率还不错,但精度不太理想,可能是和训练的样本数量太少有关,后续将结合caltech数据集尝试行人检测。

浙公网安备 33010602011771号