大学回忆:节能减排大赛——基于深度学习的教室节能系统设计

写在前面:本文内容是本科阶段参加科创的经历,当时只有自己一个人做,很多预期的功能都没有实现,提交比赛作品的时候可展示程度不高,导致没有走的很远。通过这个课外科创项目,了解了当时流行的目标检测算法(YOLO、SSD、Mobilenet-SSD),Ubuntu16.04系统,Python、Qt5,TensorFlow、Caffe、Darknet框架的简单使用,树莓派、ESP8266、Thingspeak、光强传感器…使用,也算是对计算机视觉的浅尝辄止,因为老师很尊重我的选择,所以整个过程都走了一遍,培养了对科创的兴趣。恰逢节能减排大赛和物联网设计竞赛临近,本来想重新完善一下再发布,一直没时间,现在将项目申报书和当时的思路发布在本文,希望给参加节能减排比赛或者其它赛事的同学提供思路。原题目为《新型教室节能系统》个人水平有限,如果有好的建议也希望能在本文评论区或者私信提出,谢谢。


文章目录

  • 第一章 设计需求分析
    • 1.1 远程实时监测
    • 1.2 目标检测算法
    • 1.3 自动控制实现
  • 第二章 特色与创新
    • 2.1 基于深度学习技术的实时目标检测与识别
    • 2.2 采用物联网技术实现远程人数监控与调配
    • 2.3 手动和自动控制双模式无缝切换
    • 2.4 大功率LED驱动电路和无线控制LED灯带设计
    • 2.5 局域网内控制
  • 第三章 功能设计
    • 3.1 算法功能
      • 3.1.1 手动控制
      • 3.1.2 室内人数监测
      • 3.1.3 自动控制
    • 3.2 通信功能
      • 3.2.1 UDP 无线通讯协议
      • 3.2.2 ThingSpeak 平台
      • 3.2.3 IP Webcam
    • 3.3 硬件功能
      • 3.3.1 高性能LED驱动板
      • 3.3.2基于ESP8266的无线控制LED灯带设计
  • 第四章 系统实现
    • 4.1 数据集准备
      • 4.1.1 数据清洗
      • 4.1.2 数据增强
      • 4.1.3 批量修改图片格式
      • 4.1.4 批量修改xml文件指定内容
      • 4.1.5 数据标注
    • 4.2 平台搭建与算法部署
      • 4.2.1 平台环境
      • 4.2.2 生成训练集验证集测试集
      • 4.2.3 训练与模型测试
    • 4.3 目标检测实现
    • 4.4 基础通信实现
      • 4.4.1 使用UDP协议实现远程控制
      • 4.4.2 使用ThingSpeak 平台实现记录与监测
    • 4.5 功能扩展
  • 4 作品中的技术难点及解决方案
    • 4.1 数据集不足问题
    • 4.2 图片标注问题
    • 4.3 训练集验证集划分
    • 4.4 系统环境配置与算法部署
    • 4.5 利用训练好的模型进行实时检测
  • 5 相关运行结果(图片)


预期的功能长这样,很多预想功能没实现:
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第1张图片


硬件:


下文是物联网设计竞赛的申报书版本,基本没有修改,哈哈,有很多地方很稚嫩。


摘 要

我国目前公共建筑总量约53亿平米,占城镇建筑总量的36%(2008年统计数据)。公共建筑的规模从几百平米到几十万平米不等。公共建筑除采暖之外能耗比较复杂,能耗主要由空调、照明、办公电器设备、电梯等公共服务设备等构成。在学校这样比较粗放的环境中,许多教室天很亮了,依然不关闭,晚上自习人数很少或者人走之后,依然有许多灯开着,没有做到人走灯灭,这造成了大量的电能浪费。在全球倡导节能减排,应对气候变暖的国际形势下,我们非常有必要响应号召,想尽办法来节约能源。

