查看: 5633|回复: 9

[作品提交] 基于CNN的智能垃圾分类及远程监控系统

[复制链接]
  • TA的每日心情

    2021-7-20 10:12
  • 签到天数: 46 天

    [LV.5]常住居民I

    17

    主题

    93

    帖子

    0

    高级会员

    Rank: 4

    积分
    769
    最后登录
    2022-1-3
    发表于 2019-12-20 20:06:37 | 显示全部楼层 |阅读模式
    一、项目名称     
           基于CNN的智能垃圾分类及远程监控系统

    二、项目概述
          本项目旨在利用LPC55S69芯片双核计算资源,运用图像识别、智能控制技术实现智慧垃圾投放和监测系统。core0内核和powerquad将用来处理图像分类中的计算,并通过mailbox发送结果给core1内核;core1内核则负责实时监测垃圾桶状态。具体功能如下。
      1)系统基于神经网络算法在开发板中实现图像识别,并结合机械装置对垃圾进行精确投放。2)监测垃圾桶的多维属性,如垃圾桶编号及满溢程序投入垃圾的种类、数量以及网络接入等状态,同时系统将周期性地将数据经由WIFI上传并在LCD屏上显示。
      项目的想法是由最近国内大火的垃圾分类给出的灵感,目前大部分垃圾分类还都是由人工进行垃圾分类,这就导致了高昂的代价。所以我就想着能不能将深度学习加到垃圾分类中,这其中走了很多弯路。在项目初期,由于对深度学习还没有十分理解,这也导致在之后的模型训练以及移植到MCU里用了不少时间。
    三、项目图
         

    整体

    整体
    图3.1 整体实物图
       

    整体

    整体
        图3.2 整体实物点亮图

           项目使用了LPC55S69一块、SG90舵机一个、OV7670摄像头一个、HCSR04超声波传感器一个、LCD屏幕一块、ESP8266-wifi模块一个。

    QQ图片20191220190513.png QQ图片20191220191404.png QQ图片20191220191401.png

          这三张图是三个设备的连线图,网络号对应与LPC55S69-EVK的网络号。另外摄像头使用了小板先转换为灰度图片,然后通过串口与开发板通信,使用USART0;ESP8266模块通过串口与开发板通信,使用USART2。

    四、项目功能
       LPC软件框架图.png

    图4.1 总流程图

           整体流程为高性能内核采集图像并进行图像推理,最后将数据经由mailbox发送给一个内核。而在M33内核处理大量运算和数据时,由于双核的使用,一个内核可以一直读取传感器数据并进行发送,当内核处理完一次数据后内核也能及时更新所需要发送的信息,大大提高了系统的实时性。

    1、双核的使用

         高性能内核进行图像采集以及图像推理功能。

         由于我一直觉得官方的SPI函数有一点问题(就像LPC55S69-evk上P8的RX和TX引脚标反了,SCTIMER来写PWM最低只有1KHz),所以我写了一个GPIO模拟SPI的程序驱动的LCD。程序很稳定,缺点就是刷新率低。

         core1内核控制各种模块,接收core0内核推理后的结果,将结果和其他传感器数据经由wifi打包发送给上位机。

    QQ图片20191220172310.png

    图4.2 上位机数据


         图4.2是调试助手中收到的数据,每三个数据为一组,对应开发板中程序。

    2、CNN

         程序中使用了卷积神经网络(CNN,convolutional neural network)。AI这个东西,对于没有接触过的人就像黑匣子一样,神秘莫测。但发展到如今这个阶段,加上开发板性能的不端迭代提升,就算是做嵌入式开发,也可以接触和使用AI,让AI为我们服务。
         本次比赛也是我第一次将神经网络加入到嵌入式开发板中的尝试,也学习了很多天,参考了不少代码,最终形成了一套VS编写的纯C版本的CNN代码和一套可以应用在LPC55S69中的程序。在开发板中的程序只能进行推理,VS中的程序可以进行训练和推理,代码在文末我也都会给出。使用流程就是在VS训练出模型,然后将模型移植到开发板中,开发板只需要按照模型进行推理就可以。所谓模型,其实就是我代码中core0内核程序的主函数中的一大堆的100K的数据,推理的过程就是利用这些参数进行数学运算的过程,所以可能理解其中的数学公式比较难,但是了解神经网络的流程和使用,还是不困难的。我也借此机会将这些代码分享出来。
    QQ图片20191221105634.png
    图4.3 全连接神经网络图
          图4.3是一个最简单的全连接神经网络的模型。中间两层是各使用了4个神经元,每一层之间进行全连接,最后得到输出。右边的公式就是神经网络中所应用的数学公式。

    QQ图片20191221110420.png

    图4.4 垃圾分类CNN结构

          图4.4是我的这套系统使用的模型的参数。模型是基于LeNet5模型修改的,比较粗糙。我也是AI路上的初学者,NXP官方有一套自己设计的微型CNN架构,使用了3层卷积,模型也只是90K左右,非常的厉害。

           QQ图片20191220183830.png
    QQ图片20191220183827.png
    QQ图片20191220183824.png

    图4.5 训练集样式

          图4.5是我自己拍的数据集,三类加起来一共也只有几百张。处理数据集的过程十分繁琐,所以一个好的数据集就很重要,自己弄出来的数据集在种类上、位置分布上、图片质量上都比不上那些标准数据集。

    电池测试

    电池测试

    纸板测试

    纸板测试

    瓶子测试

    瓶子测试
         

          这三张图就是实物拍摄的效果。其中电池和纸板的实测效果很好,瓶子效果一般。从实图和训练集中的图不难看出,实际中的图很黑、亮度都不高,这也是导致瓶子效果不好的原因。虽然卷积神经网络能够很好的提取图像特征,但是由于在开发板中的模型很小,加上摄像头转成灰度时图像的处理过程失真严重,导致了瓶子效果不是很好(使用RGB效果更佳,但带来的是模型的大小问题,没有具体比较过)。

          由于需要大量的计算,因此程序中也加入了powerquad的使用。但由于官方给出的powerquad函数精度只能为float,而我的模型计算的精度为double,因此我只能将powerquad应用在了少数几个函数上(开根号、指数运算)上。

    QQ图片20191220192230.png

    图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的一半,以防超内存),具体使用见 五  中项目工程。




    关于设计中所使用到的LPC55S69的资源以及所体现的优势,如使用双核任务分配的描述:
    在项目中,硬件一共使用了10个通用IO口、两个串口资源,软件方面使用到了电源管理、powerquad、SPI、USART、MailBox、双核等资源。
    为了节省板卡资源,摄像头经由小板再接入板卡,小板中程序为OV7670摄像头的图像采集(480*360)以及灰度化图片程序;wifi模块esp8266内烧写入AT固件,通过串口方式接入板卡。项目中的图片刷新率不高是因为我用了GPIO来模拟的SPI通信,原因是在开始使用的时候觉得官方的SPI例程有点问题,这个以后再借鉴一下其他人的工程进行优化和完善。
    在数据传输到上位机时,对数据进行循环冗余加密处理;并且在一个核处理图片数据时,另一个核进入低速运行来降低功耗。
    在双核处理中,一个核心负责接收摄像头经由小板发送来的灰度图像数据,解析后将其加载人神经网络,利用算法和powerquad来进行图像分类。得到的分类结果经由mailbox发送至另一个核心,另一个核心对数据进行加密后发送给上位机。

    /************************************************/
    2020-6-24更新最新程序,包含以bmp图片为源的VS。
    http://github.com/YingyaoYang/CNN-in-embedded-system




    哎,代码总出bug,签到求保佑!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32030
    最后登录
    2024-4-26
    发表于 2020-2-27 09:58:22 | 显示全部楼层
    非常感谢你们对于产品的各种反馈,这些反馈有助于我们加快产品的完善!并且对于开发过程中所遇到的问题我们工程师都予以相应的解答如下:
    1.3V3引脚有点不够用了(XD)
    解答: 一个3V3引脚可以给多个模块供电

    2.SPI函数有一点问题
    解答:SPI驱动LCD屏没有问题, 可以参考考其他选手代码用SPI+DMA驱动LCD屏。


    3.LPC55S69-evk上P8的RX和TX引脚标反了
    解答:以原理图为准,已将问题反馈,后续会尽快更正


    4.SCTIMER来写PWM最低只有1KHz
    解答:请尝试使用时钟源降低可以降低PWM频率到1KHz以下,如input_clk.


    5.官方给出的powerquad函数精度只能为float,而我的模型计算的精度为double,因此我只能将powerquad应用在了少数几个函数上(开根号、指数运算)上
    解答:建议将double转成float来更好发挥powerquad性能,Powerquad用的矩阵运算比较合适

    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-8-25 16:50
  • 签到天数: 57 天

    [LV.5]常住居民I

    20

    主题

    185

    帖子

    12

    金牌会员

    Rank: 6Rank: 6

    积分
    1275
    最后登录
    2024-4-8
    发表于 2019-12-23 09:27:53 | 显示全部楼层
    给你点赞
    签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 1940 天

    [LV.Master]伴坛终老

    61

    主题

    1万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    17296
    最后登录
    2024-4-26
    发表于 2019-12-23 09:44:09 | 显示全部楼层
    支持一下,做的不错。结合了当下垃圾分类热点。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-7-20 10:12
  • 签到天数: 46 天

    [LV.5]常住居民I

    17

    主题

    93

    帖子

    0

    高级会员

    Rank: 4

    积分
    769
    最后登录
    2022-1-3
     楼主| 发表于 2019-12-23 12:09:33 | 显示全部楼层
    这是一个最基础的卷积神经网络的应用在嵌入式方面的小应用,使用的卷积神经网络也是入门级别的。通过这次比赛,我也从一个只会调超参的菜鸟变成了一个能够略微调一调模型结构的新手。卷积神经网络可应用的领域十分广,无论是图像、语音、信号甚至到文本、情感等自然语言处理都有着十分出色的效果。卷积神经网络的推导过程十分复杂繁琐,代码里面用到了很多高维数组,尽管在这些领域很有效,但是没有人可以解释它为何有效。小小应用,希望大家支持。
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-31 22:07
  • 签到天数: 29 天

    [LV.4]偶尔看看III

    20

    主题

    385

    帖子

    19

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1688
    最后登录
    2020-7-1
    发表于 2019-12-23 14:15:24 | 显示全部楼层
    给力奥,powerquad还是很不错的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 1296 天

    [LV.10]以坛为家III

    7

    主题

    6321

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10538
    最后登录
    2024-4-26
    发表于 2020-1-1 18:30:47 | 显示全部楼层
    做得不错,给你点赞!PowerQuad可以提供硬件DSP加速,比同频的Cortex-M33内核的计算速度要快几倍到十几倍,性能十分强劲。希望以后能再完善一下做得更好!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-7-20 10:12
  • 签到天数: 46 天

    [LV.5]常住居民I

    17

    主题

    93

    帖子

    0

    高级会员

    Rank: 4

    积分
    769
    最后登录
    2022-1-3
     楼主| 发表于 2020-1-2 11:04:27 | 显示全部楼层
    linghz 发表于 2020-1-1 18:30
    做得不错,给你点赞!PowerQuad可以提供硬件DSP加速,比同频的Cortex-M33内核的计算速度要快几倍到十几倍, ...

    感谢大佬的支持。后面有时间可以完善一下,只需要将PC端代码精度更改为float,调试完后就能在MCU中使用POWERQUAD了。就是由于最近有点忙,没来得及弄。
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-8 09:06
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    18

    主题

    438

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    2209
    最后登录
    2024-3-5
    发表于 2020-1-6 16:36:11 | 显示全部楼层
    投你一票。。。
    虽说用C编程,代码和内核类别直接关系不大,但也不能把双核Cortex-M33说成M0和M4吧。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2021-7-20 10:12
  • 签到天数: 46 天

    [LV.5]常住居民I

    17

    主题

    93

    帖子

    0

    高级会员

    Rank: 4

    积分
    769
    最后登录
    2022-1-3
     楼主| 发表于 2020-1-7 10:58:58 | 显示全部楼层
    zmh169 发表于 2020-1-6 16:36
    投你一票。。。
    虽说用C编程,代码和内核类别直接关系不大,但也不能把双核Cortex-M33说成M0和M4吧。。。 ...

    谢谢大佬支持,是我先入为主了。我把帖子修改一下。
    哎,代码总出bug,签到求保佑!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 17:32 , Processed in 0.170128 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表