3386

帖子

0

TA的资源

五彩晶圆(中级)

21
 

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 的列表


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: 特征图对象,内含当前层所有通道的特征图

 
 

回复

3386

帖子

0

TA的资源

五彩晶圆(中级)

22
 

6. fmap 特征图
取特征图的指定通道数据到image对象
img=kpu.fmap(fmap,1)

 

参数
fmap: 特征图 对象
int: 指定特征图的通道号】

 

返回
img_t: 特征图对应通道生成的灰度图

 

7. fmap_free 释放特征图
释放特征图对象
kpu.fmap_free(fmap)

 

参数
fmap: 特征图 对象

 

返回

 

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:当前层的卷积参数字节数

 
 
 

回复

3386

帖子

0

TA的资源

五彩晶圆(中级)

23
 

KPU寄存器配置说明

芯片厂家没有给出寄存器手册,我们从kpu.c, kpu.h, Model Compiler中分析各寄存器定义。KPU的寄存器配置写在 kpu_layer_argument_t 结构体中,我们取standalone demo中的kpu demo中的gencode.c来分析.(https://github.com/kendryte/kendryte-standalone-demo/blob/master/kpu/gencode_output.c)

 

//层参数列表,共16层kpu_layer_argument_t la[] __attribute__((aligned(128))) = {
// 第0层{
 .kernel_offset.data = {
  .coef_row_offset = 0,		//固定为0
  .coef_column_offset = 0	//固定为0
 },
 .image_addr.data = {		//图像输入输出地址,一个在前,一个在后,下一层运算的时候翻过来,可以避免拷贝工作。
  .image_dst_addr = (uint64_t)0x6980,	//图像输出地址,int((0 if idx & 1 else (img_ram_size - img_output_size)) / 64)
  .image_src_addr = (uint64_t)0x0		//图像加载地址
 },
 .kernel_calc_type_cfg.data = {
  .load_act = 1,			//使能激活函数,必须使能(硬件设计如此),不使能则输出全为0
  .active_addr = 0,			//激活参数加载首地址,在kpu_task_init里初始化为激活折线表
  .row_switch_addr = 0x5,	//图像宽占用的单元数,一个单元64Byte.  ceil(width/64)=ceil(320/64)=5
  .channel_switch_addr = 0x4b0,			//单通道占用的单元数.  row_switch_addr*height=5*240=1200=0x4b0
  .coef_size = 0,			//固定为0
  .coef_group = 1			//一次可以计算的组数,因为一个单元64字节,
							//所以宽度>32,设置为1;宽度17~32,设置为2;宽度<=16,设置为4
 },
 .interrupt_enabe.data = {
  .depth_wise_layer = 0,	//常规卷积层,设置为0
  .ram_flag = 0,			//固定为0
  .int_en = 0,				//失能中断
  .full_add = 0				//固定为0
 },
 .dma_parameter.data = {	//DMA传输参数
  .dma_total_byte = 307199,		//该层输出16通道,即 19200*16=308200
  .send_data_out = 0,			//使能输出数据
  .channel_byte_num = 19199		//输出单通道的字节数,因为后面是2x2 pooling, 所以大小为160*120=19200
 },
 .conv_value.data = {		//卷积参数,y = (x*arg_x)>>shr_x
  .arg_x = 0x809179,		//24bit	乘法参数
  .arg_w = 0x0,
  .shr_x = 8,				//4bit	移位参数
  .shr_w = 0
 },
 .conv_value2.data = {		//arg_add = kernel_size * kernel_size * bw_div_sw * bx_div_sx =3x3x?x?
  .arg_add = 0
 },
 .write_back_cfg.data = {	//写回配置
  .wb_row_switch_addr = 0x3,		//ceil(160/64)=3
  .wb_channel_switch_addr = 0x168,	//120*3=360=0x168
  .wb_group = 1						//输入行宽>32,设置为1
 },
 .image_size.data = {	//输入320*240,输出160*120
  .o_col_high = 0x77,
  .i_col_high = 0xef,
  .i_row_wid = 0x13f,
  .o_row_wid = 0x9f
 },
 .kernel_pool_type_cfg.data = {
  .bypass_conv = 0,		//硬件不能跳过卷积,固定为0
  .pad_value = 0x0,		//边界填充0
  .load_para = 1,		//硬件不能跳过归一化,固定为1
  .pad_type = 0,		//使用填充值
  .kernel_type = 1,		//3x3设置为1, 1x1设置为0
  .pool_type = 1,		//池化类型,步长为2的2x2 max pooling
  .dma_burst_size = 15,	//dma突发传送大小,16字节;脚本中固定为16
  .bwsx_base_addr = 0,	//批归一化首地址,在kpu_task_init中初始化
  .first_stride = 0		//图像高度不超过255;图像高度最大为512。
 },
 .image_channel_num.data = {
  .o_ch_num_coef = 0xf,	//一次性参数加载可计算的通道数,16通道。4K/单通道卷积核数
						//o_ch_num_coef = math.floor(weight_buffer_size / o_ch_weights_size_pad)	
  .i_ch_num = 0x2,		//输入通道,3通道 RGB
  .o_ch_num = 0xf		//输出通道,16通道
 },
 .kernel_load_cfg.data = {
  .load_time = 0,		//卷积加载次数,不超过72KB,只加载一次
  .para_size = 864,		//卷积参数大小864字节,864=3(RGB)*9(3x3)*2*16
  .para_start_addr = 0,	//起始地址
  .load_coor = 1		//允许加载卷积参数
 }
},
   //第0层参数结束……
};

