摘 要 以人工智能课程中的卷积神经网络算法为例,设计基于人工智能开发板的应用案例进行实验教学,在帮助学生掌握算法理论的同时,有效培养其工程实践能力。
关键词 人工智能;卷积神经网络;K210开发板;机器学习;边缘智能
中图分类号:G633.67 文献标识码:B
文章编号:1671-489X(2022)17-0031-03
0 引言
目前,人工智能课程教学已在中小学普遍实施,因课程专业理论体系涉及数学、计算机软硬件等课程基础,给课程的有效落地实施带来一定难度。日常教学如单纯等同于一般计算机语言教学,则会使学生感觉枯燥乏味;在教学实践中如恰当引入开源硬件单片机实验教学,则会使课程实施达到事半功倍的效果。机器学习系统的训练通常在电源充足和计算性能强劲的远程服务器中及云端进行,当训练完成后,机器学习系统就可以依据经验自动分析新的数据即推演。机器学习系统的推演过程通常在本地即在边缘设备完成。为此,为增强机器学习课程教学实效,突出工程实践性教学,教学中在通俗讲解机器学习课程算法基础和模型实现的基础上,增设边缘智能实验的教学设计环节,从而极大对提高学生学习的兴趣和课堂教学质量。以下从经典的深度学习模型卷积神经网络算法分析入手,基于K210开发板进行边缘智能实验设计。
1 卷积神经网络算法分析
通常数学卷积的卷积核需要翻转,而卷积神经网络的卷积是提取图像特征进行加权求和,不翻转,称为互相关,也称为不翻转卷积,其卷积核是根据数据训练学习的参数,不是给定的,无论翻转与否,对应的都是待学习的未知参数。卷积神经网络(CNN)与全连接神经网络(DNN)都属于前馈神经网络,其正向传播的算法原理大致相同,整个网络可看作一个复合函数。按照现有经典著作讲解卷积神经网络计算损失函数关于权重参数梯度的常规算法非常烦琐。为此,借鉴计算机进行矩阵运算转为向量运算这一思想,将卷积核和卷积层矩阵平铺拼接为向量形式,就得到类似全连接神经网络的前向传播公式,相应的反向传播求导就可以简化。
1.1 卷积图像转为列向量(求传播误差)
1.1.1 前向传播
将待卷积图像矩阵(按行向量优先)转为列向量X(活性值)、卷积核W(按行向量优先)拼接为行向量(与待卷积图像矩阵元素不相关的对应位置处以0为间隔拼接),以卷积子图像数为矩阵行数转换成新矩阵A,由矩阵相乘再加偏置向量b得到卷积后列向量Y(净活性值),等价于卷积图像与卷积核W做互相关运算(特称为正向卷积,为窄卷积)。卷积神经网络l层的前向传播公式变为:Y=AXl+b,Xl=f(Yl-1)。
1.1.2 反向传播
卷积操作通过仿射变换(Y=AX)可实现由高维特征到低维特征的转换,也可以转置A实现低维到高维的反向映射。如果对上述卷积核经铺开拼接得到的矩阵A进行转置,然后与低维输入向量Y做矩阵乘法即反向映射,得到高维输出向量X,等价于卷积核W与正向卷积的输出图像做数学卷积运算(称为转置卷积或反卷积,为宽卷积)[1]。
1.2 卷积核转为列向量(求参数梯度)
1.2.1 前向传播 将卷积核矩阵所有行拼接为一个列向量(W),将输入图像X每个卷积子图像(按照行优先)拼接为一个行向量,所有卷积子图像形成的行向量按原定的卷积顺序组合形成矩阵A(矩阵行数为卷积子图像数),前向传播公式等价为:Y=AW+b。
1.2.2 反向传播
同样可以借助转置卷积,此转置卷积等价于输入卷积图像与卷积输出图像做互相关运算(为窄卷积)。根据卷积核或卷积图像转为列向量的前向传播公式对偏置向量求导,为便于与对W求偏导数相统一,借助将卷积核转为列向量的前向传播公式Y=AW+b求导。
1.3 汇聚层求导
因汇聚层为下采样操作,当第l层为汇聚层时,采取上采样由l层的损失函数误差得到第l-1层的损失函数误差。上采样之后,由于汇聚是一个线性函数的过程,因此要求针对上一层的Yl-1的梯度,中间只有一个上一层的Yl-1到Xl的激活函数。汇聚层下采样有平均汇聚和最大汇聚两种方法。
2 边缘智能实验设计
剖析卷积神经网络模型算法原理后,便可以借助TensorFlow等深度学习开发框架进行模型训练和测试,通常将由TensorFlow保存的HDF5模型转换为TFLite格式,在正式进入边缘智能实验之前,由于NNC模型量化工具对TFLite格式支持较好,故需在电脑上将训练完成的模型转换为TFLite格式后再进行量化,生成KModel格式模型(由NNCase
工具转换)供K210单片机调用。K210芯片架构包含一个自研的神经网络硬件加速器KPU以便进行卷积神经网络运算。KPU支持主流训练框架按照特定限制规则训练出来的定点化模型。教学实践中以亚博智能K210开发板为载体,下载已在外部设备训练好的普适模型,基于开发板自带传感设备采集的数据进行测试预测,从而实现一定功能。以下以亚博智能K210开发板(技术资料参考亚博智能K210开发板套件)为例,搭建基于C(亚博智能K210开发板随机资料只提供C语言学习代码)和Python两种嵌入式开发环境系统,调用卷积神经网络模型对人脸识别案例进行实验设计教学。
2.1 基于C语言的环境搭建
人脸检测技术,一是判断图片中是否包含人脸区域;二是如果图片中存在人脸,将人脸的位置预测出来。推荐在Win10系统下通过VSCode编辑器搭建K210的开发环境。
2.1.1 人脸检测技术代码流程及代码
1)系统内部初始化:①系统时钟初始化;②串口初始化;③硬件引脚初始化;④IO电压设置; ⑤系统中断初始化;⑥Flash初始化。
2)外部硬件初始化:①LCD初始化;②OV2640(摄像头)初始化。
3)人脸检测初始化:①模型加载;②人脸检测层配置初始化。
4)人脸检测业务逻辑层:①等待摄像头采集完成;②传入摄像头采集的图像到KPU运行模型;③等待KPU处理完成;④获取KPU最终处理的结果;⑤把KPU处理的结果带入区域层计算最终
位置;⑥根据获取的人脸个数进行逐一标记。
核心代码:
int main(void)
{
sysclock_init(); /*系统时钟初始化*/
uarths_init(); /*串口初始化*/
hardware_init(); /*硬件引脚初始化*/
io_set_power(); /*设置IO口电压*/
plic_init(); /*系统中断初始化*/
printf(“flash init\n”);
w25qxx_init(3, 0); /*Flash init*/
w25qxx_enable_quad_mode(); /*Flash 四
倍模式开启*/
/*KModel加载方式:1.分开烧录模式;
2.直接与代码合并编译*/
#if LOAD_KMODEL_FROM_FLASH
model_data = (uint8_t*)malloc(KMODEL_
SIZE + 255);
uint8_t *model_data_align(uint8_t*)(((uintptr_t)model_data+255)&(~255));
#else
uint8_t *model_data_align = model_data;
#endif
ov2640_init();
/*加载KModel,需要与NNCase配合使用*/
if (kpu_load_kmodel(&face_detect_task, model_
data_align) != 0)
{
printf(“\nmodel init error\n”);
while (1);
}
2.1.2 代码编译 把K210随机资料中的 face_
detection文件夹复制到SDK中的src目录下,然后进入build目录,删除build目录下所有文件,最后运行以下命令编译:
cmake .. -DPROJ=face_detection -G “MinGW Makefiles” make
编译完成后在build文件夹下生成对应文件名的待烧写二进制文件。
2.1.3 代码烧录
打开kflash下载程序将生成的待烧写二进制文件烧录到K210开发板。
2.2 基于MicroPython的环境搭建
下载MaixPy固件到K210开发板(相当于给开发板烧录系统),MaixPy使用MicroPython脚本语法[2],不像C语言一样需要编译,要使用MaixPy IDE,开发板固件必须是V0.3.1版本以上,否则MaixPy IDE连接不上开发板,使用前尽量都更新到最新版以保障能正常使用。通常一个固件文件中至少有四个文件,以“maixpy_v0.5.0_31_gd3e71c0”固件为例,具体说明如下。
1)eif_maixpy_v0.5.0_31_gd3e71c0.7z:普通用户不用关心,用于死机调试。
2)maixpy_v0.5.0_31_gd3e71c0_m5stickv:M5STACK环境。
3)maixpy_v0.5.0_31_gd3e71c0_minimum:MaixPy固件最小集合,不支持MaixPy IDE,不包含OpenMV的相关算法。
4)maixpy_v0.5.0_31_gd3e71c0.bin:完整版的MaixPy固件。
正常使用的完整版MaixPy固件,搭建步骤如下所示。
1)确定开发板:工具—选择开发板—kendryte KD233。
2)安装驱动,选择端口:工具—打开终端—串行端口—COM3—115200。
3)连接:图标绿色变红色表示已连接。
主要代码为:
import sensor
import image
import lcd
import KPU as kpu
import time
from Maix import FPIOA, GPIO
import gc
from fpioa_manager import fm
from board import board_info
import utime
task_fd = kpu.load(0x300000)
task_ld = kpu.load(0x400000)
task_fe = kpu.load(0x500000)
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_hmirror(0)
sensor.set_vflip(0)
sensor.skip_frames() /*跳过一些帧数,因为摄像头启动时图像没稳定*/
lcd.init(invert=1)
sensor.run(1)
3 结束语
在机器学习课程中引入边缘智能实验教学,可以弥补教学实施“重软轻硬”(即重视基础理论教学,忽视实践应用教学)的不足,引导一线教师重视边缘智能实践应用教学,有效提升人工智能课程的教学效益,为培养软硬能力兼备的技术应用人才奠定基础。
参考文献
[1] 邱锡鹏.神经网络与深度学习[M].北京:机械工业出版社,2020:115-129.
[2] 邵子扬.MicroPython入门指南[M].北京:电子工业出版社,2018:6-22.
*项目来源:2021年度山东省教育教学研究一般课题“中小学人工智能课程内容设计与实施范例研究”(课题编号:2021JXY383)。
作者:穆明,淄博市基础教育研究院,高级教师,研究方向为机器学习算法(255033)。