一、概述
很荣幸这次能拿到AIoT应用创新大赛的初赛资格。 深度学习和机器学习在安防、金融、消费等各个方面有着广泛的应用。随着神经网络算法的发展,模型精度越来越高,但是模型尺寸却越来越大,算法运算量和内存占用使得ANN的算法不适合在嵌入式端进行部署,这严重影响了神经网络算法的应用。因此,本设计尝试使用C 语言进行Lenet-5架构的前向传播,并将其应用于MNIST手写数字识别,从而使得TencentOS Tiny AIoT开发板具有智能识别手写数字的功能。
二、产品主要功能
由于一般的推理框架,如NCNN、TVM等会导致更多的依赖,因此本产品主要使用C 语言进行前向推断编写,具体代码在Gitee中。
本产品包含以下功能:
- 云端输入手写数字图像
- Lenet-5前向计算
- 串口打印分类输出
- 云端返回分类输出
具体流程框图如下:
三、算法原理
由于本项目准备使用C 进行无依赖的Lenet-5结果前向计算,因此这里简单叙述一下网络结构和训练过程。
卷积神经网络能够很好的利用图像的结构信息。LeNet-5是一个较简单的卷积神经网络。下图显示了CNN的基本结构:输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层。下面我们主要介绍卷积层和池化层。
3.1 卷积层
卷积层是卷积神经网络的核心基石。在图像识别里我们提到的卷积是二维卷积,即离散二维滤波器(也称作卷积核)与二维图像做卷积操作,简单的讲是二维滤波器滑动到二维图像上所有位置,并在每个位置上与该像素点及其领域像素点做内积。卷积操作被广泛应用与图像处理领域,不同卷积核可以提取不同的特征,例如边沿、线性、角等特征。在深层卷积神经网络中,通过卷积操作可以提取出图像低级到复杂的特征。
3.2 池化层
池化是非线性下采样的一种形式,主要作用是通过减少网络的参数来减小计算量,并且能够在一定程度上控制过拟合。通常在卷积层的后面会加上一个池化层。池化包括最大池化、平均池化等。其中最大池化是用不重叠的矩形框将输入层分成不同的区域,对于每个矩形框的数取最大值作为输出层,如上图所示。
3.3 Lenet-5
LeNet5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,全链接层。是其他深度学习模型的基础, 这里我们对LeNet5进行深入分析。同时,通过实例分析,加深对与卷积层和池化层的理解。
LeNet-5共有7层,不包含输入,每层都包含可训练参数;每个层有多个Feature Map,每个FeatureMap通过一种卷积滤波器提取输入的一种特征,然后每个FeatureMap有多个神经元。
四、产品亮点
由于本项目使用C 实现了Lenet-5的前向计算,因此速度非常快,同时减少了各种库的依赖,即插即用。