kpu
kpu是通用的神經網路處理器,它可以在低功耗的情況下實現卷積神經網路計算,時時獲取被檢測目標的大小、座標和種類,對人臉或者物體進行檢測和分類。
kpu 具備以下幾個特點:支援主流訓練框架按照特定限制規則訓練出來的定點化模型
對網路層數無直接限制,支援每層卷積神經網路引數單獨配置,包括輸入輸出通道數目、輸入輸 出行寬列高
支援兩種卷積核心 1x1 和 3x3
支援任意形式的啟用函式
實時工作時最大支援神經網路引數大小為 5.5mib 到 5.9mib
非實時工作時最大支援網路引數大小為(flash 容量-軟體體積)
1. 模組方法
1.1. 載入模型
從flash或者檔案系統中載入模型
import kpu as kpu
task = kpu.load(offset or file_path)
引數offtset: 模型在 flash 中的偏移大小,如 0xd00000 表示模型燒錄在13m起始的地方
file_path: 模型在檔案系統中為檔名, 如 「/sd/***.kmodel」
返回kpu_net: kpu 網路物件
1.2. 初始化yolo2網路
為yolo2網路模型傳入初始化引數
import kpu as kpu
task = kpu.load(offset or file_path)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
引數kpu_net: kpu 網路物件
threshold: 概率閾值
nms_value: box_iou 門限
anchor_num: 錨點數
anchor: 錨點引數與模型引數一致
1.3. 反初始化
import kpu as kpu
task = kpu.load(offset or file_path)
kpu.deinit(task)
引數kpu_net: kpu_load 返回的 kpu_net 物件
1.4. 執行yolo2網路
import kpu as kpu
import image
task = kpu.load(offset or file_path)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
img = image.image()
kpu.run_yolo2(task, img) #此處不對,請參考例程
引數kpu_net: kpu_load 返回的 kpu_net 物件
image_t:從 sensor 採集到的影象
返回list: kpu_yolo2_find 的列表
1.5. 網路前向運算(forward)
計算已載入的網路模型到指定層數,輸出目標層的特徵圖
import kpu as kpu
task = kpu.load(offset or file_path)
fmap=kpu.forward(task,img,3)
引數kpu_net: kpu_net 物件
image_t: 從 sensor 採集到的影象
int: 指定計算到網路的第幾層
返回fmap: 特徵圖物件,內含當前層所有通道的特徵圖
1.6. fmap 特徵圖
取特徵圖的指定通道資料到image物件
img=kpu.fmap(fmap,1)
引數fmap: 特徵圖 物件
int: 指定特徵圖的通道號
返回img_t: 特徵圖對應通道生成的灰度圖
1.7. fmap_free 釋放特徵圖
釋放特徵圖物件
kpu.fmap_free(fmap)
引數fmap: 特徵圖 物件返回無
1.8. netinfo
獲取模型的網路結構資訊
info=kpu.netinfo(task)
layer0=info[0]
引數kpu_net: kpu_net 物件
返回netinfo list:所有層的資訊list, 包含資訊為:index:當前層在網路中的層數
wi:輸入寬度
hi:輸入高度
wo:輸出寬度
ho:輸出高度
chi:輸入通道數
cho:輸出通道數
dw:是否為depth wise layer
kernel_type:卷積核型別,0為1x1, 1為3x3
pool_type:池化型別,0不池化; 1:2x2 max pooling; 2:...
para_size:當前層的卷積引數位元組數
2. 例程
執行人臉識別demo
import sensor
import image
import lcd
import kpu as kpu
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.rgb565)
sensor.set_framesize(sensor.qvga)
sensor.run(1)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(true):
img = sensor.snapshot()
code = kpu.run_yolo2(task, img)
if code:
for i in code:
print(i)
a = img.draw_rectangle(i.rect())
a = lcd.display(img)
a = kpu.deinit(task)
執行特徵圖
該模型是8bit定點模型,約380kb大小,層資訊為:
1 2 :160x120
3 4 5 6 :80x60
7 8 9 10 :40x30
11~16 :20x15import sensor
import image
import lcd
import kpu as kpu
index=3
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.rgb565)
sensor.set_framesize(sensor.qvga)
sensor.run(1)
task=kpu.load(0x300000)
img=image.image()
info=kpu.netinfo(task)
layer=info[index]
w=layer.wo()
h=layer.ho()
num=int(320*240/w/h)
list=[none]*num
x_step=int(320/w)
y_step=int(240/h)
img_lcd=image.image()
while true:
img=sensor.snapshot()
fmap=kpu.forward(task,img,index)
for i in range(0,num):
list[i]=kpu.fmap(fmap,i)
for i in range(0,num):
list[i].stretch(64,255)
for i in range(0,num):
a=img_lcd.draw_image(list[i],((i%x_step)*w,(int(i/x_step))*h))
lcd.display(img_lcd)
kpu.fmap_free(fmap)
物理處理器與邏輯處理器
記錄解決方案,自己實際處理過,方案可用,在自己的部落格中記錄一下。cpu central processing unit 是 處理單元,本文介紹物理cpu,物理cpu核心,邏輯cpu,以及他們三者之間的關係。乙個物理cpu可以有1個或者多個物理核心,乙個物理核心可以作為1個或者2個邏輯cpu。物理c...
處理器核心
處理器核心 cache 寫緩衝器 主存 輔助儲存器 寫操作,對核心而言非迫切,所以加乙個寫緩衝器很好。cache可放在處理器核心與mmu之間 邏輯 cache,主流 也可放在mmu與主存之間 物理 cache 對儲存器中相同或相鄰資料和 的反覆使用,是cache改善效能的主要原因。cache同時使用...
處理器排程
1 cpu排程的相關概念 a.cpu排程 其任務是控制 協調程序對cpu的競爭 即按一定的排程演算法從就緒佇列中選擇乙個程序,把cpu的使用權交給被選中的程序 如果沒有就緒程序,系統會安排乙個系統空閒程序或idle程序 b.cpu要解決的三個問題 cpu排程的時機 就緒佇列的改變引發了重新排程 事件...