传统节能控制方法由于无法可靠地辨别教室是否有人,因此无法得到应用。此项目针对该技术难点,在Ubuntu16.04系统下依托Caffe和Darknet等框架,结合YOLO、SSD、MobileNet-SSD目标检测算法与物联网的相关技术,设计了一种全新的智能装置。利用Python和Opencv库编写程序,实现了调取PC、手机、树莓派摄像头视频流,利用训练好的模型自动判断室内人数,并将检测到的人数实时上传到ThingSpeak平台,ESP8266连接光照度传感器和LED,ESP8266读取ThingSpeak上的人数数据再结合光照度传感器的数据,来动态控制照明开关,以减少电能浪费。同时,通过ThingSpeak平台实时上传教室内的人数、光照度、灯的开关状态等数据,实现远程状态监测与通讯功能。为未来的基于智能算法的节能控制系统提供了技术思路。

关键词:Ubuntu、目标检测算法、ESP8266、LED、ThingSpeak


第一章 设计需求分析

1.1 远程实时监测

远程控制是物联网技术的重要组成部分。目前学校的室内照明大多数没有精准的远程控制功能,因此在某些特定的使用场景下会对能源造成较大的浪费。比如天很亮了灯还未关闭,晚上室内人数极少但灯却全部开着,人走灯未灭。而利用PC和室内监控通过限定场景下的目标检测算法结合物联网技术,则可以很好地解决这个问题。教室内几乎都装有监控摄像头,这给大范围部署该项目带来了便利。
通过ThingSpeak平台可以实时上传某时刻教室内的人数、光照度等数据,便于远程监测室内状态,保存的数据可以用于分析,以便之后可以更加合理的分配教室。

1.2 目标检测算法

传统节能控制方法由于无法可靠地辨别教室是否有人,因此无法得到应用。深度学习领域的目标检测算法,训练完成之后得到的模型都比较大,在GPU比较小的机器上运行时效性非常差,这严重阻碍了大规模地应用。像时下性能最先进的目标检测算法YOLO v3的权重文件有246MB之大,SSD也有193MB,并且训练耗时。虽然检测效果精度很高,但是在2G显存的笔记本实测FPS只有7左右,这样的表现难以应用。因此,为了寻求时效性和准确性能更加先进的算法,使用了MobileNet-SSD 来训练,模型仅有23MB,经过120000步迭代之后,mAP达到0.498,实测性能较好。

1.3 自动控制实现

本项目用Python编写脚本,并用imtuils和Opencv进行了优化,FPS提升了350%,本机测试FPS达到了112,极大地降低了检测延迟。通过ESP8266读取ThingSpeak上的人数数据光照度传感器数据,实现实时的检测室内人数与控制灯光。依此项目可以扩展控制更多的电器,实现节能。


第二章 特色与创新

2.1 基于深度学习技术的实时目标检测与识别

用树莓派摄像头每间隔2s采集一天教学楼开放时段内的图像,并用imgaug库对数据进行清洗和增强。之后用labelImg打标签,利用性能先进的深度学习目标检测算法(YOLO v2 & v3 / SSD / MobileNet-SSD)对摄像头采集的数据集进行训练,并用Pyhton编写脚本将训练好的模型部署到PC上,实现精确地检测室内人数。

2.2 采用物联网技术实现远程人数监控与调配

通过ThingSpeak物联网平台,实现各个教室人数的实时监控与动态调整。该平台可实现实时传入摄像头检测到的人数并记录,并能通过手机电脑等多种终端访问。有了这些数据可以统计出勤率,通过对数据的分析以利于更好地分配教室。

2.3 手动和自动控制双模式无缝切换

在教室开放时段内,开启自检。在自动模式下,根据照度和摄像头综合控制。如果在某一区域检测到有人停留时间超过某一阈值且照度不满足室内照明要求,则开启此区域的灯;如果照度超多室内照明要求,则关闭灯光;当有人为干预,退出自动控制模式,进入手动模式。当检测到人数小于某一阈值且开灯的情况下,提醒同学离开,并在人走后自动关闭灯光。在手动模式下,可以直接用简单的指令(可以自己设置,比如“Turn on”、“Turn off”)控制灯光。逻辑控制程序在Ubuntu16.04下用Python2.7实现,因此很容易在各个系统平台迁移。

2.4 大功率LED驱动电路和无线控制LED灯带设计

采用业界先进的照明LED的驱动方案设计了LED驱动板,可以直接用于工业照明设备。这为以后控制其他公共场所大功率设备奠定了基础。将ESP8266和大功率LED驱动板电路连接,接入光强传感器,采用适配器供电或者锂电池供电方案,设计了一种大功率无线控制LED灯带。

