都說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數據集嘗試行人檢測。