上表中还有些结构体内容没有填充,是在KPU初始化函数中填充:```kpu_task_t* kpu_task_init(kpu_task_t* task){
 la[0].kernel_pool_type_cfg.data.bwsx_base_addr = (uint64_t)&bwsx_base_addr_0;	//初始化批归一化表
 la[0].kernel_calc_type_cfg.data.active_addr = (uint64_t)&active_addr_0;		//初始化激活表
 la[0].kernel_load_cfg.data.para_start_addr = (uint64_t)¶_start_addr_0; 	//初始化参数加载
 ……	//共16层参数,逐层计算
 task->layers = la;
 task->layers_length = sizeof(la)/sizeof(la[0]);	//16层
 task->eight_bit_mode = 0;					//16bit模式
 task->output_scale = 0.12349300010531557;	//输出的缩放,偏置
 task->output_bias = -13.528212547302246;
 return task;
}```

 

 
 
 

回复

3386

帖子

0

TA的资源

五彩晶圆(中级)

24
 
本帖最后由 eagler8 于 2020-6-2 15:47 编辑

目录清单
MicroPython动手做(01)——春节后入手了一块K210芯片AI开发板 
https://bbs.eeworld.com.cn/thread-1115786-1-1.html

MicroPython动手做(02)——尝试搭建K210开发板的IDE环境
https://bbs.eeworld.com.cn/thread-1115831-1-1.html

MicroPython动手做(03)——零基础学MaixPy之开机运行
https://bbs.eeworld.com.cn/thread-1116184-1-1.html

MicroPython动手做(04)——零基础学MaixPy之基本示例
https://bbs.eeworld.com.cn/thread-1116438-1-1.html

MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏
https://bbs.eeworld.com.cn/thread-1116577-1-1.html

MicroPython动手做(06)——零基础学MaixPy之单目摄像头
https://bbs.eeworld.com.cn/thread-1116591-1-1.html

MicroPython动手做(07)——零基础学MaixPy之机器视觉
https://bbs.eeworld.com.cn/thread-1116617-1-1.html

MicroPython动手做(08)——零基础学MaixPy之识别颜色 
https://bbs.eeworld.com.cn/thread-1116662-1-1.html

MicroPython动手做(09)——零基础学MaixPy之人脸识别
https://bbs.eeworld.com.cn/thread-1116720-1-1.html

MicroPython动手做(10)——零基础学MaixPy之神经网络KPU
https://bbs.eeworld.com.cn/thread-1116925-1-1.html

MicroPython动手做(11)——搭建掌控板IDE环境
https://bbs.eeworld.com.cn/thread-1117964-1-1.html

MicroPython动手做(12)——掌控板之Hello World
https://bbs.eeworld.com.cn/thread-1118180-1-1.html

MicroPython动手做(13)——掌控板之RGB三色灯 
https://bbs.eeworld.com.cn/thread-1118275-1-1.html

MicroPython动手做(14)——掌控板之OLED屏幕
https://bbs.eeworld.com.cn/thread-1118389-1-1.html

MicroPython动手做(15)——掌控板之AB按键
https://bbs.eeworld.com.cn/thread-1118496-1-1.html

MicroPython动手做(16)——掌控板之图片图像显示
https://bbs.eeworld.com.cn/thread-1118945-1-1.html

MicroPython动手做(17)——掌控板之触摸引脚
https://bbs.eeworld.com.cn/thread-1119462-1-1.html

MicroPython动手做(18)——掌控板之声光传感器
https://bbs.eeworld.com.cn/thread-1119583-1-1.html

MicroPython动手做(19)——掌控板之蜂鸣器与音乐
https://bbs.eeworld.com.cn/thread-1119668-1-1.html

MicroPython动手做(20)——掌控板之三轴加速度
https://bbs.eeworld.com.cn/thread-1119998-1-1.html

MicroPython动手做(21)——掌控板之磁场传感器
https://bbs.eeworld.com.cn/thread-1120188-1-1.html

MicroPython动手做(22)——掌控板之无线广播
https://bbs.eeworld.com.cn/thread-1120835-1-1.html

MicroPython动手做(23)——掌控板之WiFi与蓝牙
https://bbs.eeworld.com.cn/thread-1120934-1-1.html

MicroPython动手做(24)——掌控板之拓展掌控宝 
https://bbs.eeworld.com.cn/thread-1121208-1-1.html

MicroPython动手做(25)——语音合成与语音识别
https://bbs.eeworld.com.cn/thread-1123752-1-1.html

MicroPython动手做(26)——物联网之OneNET
https://bbs.eeworld.com.cn/thread-1125172-1-1.html

MicroPython动手做(27)——物联网之微信小程序
https://bbs.eeworld.com.cn/thread-1125520-1-1.html

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表