2.5 局域网内控制

本项目的基础功能是实现在电脑端调用监控设备视频流通过目标检测识别后直接控制台灯的开关,将被控端与控制端设备接入同一局域网后,用户在控制端摄入指令时,控制端会将相应的命令如开灯、关灯等信息,通过UDP协议无线发送至被控端。被控端根据接受的命令控制LED,以节省人力物力,减少资源浪费。

第三章 功能设计

本作品包括三个主要功能模块,系统概览图如图3.1所示。
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第2张图片
各部分详细功能请参阅下节内容

为实现预期控制室内灯光实现节能的功能,系统结构图如图3.2所示。
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第3张图片

3.1 算法功能

本作品的算法功能如下所示:

    1. 通过UDP通信协议,远程手动控制各间教室的LED
    1. 光强传感器与目标检测算法结合,自动控制各间教室LED
    1. 实时记录与监测各间教室的人数,并可以通过电脑手机端访问

3.1.1 手动控制

方案一:将控制端(PC)和被控端(树莓派)连接到同一WIFI环境并运行socket服务,管理员在控制端输入自定义的指令,通过UDP通信协议传输至树莓派,来分别控制不同教室的LED。

方案二:通过程序,向 ThingSpeak 平台某一个field写入数据,然后esp8266 中烧写的程序周期性的读取这一field的数据,根据这一数据来做出相应的开关灯操作。

3.1.2 室内人数监测

本作品将实时检测到的人数上传到ThingSpeak物联网平台,每隔15s记录下某一时刻的人数,并以图标的形式显示不同教室的情况。可以通过电脑端或移动端等设备登录该网站查看各间教室的人数信息。

3.1.3 自动控制

在教室开放时段内,开启自检。在自动模式下,根据传感器和摄像头设备综合控制。如果在某一区域检测到有人停留时间超过某一阈值且照度不满足室内照明要求,则开启此区域的灯光;如果照度超过室内照明要求,则关闭灯光;如果检测到室内没人,则关闭灯光。当有人为干预,退出自动控制模式,进入手动模式。当检测到人数小于某一阈值且开灯的情况下,提醒同学离开到其他人数较多的教室自习,并在同学离开教室后自动关闭灯光。

3.2 通信功能

3.2.1 UDP 无线通讯协议

将被控端(LED灯)与控制端(电脑)连接在同一WIFI环境下,能够实现快速稳定的传输,以便于远程控室内照明。

3.2.2 ThingSpeak 平台

为了便于远程监测与分析,本项目借助该平台实现实时上传室内人数、光照强度、灯的开关状态等数据。

3.2.3 IP Webcam

本项目借助IP Webcam平台实现了远程调取树莓派摄像头和手机摄像头视频流,为以后分布式部署和辅助考勤奠定基础。

3.3 硬件功能

3.3.1 高性能LED驱动板

硬件系统稳定安全地运行是一个完整控制系统的基础要求。本作品中的LED工作参数选择为额定电压9V,额定电流300mA。LED的驱动方案选择德州仪器的LM3409芯片,可控制一个由P型MOSFTET组成的Buck电路,只需将外部PWM信号接入EN引脚,就能达到限制负载LED的电流目的。其允许的输入电压范围较宽(6-75V)且可以较易的达到5A左右的大电流输出,可满足一般家用照明LED的需求。LM3409的内部PWM频率设置为500kHz,调光过程平顺,不会出现频闪。其成品如图3.3.1示。
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第4张图片

3.3.2基于ESP8266的无线控制LED灯带设计

使用ESP8266 、大功率LED驱动板、光强传感器,采用适配器供电或者锂电池供电方案,设计了一种大功率无线控制LED灯带。


第四章 系统实现

4.1 数据集准备

4.1.1 数据清洗

本项目利用树莓派摄像头每隔2s采集一间教室开放时间全时段的图片,去除模糊、相邻变化不明显的图片,经过筛选后共计2000张。筛选Youtube人脸数据集500张,总计2500张。

4.1.2 数据增强

