一、項目名稱
基于CNN的智能垃圾分類及遠程監(jiān)控系統(tǒng)
二、項目概述
本項目旨在利用LPC55S69芯片雙核計算資源,運用圖像識別、智能控制技術實現(xiàn)智慧垃圾投放和監(jiān)測系統(tǒng)。core0內核和powerquad將用來處理圖像分類中的計算,并通過mailbox發(fā)送結果給core1內核;core1內核則負責實時監(jiān)測垃圾桶狀態(tài)。具體功能如下。
1)系統(tǒng)基于神經(jīng)網(wǎng)絡算法在開發(fā)板中實現(xiàn)圖像識別,并結合機械裝置對垃圾進行精確投放。2)監(jiān)測垃圾桶的多維屬性,如垃圾桶編號及滿溢程序投入垃圾的種類、數(shù)量以及網(wǎng)絡接入等狀態(tài),同時系統(tǒng)將周期性地將數(shù)據(jù)經(jīng)由WIFI上傳并在LCD屏上顯示。
項目的想法是由最近國內大火的垃圾分類給出的靈感,目前大部分垃圾分類還都是由人工進行垃圾分類,這就導致了高昂的代價。所以我就想著能不能將深度學習加到垃圾分類中,這其中走了很多彎路。在項目初期,由于對深度學習還沒有十分理解,這也導致在之后的模型訓練以及移植到MCU里用了不少時間。
三、項目圖
圖3.1 整體實物圖
? ?
圖3.2 整體實物點亮圖
項目使用了LPC55S69一塊、SG90舵機一個、OV7670攝像頭一個、HCSR04超聲波傳感器一個、LCD屏幕一塊、ESP8266-wifi模塊一個。
這三張圖是三個設備的連線圖,網(wǎng)絡號對應與LPC55S69-EVK的網(wǎng)絡號。另外攝像頭使用了小板先轉換為灰度圖片,然后通過串口與開發(fā)板通信,使用USART0;ESP8266模塊通過串口與開發(fā)板通信,使用USART2。
四、項目功能
圖4.1 總流程圖
整體流程為M4內核采集圖像并進行圖像推理,最后將數(shù)據(jù)經(jīng)由mailbox發(fā)送給M0內核。而在M4內核處理大量運算和數(shù)據(jù)時,由于雙核的使用,M0內核可以一直讀取傳感器數(shù)據(jù)并進行發(fā)送,當M4內核處理完一次數(shù)據(jù)后M0內核也能及時更新所需要發(fā)送的信息,大大提高了系統(tǒng)的實時性。在這里只加入了一個超聲波傳感器,沒有再將溫度、煙霧等傳感器加進來,一是因為傳感器代碼的編寫都是大同小異的,二是3V3引腳有點不夠用了(XD)。
1、雙核的使用
M4內核進行圖像采集以及圖像推理功能。
由于我一直覺得官方的SPI函數(shù)有一點問題(就像LPC55S69-evk上P8的RX和TX引腳標反了,SCTIMER來寫PWM最低只有1KHz),所以我寫了一個GPIO模擬SPI的程序驅動的LCD。程序很穩(wěn)定,缺點就是刷新率低。
core1內核控制各種模塊,接收core0內核推理后的結果,將結果和其他傳感器數(shù)據(jù)經(jīng)由wifi打包發(fā)送給上位機。
圖4.2 上位機數(shù)據(jù)
圖4.2是調試助手中收到的數(shù)據(jù),每三個數(shù)據(jù)為一組,對應開發(fā)板中程序。
2、CNN
程序中使用了卷積神經(jīng)網(wǎng)絡(CNN,convolutional neural network)。AI這個東西,對于沒有接觸過的人就像黑匣子一樣,神秘莫測。但發(fā)展到如今這個階段,加上開發(fā)板性能的不端迭代提升,就算是做嵌入式開發(fā),也可以接觸和使用AI,讓AI為我們服務。
本次比賽也是我第一次將神經(jīng)網(wǎng)絡加入到嵌入式開發(fā)板中的嘗試,也學習了很多天,參考了不少代碼,最終形成了一套VS編寫的純C版本的CNN代碼和一套可以應用在LPC55S69中的程序。在開發(fā)板中的程序只能進行推理,VS中的程序可以進行訓練和推理,代碼在文末我也都會給出。使用流程就是在VS訓練出模型,然后將模型移植到開發(fā)板中,開發(fā)板只需要按照模型進行推理就可以。所謂模型,其實就是我代碼中core0內核程序的主函數(shù)中的一大堆的100K的數(shù)據(jù),推理的過程就是利用這些參數(shù)進行數(shù)學運算的過程,所以可能理解其中的數(shù)學公式比較難,但是了解神經(jīng)網(wǎng)絡的流程和使用,還是不困難的。我也借此機會將這些代碼分享出來。
圖4.3 全連接神經(jīng)網(wǎng)絡圖
圖4.3是一個最簡單的全連接神經(jīng)網(wǎng)絡的模型。中間兩層是各使用了4個神經(jīng)元,每一層之間進行全連接,最后得到輸出。右邊的公式就是神經(jīng)網(wǎng)絡中所應用的數(shù)學公式。
圖4.4 垃圾分類CNN結構
圖4.4是我的這套系統(tǒng)使用的模型的參數(shù)。模型是基于LeNet5模型修改的,比較粗糙。我也是AI路上的初學者,NXP官方有一套自己設計的微信CNN架構,使用了3層卷積,模型也只是90K左右,非常的厲害。
圖4.5 訓練集樣式
圖4.5是我自己拍的數(shù)據(jù)集,三類加起來一共也只有幾百張。處理數(shù)據(jù)集的過程十分繁瑣,所以一個好的數(shù)據(jù)集就很重要,自己弄出來的數(shù)據(jù)集在種類上、位置分布上、圖片質量上都比不上那些標準數(shù)據(jù)集。
這三張圖就是實物拍攝的效果。其中電池和紙板的實測效果很好,瓶子效果一般。從實圖和訓練集中的圖不難看出,實際中的圖很黑、亮度都不高,這也是導致瓶子效果不好的原因。雖然卷積神經(jīng)網(wǎng)絡能夠很好的提取圖像特征,但是由于在開發(fā)板中的模型很小,加上攝像頭轉成灰度時圖像的處理過程失真嚴重,導致了瓶子效果不是很好(使用RGB效果更佳,但帶來的是模型的大小問題,沒有具體比較過)。
由于需要大量的計算,因此程序中也加入了powerquad的使用。但由于官方給出的powerquad函數(shù)精度只能為float,而我的模型計算的精度為double,因此我只能將powerquad應用在了少數(shù)幾個函數(shù)上(開根號、指數(shù)運算)上。
圖4.6 powerquad函數(shù)使用測試
圖4.6是我對powerquad的第一次嘗試使用。我將運算量最大的點積運算改為powerquad,在實際使用中,速度提升了很多(不止10倍),但是精度的不匹配導致輸出結果錯誤。我也只能退而求其次將powerquad應用在部分不很影響運算過程的函數(shù)中。
3、性能
LPC55S69的性能很強,由于雙核的使用,在主核心高速運算的同時從核心能夠同時獲取傳感器數(shù)據(jù)、處理部分任務。
在本系統(tǒng)中,最需要資源的就是主核心采集和推理圖片的過程,其他過程都是簡單的數(shù)據(jù)傳輸,因此在主核心需要處理圖片時,將開發(fā)板以150M全速前進,在處理完之后的部分時間內以12M低速運行,來降低電量消耗。
在使用LPC55S69的過程中,可以很好的感受到其功耗優(yōu)勢。在同一個開發(fā)板上,同時接入五個設備(包含一個顯示屏)并且全速運行時,不會出現(xiàn)電壓跳變。雙核的運行也很穩(wěn)定,就算是主頻降低時,我在從核心中的CRC加密以及數(shù)據(jù)經(jīng)由wifi的傳輸都沒有出現(xiàn)掉幀的情況。
很遺憾的就是沒有用上trustzone,本系統(tǒng)中很多數(shù)據(jù)都是動態(tài)獲取的,最需要保存的就是神經(jīng)網(wǎng)絡的模型數(shù)據(jù)。但是神經(jīng)網(wǎng)絡太大,遠遠超過了trustzone的總大小。為了保證數(shù)據(jù)傳輸時的完整和安全,我在從核心代碼中給傳輸數(shù)據(jù)加入了CRC編碼。
五、演示視頻、項目文檔
演示視頻和LPC55S69項目工程
六、VS-純C版本CNN代碼
VS-CNN代碼
這份CNN代碼里不是垃圾分類的數(shù)據(jù)集,里面包含了一份讀入txt文件數(shù)據(jù)進行訓練的數(shù)據(jù)。txt文件已經(jīng)包含在工程中,打開工程即可運行,注意:請使用VS2019!
txt內的文件為我從串口獲取的攝像頭拍攝到的圖片處理后的像素值,內容是0,1,2,3四個數(shù)的數(shù)據(jù)集。具體格式為28*28像素,0為黑,255為白。垃圾分類的數(shù)據(jù)集還沒有采集完成,完成后我也會更新上來。? ?? ? 在某種程度上,神經(jīng)網(wǎng)絡理論上都是可以放進任何板子中的。這一套VS代碼輸出的數(shù)字集模型僅有27K,而垃圾分類系統(tǒng)中的模型使用了98K。通過對模型超參數(shù)的調整,再加上一個好的數(shù)據(jù)集,理論上都是可以以自己的需求,用多大的板子就訓練出多大的模型。而且深度學習的好處不僅僅只在于我給出的圖像識別方面,將數(shù)據(jù)集換成語音信號數(shù)據(jù)集等等也都是有效的。
VS代碼可直接移植到開發(fā)板中(模型大小最好不要超過開發(fā)板ram的一半,以防超內存),具體使用見 五??中項目工程。