K210入門,模型訓練+MaixPy呼叫模型
- 模型訓練
- MaixPY
本人使用的是Maix Dock,不同開發板自行進行微調
模型訓練
首先先去GITHUB上將yolo-for-k210專案轉移到碼云方便下載,
跳轉鏈接github →yolo-for-k210
然后看著作者的介紹一步一步把自己的環境搭建好再把相關工具下載好,比如:ncc,注意在準備環境的時候要 把pip源更換成國內源! 然后按照提示一步一步走下去…
MaixPY
將訓練好的模型轉換成Kmodel后,去下載對應的韌體,這里我使用的是官方的 maixpy_v0.5.0_22_g7ac6b09.bin 對應的下載鏈接在這里 → 韌體下載鏈接
在下載好韌體后將韌體和模型依次燒入到板子里我發現,板子是不能正常作業的所以這里將模型和韌體打包到一個檔案下成為一個新檔案 (.kfpkg)

這里注意將kmodel的地址設定為0x300000,韌體的地址設定為0x000000,然后將 .kfpkg 燒入到板子里,
然后打開MaixPY將下列代碼放入作業區↓
from fpioa_manager import *
from Maix import GPIO #從包 Maix 匯入了 GPIO 這個類
import sensor,image,lcd,time #匯入sensor、image、lcd、time模塊
import KPU as kpu
task = kpu.load(0x300000) #從flash或者系統檔案中加載模型,這里為模型在 flash 中的偏移大小為:0x3000000
fm.register(board_info.LED_R, fm.fpioa.GPIO0) #把 fm.fpioa.GPIO0 注冊到了 引腳 board_info.LED_R
led_r=GPIO(GPIO.GPIO0, GPIO.OUT) #把GPIO0設定成輸出
lcd.init(freq=15000000) #初始化LCD(freq為SPI通信速率)
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) #設定亮度(范圍為[-2~2])
#sensor.set_contrast(-1) #設定對比度(范圍為[-2,+2])
#sensor.set_auto_gain(1,2) #設定攝像自動增益模式
sensor.run(1) #影像捕捉控制(1:開始捕捉;0:關閉捕捉)
clock = time.clock() #獲取clock物件
classes = ['huanxiong']
anchor = (1, 1.2, 2, 3, 4, 3, 6, 4, 5, 6.5)
a = kpu.init_yolo2(task, 0.17, 0.3, 5, anchor) #為yolov2網路模型傳入初始化引數
#(task, 0.17, 0.3, 5, anchor)分別為 kpu網路物件、概率闕值、box_iou門限、錨點數、錨點引數與模型引數一致
while(True):
clock.tick() #記錄開始時間(ms)
img = sensor.snapshot() #使用攝像頭拍攝一張照片
#lcd.display(img) #在液晶屏上顯示一張 image
code = kpu.run_yolo2(task, img) #task為 kpu_load 回傳的 kpu_net 物件
#img為從sensor 采集到的影像
#run_yolo2回傳的值為kpu_yolo2_find 的串列
print("FPS當前為:",clock.fps()) #clock.fps于clock.tick搭配使用計算幀率
if code:
for i in code:
a=img.draw_rectangle(i.rect()) #在影像上繪制一個矩形,此處為作為元組傳遞回坐標框出矩形
#傳回的是檢測到的影像的四個坐標
a = lcd.display(img) #在液晶屏上顯示被框框框起來的image
led_r.value(0) #如果檢測到物體就亮LED燈
print("物體是:",classes[i.classid()])#列印出識別的類別
print("概率為:",100.00*i.value())#列印出置信度
for i in code:
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
#在左上角列印出id
lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
#在左上角列印出置信度
else:
a = lcd.display(img) #如果沒有識別出物體,則繼續呈現影像
led_r.value(1) #如果沒有檢測到物體就滅LED燈
a = kpu.deinit(task) #反初始化,kpu_load 回傳 kpu_net 物件
這里加上了控制板子上的LED燈代碼,實作識別到影像LED亮燈,沒識別到圖片LED燈滅的功能,后期可以再拓展為識別到影像通過wifi與上位機進行通訊,
訓練集是一組干脆面君
效果圖如下:
識別到目標:
沒識別到目標:

后期模型的識別精度還可以調整,或者使用YOLOV4或者更優秀的模型,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/198706.html
標籤:其他
上一篇:C#編程和網路編程入門
下一篇:一文搞懂I2C通信
