一、项目名称
基于CNN的智能垃圾分类及远程监控系统
二、项目概述
本项目旨在利用LPC55S69芯片双核计算资源,运用图像识别、智能控制技术实现智慧垃圾投放和监测系统。core0内核和powerquad将用来处理图像分类中的计算,并通过mailbox发送结果给core1内核;core1内核则负责实时监测垃圾桶状态。具体功能如下。
1)系统基于神经网络算法在开发板中实现图像识别,并结合机械装置对垃圾进行精确投放。2)监测垃圾桶的多维属性,如垃圾桶编号及满溢程序投入垃圾的种类、数量以及网络接入等状态,同时系统将周期性地将数据经由WIFI上传并在LCD屏上显示。
项目的想法是由最近国内大火的垃圾分类给出的灵感,目前大部分垃圾分类还都是由人工进行垃圾分类,这就导致了高昂的代价。所以我就想着能不能将深度学习加到垃圾分类中,这其中走了很多弯路。在项目初期,由于对深度学习还没有十分理解,这也导致在之后的模型训练以及移植到MCU里用了不少时间。
三、项目图
图3.1 整体实物图
图3.2 整体实物点亮图
项目使用了LPC55S69一块、SG90舵机一个、OV7670摄像头一个、HCSR04超声波传感器一个、LCD屏幕一块、ESP8266-wifi模块一个。
这三张图是三个设备的连线图,网络号对应与LPC55S69-EVK的网络号。另外摄像头使用了小板先转换为灰度图片,然后通过串口与开发板通信,使用USART0;ESP8266模块通过串口与开发板通信,使用USART2。
四、项目功能
图4.1 总流程图
整体流程为M4内核采集图像并进行图像推理,最后将数据经由mailbox发送给M0内核。而在M4内核处理大量运算和数据时,由于双核的使用,M0内核可以一直读取传感器数据并进行发送,当M4内核处理完一次数据后M0内核也能及时更新所需要发送的信息,大大提高了系统的实时性。在这里只加入了一个超声波传感器,没有再将温度、烟雾等传感器加进来,一是因为传感器代码的编写都是大同小异的,二是3V3引脚有点不够用了(XD)。
1、双核的使用
M4内核进行图像采集以及图像推理功能。
由于我一直觉得官方的SPI函数有一点问题(就像LPC55S69-evk上P8的RX和TX引脚标反了,SCTIMER来写PWM最低只有1KHz),所以我写了一个GPIO模拟SPI的程序驱动的LCD。程序很稳定,缺点就是刷新率低。
core1内核控制各种模块,接收core0内核推理后的结果,将结果和其他传感器数据经由wifi打包发送给上位机。
图4.2 上位机数据
图4.2是调试助手中收到的数据,每三个数据为一组,对应开发板中程序。
2、CNN
程序中使用了卷积神经网络(CNN,convolutional neural network)。AI这个东西,对于没有接触过的人就像黑匣子一样,神秘莫测。但发展到如今这个阶段,加上开发板性能的不端迭代提升,就算是做嵌入式开发,也可以接触和使用AI,让AI为我们服务。
本次比赛也是我第一次将神经网络加入到嵌入式开发板中的尝试,也学习了很多天,参考了不少代码,最终形成了一套VS编写的纯C版本的CNN代码和一套可以应用在LPC55S69中的程序。在开发板中的程序只能进行推理,VS中的程序可以进行训练和推理,代码在文末我也都会给出。使用流程就是在VS训练出模型,然后将模型移植到开发板中,开发板只需要按照模型进行推理就可以。所谓模型,其实就是我代码中core0内核程序的主函数中的一大堆的100K的数据,推理的过程就是利用这些参数进行数学运算的过程,所以可能理解其中的数学公式比较难,但是了解神经网络的流程和使用,还是不困难的。我也借此机会将这些代码分享出来。
图4.3 全连接神经网络图
图4.3是一个最简单的全连接神经网络的模型。中间两层是各使用了4个神经元,每一层之间进行全连接,最后得到输出。右边的公式就是神经网络中所应用的数学公式。
图4.4 垃圾分类CNN结构
图4.4是我的这套系统使用的模型的参数。模型是基于LeNet5模型修改的,比较粗糙。我也是AI路上的初学者,NXP官方有一套自己设计的微信CNN架构,使用了3层卷积,模型也只是90K左右,非常的厉害。
图4.5 训练集样式
图4.5是我自己拍的数据集,三类加起来一共也只有几百张。处理数据集的过程十分繁琐,所以一个好的数据集就很重要,自己弄出来的数据集在种类上、位置分布上、图片质量上都比不上那些标准数据集。
这三张图就是实物拍摄的效果。其中电池和纸板的实测效果很好,瓶子效果一般。从实图和训练集中的图不难看出,实际中的图很黑、亮度都不高,这也是导致瓶子效果不好的原因。虽然卷积神经网络能够很好的提取图像特征,但是由于在开发板中的模型很小,加上摄像头转成灰度时图像的处理过程失真严重,导致了瓶子效果不是很好(使用RGB效果更佳,但带来的是模型的大小问题,没有具体比较过)。
由于需要大量的计算,因此程序中也加入了powerquad的使用。但由于官方给出的powerquad函数精度只能为float,而我的模型计算的精度为double,因此我只能将powerquad应用在了少数几个函数上(开根号、指数运算)上。
图4.6 powerquad函数使用测试
图4.6是我对powerquad的第一次尝试使用。我将运算量最大的点积运算改为powerquad,在实际使用中,速度提升了很多(不止10倍),但是精度的不匹配导致输出结果错误。我也只能退而求其次将powerquad应用在部分不很影响运算过程的函数中。
3、性能
LPC55S69的性能很强,由于双核的使用,在主核心高速运算的同时从核心能够同时获取传感器数据、处理部分任务。
在本系统中,最需要资源的就是主核心采集和推理图片的过程,其他过程都是简单的数据传输,因此在主核心需要处理图片时,将开发板以150M全速前进,在处理完之后的部分时间内以12M低速运行,来降低电量消耗。
在使用LPC55S69的过程中,可以很好的感受到其功耗优势。在同一个开发板上,同时接入五个设备(包含一个显示屏)并且全速运行时,不会出现电压跳变。双核的运行也很稳定,就算是主频降低时,我在从核心中的CRC加密以及数据经由wifi的传输都没有出现掉帧的情况。
很遗憾的就是没有用上trustzone,本系统中很多数据都是动态获取的,最需要保存的就是神经网络的模型数据。但是神经网络太大,远远超过了trustzone的总大小。为了保证数据传输时的完整和安全,我在从核心代码中给传输数据加入了CRC编码。
五、演示视频、项目文档
演示视频和LPC55S69项目工程
六、VS-纯C版本CNN代码
VS-CNN代码
这份CNN代码里不是垃圾分类的数据集,里面包含了一份读入txt文件数据进行训练的数据。txt文件已经包含在工程中,打开工程即可运行,注意:请使用VS2019!
txt内的文件为我从串口获取的摄像头拍摄到的图片处理后的像素值,内容是0,1,2,3四个数的数据集。具体格式为28*28像素,0为黑,255为白。垃圾分类的数据集还没有采集完成,完成后我也会更新上来。 在某种程度上,神经网络理论上都是可以放进任何板子中的。这一套VS代码输出的数字集模型仅有27K,而垃圾分类系统中的模型使用了98K。通过对模型超参数的调整,再加上一个好的数据集,理论上都是可以以自己的需求,用多大的板子就训练出多大的模型。而且深度学习的好处不仅仅只在于我给出的图像识别方面,将数据集换成语音信号数据集等等也都是有效的。
VS代码可直接移植到开发板中(模型大小最好不要超过开发板ram的一半,以防超内存),具体使用见 五 中项目工程。