利用imgaug 数据增强库编写python代码实现批量处理,经过水平镜像、高斯噪声、高斯模糊之后,得到20000张图片。高斯噪声、高斯模糊的Python代码如下:

import imgaug as ia
from imgaug import augmenters as iaa
origin_path = '*.jpg'
img_list = glob.glob(origin_path)
out_path = ''
os.chdir(out_path)
for idx, img_name in enumerate(img_list):
    img = plt.imread (img_name)
    images = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    seq = iaa.Sequential([iaa.AdditiveGaussianNoise(scale=(0, 0.08*255))])
    images_aug = seq.augment_images(images)
    #seq = iaa.Sequential([iaa.GaussianBlur(sigma=(0.0, 3.0))])
    save_name = '%06d'%(idx+12501) + '.jpg'
    cv2.imwrite(save_name, images_aug)

4.1.3 批量修改图片格式

由于图片标注工具对png格式数据生成注释文件时,总是无法获取图片大小,这对以后的训练产生了巨大的影响,模型没法用。因此统一将数据集修改为jpg格式。代码见附件Modifer.py。

4.1.4 批量修改xml文件指定内容

镜像之后,数据集成倍增长,而图像标注要消耗大量的时间,所以想办法实现批量修改xml文件指定内容Python代码见附件flip-pic.py & flip-xml.py。

4.1.5 数据标注

本项目使用PyQt开发的图片标注工具labelImg集进行数据标注。标注完之后,要检查是否有重复标注、批量操作后的xml是否不合格,以防影响以后的训练。操作界面如图4.1.1所示。

4.2 平台搭建与算法部署

4.2.1 平台环境

硬件配置:i7-8700 CPU、16GB RAM、GTX1080 8G GPU
基础环境:Ubuntu16.04、CUDA 8.0、cudnn 9.0、Opencv 3.3.1 ;Windows10、CUDA 8.0、cudnn7.0
深度学习框架:Caffe 、Darknet、Tensorflow;
目标检测算法: SSD、 MobileNet-SSD、YOLO v2 和 v3

4.2.2 生成训练集验证集测试集

目标检测算法训练需要训练集、验证集和测试集。Python代码见附件create-train-val.py。

4.2.3 训练与模型测试

YOLOv2-tiny-yolo 经过8万步迭代,loss稳定在8左右,实测效果良好;YOLOv3 经过25000步迭代,loss稳定在1左右,检测速度快、准确,但检测视频速度太差。MobileNet-SSD经过120000步迭代,mAP(mean average precision)为 0.498。训练完成测试如图4.1.2所示。
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第5张图片

4.3 目标检测实现

利用训练得到的caffemodel,调用Opencv的DNN模块来导入训练好的模型,实现目标检测。并用imtuils优化,使在2G显存的本机达到了110多的FPS,加大提升了实时监测性能。优化前后对比如图3.1.3所示。
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第6张图片
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第7张图片

4.4 基础通信实现

本系统涉及到的硬件间通信是控制端与树莓派的通信,由于系统需要实现远程控制,本项目使用了WiFi进行命令传输,即控制端(电脑)与树莓派连接在同一个局域网下,使用UDP协议进行命令的发送和接收。

4.4.1 使用UDP协议实现远程控制

在UWP中实现UDP通信的较为便捷可靠的方式是使用Datagram Socket技术,由于UDP协议没有多次握手确认操作,所以消耗资源较少,速度较快,在稳定的网络连接环境下有较好的性能和可靠性。

考虑到应用需要在多个平台运行,且每个平台均包含数据的接受和发送过程,因此将数据发送的方法封装在一个函数中。本项目涉及到的数据传输包括当前灯的开关和传感器采集到的亮度信息。由于这些信息均需双向传输,因此在控制端需建立一个发送端用于发送命令和两个接收端,并绑定不同端口分别发送和接收数据。其核心Python代码如下:

# 控制端
import socket
addr1=('接收端IP地址',端口号)  
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:  
    data=raw_input()  
    if not data:  
        break  
    s.sendto(data,addr1)  
s.close()  
#接收端
address = ('接收端IP地址',端口号)
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(address)
while True:
    data,addr = s.recvfrom(2048)
    if not data:
        break
    print "got data from",addr
    print data
