AI嵌入式K210项目(18)-卷积人工神经网络硬件加速器 KPU


前言

K210内置了丰富的加速器,包括神经网络处理器 (KPU),AES(高级加密加速器),APU 麦克风阵列语音数据加速计算处理器,现场可编程 IO 阵列 (FPIOA),数字摄像头接口 (DVP),相对于软件可以极大的提高 AES 运算速度,快速傅里叶变换加速器 (FFT),安全散列算法加速器 (SHA256)。
本文介绍内置的卷积人工神经网络硬件加速器 KPU;

一、K210的KPU

KPU 是通用的神经网络处理器,它可以在低功耗的情况下实现卷积神经网络计算,实时获取被检测目
标的大小、坐标和种类,对人脸或者物体进行检测和分类。使用 kpu 时,必须结合 model compiler。

KPU 是通用神经网络处理器,内置卷积、批归一化、激活、池化运算单元,可以对人脸或物体进行实
时检测,具体特性如下:
• 支持主流训练框架按照特定限制规则训练出来的定点化模型
• 对网络层数无直接限制,支持每层卷积神经网络参数单独配置,包括输入输出通道数目、输入输
出行宽列高
• 支持两种卷积内核 1x1 和 3x3
• 支持任意形式的激活函数
• 实时工作时最大支持神经网络参数大小为 5.5MiB 到 5.9MiB
• 非实时工作时最大支持网络参数大小为(Flash 容量-软件体积)
在这里插入图片描述
KPU 的内部结构如下图所示:
在这里插入图片描述
对应的头文件 kpu.h

为用户提供以下接口:

• kpu_task_init (0.6.0 以后不再支持,请使用kpu_single_task_init):初始化kpu 任务句柄,该函数具体实现在model compiler 生成的gencode_output.c 中。

• kpu_run (0.6.0 以后不再支持,请使用kpu_start):启动KPU,进行AI 运算。

• kpu_get_output_buf (0.6.0 以后不再支持):获取KPU 输出结果的缓存。

• kpu_release_output_buf (0.6.0 以后不再支持):释放KPU 输出结果缓存。

• kpu_start:启动KPU,进行AI 运算。

• kpu_single_task_init:初始化kpu 任务句柄。

• kpu_single_task_deinit:注销kpu 任务。

• kpu_model_load_from_buffer:解析kmodel 并初始化kpu 句柄。

• kpu_load_kmodel:加载kmodel,需要与nncase 配合使用。

• kpu_model_free:释放kpu 资源。

• kpu_get_output:获取KPU 最终处理的结果。

• kpu_run_kmodel:运行kmodel。

二、实验过程

本实验代码较多,这里只贴出main.c的内容,其余内容稍后上传到gitCode上https://gitcode.com/bin_zhangg0n/K210/tree/main

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include "dvp.h"
#include "fpioa.h"
#include "lcd.h"
#include "ov2640.h"
#include "ov9655.h"
#include "plic.h"
#include "sysctl.h"
#include "uarths.h"
#include "st7789.h"
#include "dvp_cam.h"
#include "utils.h"
#include "kpu.h"
#include "l_conv.h"
#include "sleep.h"
#include "encoding.h"
#include "gpiohs.h"
#include "pin_config.h"
#include "dvp_cam.h"


int key_flag = 0;
gpio_pin_value_t key_state = 1;
volatile uint8_t g_ai_done_flag;
uint8_t g_ai_buf_out[320 * 240 * 3] __attribute__((aligned(128)));

/* KPU完成 */
static int kpu_done(void *ctx)
{
   
	g_ai_done_flag = 1;
	return 0;
}

//  卷积	池化	批归一化	激活	输出偏置
float conv_data[9*3*3] ={
   
//origin
//R
0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,
//G
0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,0,
//B
0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,
};

int demo_index=0;
const float conv_data_demo[4][9*3*3] ={
   
{
   	//origin
//R
0,0,0,0,1,0,0,0,0,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值