kpu 處理器 KPU MaixPy 文件

2021-10-13 07:00:18 字數 4203 閱讀 8378

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排程的時機 就緒佇列的改變引發了重新排程 事件...