s.close()

4.4.2 使用ThingSpeak 平台实现记录与监测

该平台可以实现实时上传记录数据,并以图表的形式展现,也可以将数据导出,或进行数据分析。利用开放的API接口,编写如下Python代码:

import urllib2
def getValueFromThingSpeak(channel, field):
    link = "https://api.thingspeak.com/channels/" + \
    str(channel) + \
    "/fields/" + \
    str(field) + \
    "/last"
    value = urllib2.urlopen(link)
    result = value.read()
return result
def writeValueToThingSpeak(content):
    link = "https://api.thingspeak.com/update?api_key=秘钥&field="
    f = urllib2.urlopen(link+str(content))
    f.read()
    f.close()

4.5 功能扩展

目前可以调取手机、树莓派移动设备的摄像头,并完成室内人的数检测,依托此可以辅助教师统计出勤率,便于教学工作。调取视频流Python代码如下:

#调取手机摄像头
import urllib
import cv2
import numpy as np
url = 'http://IP地址:端口号/shot.jpg'
while True:
    imgResp = urllib.urlopen(url)
    imgNp = np.array(bytearray(imgResp.read()),dtype = np.uint8)
    img = cv2.imdecode(imgNp,-1)
    cv2.imshow('myphone',img)
    if ord('q') == cv2.waitKey(10):
        exit(0)

4 作品中的技术难点及解决方案

4.1 数据集不足问题

要利用深度学习的算法来进行训练,数据集充足是必要的,因此需要想办法从室内拍摄的图片中筛出2000张图片进行训练是不够的,因此从youtube人脸数据集中筛选出500张扩充数据,编写python脚本实现批量图片镜像操作,调用imguag库函数实现批量高斯噪声、高斯模糊操作实现数据增强,最终得到20000张图片。

4.2 图片标注问题

由于拍摄的照片大多数都是人员密集的情况,平均标注一张图片需要3分钟,这极大地增加了工作量,在进行数据增强后,工作量翻了8倍,小组成员人数有限,但如果再逐一去标注是不现实的,因此先标注完2500张,再进行数据增强,之后编写python脚本对数据增强后的17500张图片的标注文件xml批量操作,实现镜像、批量修改文件名操作。

4.3 训练集验证集划分

如果要用目标检测算法进行训练,需要手动划分训练集和验证集。这两个文件是只包含文件名列表的txt档,20000张图片手动划分的话工作量巨大,而且很难保证数据随机性,因此编写python脚本实现自动随机生成训练集验证集文档。

4.4 系统环境配置与算法部署

由于深度学习框架依赖的库太多,并且各个版本的库作品初期,在win10环境下部署了yolo v2,要用该算法进行训练,必须按照其文件结构进行分配,还需要众多的配置文件以及路径问题,踩完这些坑后,用小批量(760张)数据进行了训练,940m显卡训练了6天多,loss稳定在一区间不变,准确率达到66%。扩充数据后之后又用1150张图片进行训练,准确率达到82%。由于权重文件太大(193mb),进行实时检测并不现实。所以又用网络结构更小的进行训练,得到权重文件大小为23mb,但是检测效果不好。所以又在ubuntu 16.04系统下配置时下性能最好的目标检测算法yolo v3进行训练,1080显卡3天多训练之后,检测效果非常好,但模型太大(248mb),实时检测性能不好。因此又配置MobileNet-SSD算法进行训练,1080显卡进行3天多训练以后,map达到0.498,loss稳定在2左右。进行测试,检测效果良好。

4.5 利用训练好的模型进行实时检测

训练完成之后,需要利用训练好的模型来实现实时的目标检测,因此编写python脚本利用opencv的dnn模块来读取训练好的模型,进行检测。但是在本机(2G显存)测试时,FPS只有26,因此利用imtuls库进行优化,并最终得到FPS为117,实时监测效果已经非常好。在算法中进行滤波,并利用置信度来统计人数。


5 相关运行结果(图片)

通过ESP8266将目标检测算法检测结果上传到ThingSpeak物联网平台:
大学回忆:节能减排大赛——基于深度学习的教室节能系统设计_第8张图片

你可能感兴趣的:(点滴记录)