如果需要代码的可以联系本人哦
项目简介
利用摄像头以及图像识别技术统计自习室内的人数,利用温湿度光照传感器统计屋内的温度,湿度以及光照强度,利用温度信息控制风扇开关,利用光照信息控制灯的亮灭,利用人数信息调整灯的亮度,然后把这些参数上传到网页上,让学生根据自习室的人数,温度,湿度等信息挑选环境最舒适的自习室。
项目背景
学校的自习室普遍存在着一个问题,就是晚上自习室内人少的时候灯会自动灭,这时候需要人站起来走动一下才可以使灯重新亮起来,然而过上几分钟灯又就自己灭了,非常不方便。
项目分析
针对项目背景中描述的问题,我们查阅了一下,现在自习室内使用的是人体热释电传感器,原理是传感器探测到人体热释电时发特定的信号给网关,网关便可利用这个信号控制灯的状态。现在的问题是,人体热释电传感器的灵敏度比较差,当人少的时候几乎无法进行识别,这就造成了人在灯灭的问题。为了解决这个问题,我们想的是统计屋内人数,当人数大于0时不关灯,当人数等于0时才关灯。关于统计屋内人数这一点我们想了两种方法,一种是在自习室门附近设置两个红外传感器,靠近门的标记为1号,远离门的标记为2号,当1号先触发2号后触发时代表人进,自习室内人数加一,当2号先触发1号后触发时代表人出,自习室内人数减一。然而这个方法只能在理论上可行,实际用起来还是有问题,比如两个人同时进的时候只能检测到一个人,再加上红外传感器不灵敏等各种不确定因素,把统计人数的重任全部交给这两个传感器还是有些不切实际。这里我们就用到了第二种方法,利用图像识别技术识别屋内有多少人,这个方法比起前面第一种方法有很多优势。最大的优势在于它的错误律低,因为自习室的座位划分的很整齐,人坐在座位上本身就形成了物理上的分隔,极大地方便了图像识别,再加上我们利用了深度学习技术,使得准确率大幅提高,最后摄像头不像第一种方法中的那两个传感器只能在人来的时候检测,可以实时检测屋内的人数,一定程度上降低了各种突发因素的影响,最终使识别率几乎达到100%。除此之外,这种方法还在一定程度上提高了摄像头资源的利用率,因为现在摄像头的主要功能还是监控,在图像识别盛行的年代有点大材小用。而且现在几乎所有自习室都配备了摄像头,不用考虑经济问题。但是第二种方法有个致命的问题,那就是晚上的时候人进来灯不会自动开,这是因为亮度太低摄像头无法工作,尽管用户可以自行开灯,但是本着全自动的原则我们需要对这一点作改善。
我们发现结合第一,第二种方法就可以解决所有问题。在第二种方法的基础上添加一个红外传感器就可以实现夜晚人进自习室时自动开灯,然后摄像头就可以立即工作了。这里由于设备限制我们将红外传感器换成了人体热释电传感器,虽然精度低一点,但完全可以达到相同的效果。至此,我们解决了基本的问题。
项目特色:
在解决基本问题的基础上,我们将统计的人数上传到了服务器,利用网页显示,供全校学生浏览,方便学生选择一个人少的自习室,以安心学习。另外,我们还在教室中配备了温湿度光照传感器,同样上传到服务器,学生们还可以获得教室内的环境信息,以选择一个更加舒适的自习室。最后,我们利用人数,光照,温度信息实现了对灯光,风扇的全自动化控制,实现了一个较为完善的物联网系统。
项目分工
传感器、协调器以及服务器
项目的自动化控制
图像识别技术
web前端,以及数据的上传和下载。
项目实现
项目模块图
项目原理
使用zigbee协议,信道为11,panid为0xaa17,串口波特率为115200。
终端节点方面,设置一个室内温湿度光照传感器,一个室外温湿度光照传感器,编号为分别为0x01,0x02,不断向协调器发送数据,在门口设置一个人体热释电传感器,当人进入自习室时向协调起发送一个特定信息,设置一个电机传感器代表风扇,当收到协调起发来的信息时便作打开或关闭操作,设置两个pwm调光传感器,根据协调器发来的信息调节亮度,这里为实现对两个灯的单独控制优化了协议。
协调器负责组网,向服务器发送信息,将服务器发来的信息传给终端节点。
服务器是本项目的核心之一,负责通过串口向协调起收发16进制信息,并对信息进行解码与校验,然后对整个项目进行逻辑控制。服务器端最严重的问题就是丢包率太高以及有脏数据,当同时发送两条信息时串口库无法作出相应的处理,只能丢掉后一条信息,当同时接受到两条数据时还有可能产生乱码。对于接受到的脏数据我采取的做法是直接丢取,首先温湿度光照传感器发来的脏数据完全可以丢弃,因为这种情况的发生率比较低,且温湿度光照传感器在不停地发信息,丢一条无关紧要,但对于人体热释电传感器就不一样了,因为人体热释电传感器一般只在被触发时发送一条数据,丢掉了这条数据就达不到自动开灯的效果了,这一点我无能为力,唯一可以作辩解的就是这种情况发生的概率非常低,我在整个开发过程中进行了100多次人体热释电传感器测试,只遇到过1次,而遇到的那一次是因为我把温湿度传感器的发送频率设置得太高,在我把温湿度传感器的发送频率设为2s一次时就再也没有出现过这种问题,但不可否认的是系统仍有出错的概率,不过这个概率极低,而且问题发生时完全可以靠学生手动开灯来解决,不会造成大影响。对于发送数据时的丢包问题,我的做法是延时,两条数据同时发送会有问题那我就先发一条,延时一段时间,然后再发一条,然而,每次发送数据的延迟的累加效果太过显著,再加上我从头到尾只开了一个线程,线程负荷很大,最终导致了整个系统效率低下,而效率低下又反过来影响了丢包率,导致就算延时2s系统仍然无法处理发送的数据,最终丢包率反而上升了。无疑这种方法失败了,但是之后我又想了一个方法彻底解决了丢包问题,那就是开多个线程,每个线程隔一段时间执行一次,并且执行之前现判断是否满足条件,而这些条件是在接收数据时改变的,这样我们就不用让接受数据,逻辑处理,发送数据同时进行了,接受数据时只要改变一个变量即可,剩下的工作交给相应线程处理,大大减少了每个线程的负荷,系统效率有了质的提升,在加上发送数据单独开了一个线程,这个线程只要满足条件就一直执行,就算丢包也没有大碍,他一定能保证数据发送给终端节点,这样丢包和系统效率问题就解决了,但是这样处理仍然有不确定的延时,这个我咨询了老师,老师说是因为实验室里大家都在作实验,100多个传感器同时工作,协调器压力太大,因此丢包率高,然而我在传感器少的地方也遇到了很高的延时,我最终认定为我所使用的zigbee协议栈内部的osal机制有问题,对多条信息的处理不是很妥当,这样的话涉及了一些下层协议的内容,修改起来比较困难,因此我的程序保留了高延迟这一弊端。不过本项目是非实时系统,一定的延时对项目影响不大。最终我用一定的延时换得了系统的稳定。
图像识别模块是本项目的另一大核心,我们采用最新的YOLOv3(You Only Look Once)深度学习算法对视频中得人和车辆进行检测,相比于其他物体检测算法Yolov3具有更高得准确率以及更快得处理速度
先来介绍一下算法:
Yolo3 处理流程
首先,在训练过程中我们将图片输入到Yolo3网络中来预测生成3维的Tensor(上图中的最后一个),如上图所示算法对特征图进行了三层缩放其目的是为了检测各种不同大小的物体,我们以1313的缩放为例,对于这个缩放,图片被分成1313个网格,每一个网格又对应这一个11255的3维数据,255的含义是对于每一个box都有4个物体位置坐标以及80种物体类别可能性和一种背景可能性一共有3个box所以 255=3x(4+1+80)。
其次,如果物体的ground truth Bounding Box 落在了网格内,那么就代表这个网格的内有物体,每一个网格有分配了三个Box通过训练不断调整Box最终选择与ground truth Bounding Box最相近的Box作为结果。
最后,通过K-mean聚类来选择合适的Box。
然后介绍一下网络架构:
因为网络中使用了众多的卷积层并且没有使用全连接层,所以Yolov3可以处理任意大小的图像此外,不使用池化层而是使用步幅2的卷积层用于对特征图进行下采样,向前传递尺寸不变的特征。此外,类ResNet结构和类FPN结构也是其精度提高的关键。
最后介绍一下类ResNet模块:
增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,就算把A的网络参数全部迁移到B的前面几层,而B后面的层只是做一个等价的映射,就达到了A网络的一样的效果。一个比较好的例子就是VGG,该网络就是在AlexNex的基础上通过增加网络深度大幅度提高了网络性能。
VGG
然而通过实验发现,当网络层数达到一定的数目以后,网络的性能就会饱和,再增加网络的性能就会开始退化,但是这种退化并不是由过拟合引起的,因为我们发现训练精度和测试精度都在下降,这说明当网络变得很深以后,深度网络就变得难以训练了。
ResNet的跳跃结构
ResNet就是用这种跳跃结构来作为网络的基本结构。用这种结构的好处是本来要优化的目标是H(x)=F(x+x)(x就是该结构的输入)但是通过这种结构以后就把优化的目标由H(x)转化为H(x)-x。这时候就不是把上面几层训练到一个等价映射了,而是将其逼近与0,这样训练的难度比训练到一个等价映射应该下降了很多。
也就是说,在一个网络中(假设有5层),如果前面四层已经达到一个最优的函数,那第五层就是没有必要的了,因此通过这种跳跃结构,优化目标就从一个等价映射变为逼近0了,逼近其他任何函数都会造成网络退化。通过这种方式就可以解决网络太深难训练的问题。
这是使用了这样的算法才使得YOLOv3网络能供抓取到更多的特征,提升算法的准确率
为了满足客户方便查看与监管,我们完成了一个用户友好的前端页面,其使用Flask框架进行开发,后端与终端的树莓派进行通信与数据处理,在主页有实时显示视频画面,各个传感器
各模块原理
使用Python Flask 框架搭建web服务端,负责接收数据和展示数据
本项目共搭建三个Web服务器。第一个服务器搭建在树莓派上,目的是为了传输视频流,第二个Web服务器搭建在服务器端,目的是接受树莓派的视频流, 进行图像识别,并向外提供识别后的视频流,第三个Web也搭建在服务器端,目的是为了获取识别后的视频流, 并获取由终端节点发送来的温湿度,光照信息,进行汇总后展示在web界面中。
信息下载:
信息上传: