大學回憶:節能減排大賽——基於深度學習的教室節能系統設計

寫在前面:本文內容是本科階段參加科創的經歷,當時只有自己一個人做,很多預期的功能都沒有實現,提交比賽作品的時候可展示程度不高,導致沒有走的很遠。通過這個課外科創項目,瞭解了當時流行的目標檢測算法(YOLO、SSD、Mobilenet-SSD),Ubuntu16.04系統,Python、Qt5,TensorFlow、Caffe、Darknet框架的簡單使用,樹莓派、ESP8266、Thingspeak、光強傳感器…使用,也算是對計算機視覺的淺嘗輒止,因爲老師很尊重我的選擇,所以整個過程都走了一遍,培養了對科創的興趣。恰逢節能減排大賽和物聯網設計競賽臨近,本來想重新完善一下再發布,一直沒時間,現在將項目申報書和當時的思路發佈在本文,希望給參加節能減排比賽或者其它賽事的同學提供思路。原題目爲《新型教室節能系統》個人水平有限,如果有好的建議也希望能在本文評論區或者私信提出,謝謝。



預期的功能長這樣,很多預想功能沒實現:
在這裏插入圖片描述


硬件:
在這裏插入圖片描述


下文是物聯網設計競賽的申報書版本,基本沒有修改,哈哈,有很多地方很稚嫩。


摘 要

我國目前公共建築總量約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所示。
在這裏插入圖片描述
各部分詳細功能請參閱下節內容

爲實現預期控制室內燈光實現節能的功能,系統結構圖如圖3.2所示。
在這裏插入圖片描述

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示。
在這裏插入圖片描述

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所示。
在這裏插入圖片描述

4.3 目標檢測實現

利用訓練得到的caffemodel,調用Opencv的DNN模塊來導入訓練好的模型,實現目標檢測。並用imtuils優化,使在2G顯存的本機達到了110多的FPS,加大提升了實時監測性能。優化前後對比如圖3.1.3所示。
在這裏插入圖片描述
在這裏插入圖片描述

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物聯網平臺:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章