王鵬程,胡 成,劉興云
(湖北師范大學(xué) 物理與電子科學(xué)學(xué)院,湖北 黃石 435002)
垃圾分類是垃圾處理過程中的重要環(huán)節(jié),一直以來都是各級(jí)政府倡導(dǎo)和推進(jìn)的重要工作。由于基礎(chǔ)配套設(shè)施不完善和人們垃圾分類意識(shí)薄弱,導(dǎo)致目前收集到的垃圾大部分仍是混合垃圾,極大地影響了垃圾處理的效率[1]。
對(duì)于垃圾的前端收集,目前有效的措施為人工引導(dǎo),或智能垃圾收集設(shè)施的大范圍鋪設(shè)。人工引導(dǎo)工作量巨大。國(guó)外的智能垃圾桶,如美國(guó)納士達(dá),德國(guó)ccko、澤頓和日本體感智能垃圾桶等,大多基于紅外感應(yīng)器,液晶顯示屏,國(guó)內(nèi)的研究,基于NB-IoT技術(shù)的智能垃圾桶,不滿足自動(dòng)識(shí)別分類的需求[2]。隨著智能識(shí)別的發(fā)展,出現(xiàn)了基于機(jī)器視覺的智能垃圾桶,可以識(shí)別投入的垃圾并自動(dòng)分類,但大范圍鋪設(shè)成本高昂,一次投放的垃圾過多或以垃圾袋方式投放時(shí),這種垃圾桶不能被很好地處理[2~4]。
用戶傾向于從自身利益的角度來對(duì)待環(huán)境問題,這種功利心理往往造成垃圾源頭分類不能達(dá)到預(yù)期效果[5]。考慮從用戶端解決這個(gè)問題,設(shè)計(jì)了基于人臉識(shí)別的垃圾分類系統(tǒng),可以適配在現(xiàn)有的垃圾桶上,結(jié)合人臉識(shí)別和服務(wù)器對(duì)個(gè)人垃圾分類情況進(jìn)行更精準(zhǔn)的監(jiān)督。經(jīng)濟(jì)激勵(lì)能夠促進(jìn)用戶進(jìn)行垃圾分類,設(shè)計(jì)增減積分、積分兌換獎(jiǎng)勵(lì)的模式來鼓勵(lì)用戶進(jìn)行垃圾分類[6]。
垃圾分類系統(tǒng)主要由支持各種功能的嵌入式主控、對(duì)采集數(shù)據(jù)進(jìn)行處理的服務(wù)器和能適配現(xiàn)有垃圾桶的機(jī)械結(jié)構(gòu)構(gòu)成。基于成本與體積考慮,選用的是Linux系統(tǒng)板作為嵌入式主控,開發(fā)了服務(wù)器端程序,機(jī)械部分設(shè)計(jì)為不銹鋼支架結(jié)構(gòu),能將垃圾桶放置在支架上。系統(tǒng)架構(gòu)圖如圖1所示。

圖1 系統(tǒng)架構(gòu)圖
每種類別的垃圾桶都配置有垃圾分類系統(tǒng),當(dāng)用戶持垃圾走到對(duì)應(yīng)垃圾桶附近時(shí),攝像頭會(huì)抓取到包含用戶人臉的圖像信息,在Linux系統(tǒng)端會(huì)對(duì)每一幀圖像進(jìn)行人臉檢測(cè),將包含人臉的區(qū)域進(jìn)行剪裁并保存到本地,對(duì)用戶投入的垃圾稱重并計(jì)算積分,然后將人臉圖片與垃圾重量數(shù)據(jù)上傳至服務(wù)器。服務(wù)器端對(duì)接收到的圖片和垃圾重量信息在數(shù)據(jù)庫(kù)中進(jìn)行保存與更新,同時(shí)設(shè)計(jì)了網(wǎng)頁前端對(duì)數(shù)據(jù)庫(kù)進(jìn)行查看和管理,方便登記用戶的個(gè)人信息,以及查詢積分和兌換獎(jiǎng)勵(lì)。在處理分類投放錯(cuò)誤的垃圾時(shí),可以根據(jù)垃圾重量及人臉圖像找到個(gè)人進(jìn)行積分減扣,實(shí)現(xiàn)更有效的個(gè)人監(jiān)督。整個(gè)投擲過程中,用戶的體驗(yàn)與正常扔垃圾沒有太大區(qū)別。
Linux系統(tǒng)板,放大電路部分均為5V直流供電,A/D轉(zhuǎn)換部分為3.3V供電。對(duì)于前置放大電路中的ICL7650與二級(jí)放大電路中的OP07,正負(fù)供電的輸出信號(hào)更加精準(zhǔn),但正負(fù)兩種供電會(huì)增加電路復(fù)雜度。如果使用單電源供電,對(duì)輸出的精度會(huì)有一定的影響,但電路復(fù)雜程度降低很多,電源供電更加穩(wěn)定。為了研究單電源供電是否能滿足使用要求,對(duì)單電源工作時(shí)的放大電路的輸出電壓進(jìn)行了測(cè)試。試驗(yàn)載重為0~60kg變化,試驗(yàn)結(jié)果如表1所示。

表1 載重0~60kg變化情況下放大電路各級(jí)輸出表
從表1可以看出,二級(jí)電路(正相放大)變化范圍只有3V不能滿足需求,但是反相放大的變化范圍4.3V可以滿足,再考慮到單電源電路更簡(jiǎn)單穩(wěn)定,所以選擇單電源供電模式。
1)Linux系統(tǒng)板部分,用5V進(jìn)行供電,外設(shè)如攝像頭,音箱等掛載在系統(tǒng)板的接口上。2)放大電路部分,用系統(tǒng)板的5V接口引出作電源,經(jīng)過整流濾波后給放大電路供電。放大部分供電電路圖如圖2所示。3)A/D轉(zhuǎn)換部分,通過AMS1117將5V降到3.3V給A/D轉(zhuǎn)換電路部分進(jìn)行供電。5V轉(zhuǎn)3.3V電路如圖3所示。

圖2 放大部分供電電路圖

圖3 5V轉(zhuǎn)3.3V電路圖
稱重傳感器數(shù)據(jù)采集電路主要由壓力傳感器電路、信號(hào)放大電路、A/D信號(hào)轉(zhuǎn)換電路構(gòu)成。流程圖如圖4所示。

圖4 稱重采集數(shù)據(jù)流程圖
2.2.1 壓力傳感器 壓力傳感器能將壓力轉(zhuǎn)換為電信號(hào)。本設(shè)計(jì)使用的為E型半橋應(yīng)變式稱重傳感器,結(jié)構(gòu)如圖5所示。該壓力傳感器為半橋傳感器,不是一個(gè)完整的橋路,本設(shè)計(jì)采用四個(gè)半橋傳感器組成全橋使用,如圖6所示。利用惠斯通電橋原理把外部的壓力通過傳感器的彈性梁變形使其貼在上面的電阻式應(yīng)變片發(fā)生阻值變化,在激勵(lì)電壓的作用下,輸出與被測(cè)物成正比的模擬電信號(hào)。組成全橋后,其理論最大稱重200 kg,輸出靈敏度1.0mV/V,在激勵(lì)電壓為5V的情況下,理論滿量程輸出為5mV.全橋傳感器本身存在零點(diǎn)漂移,所以在兩個(gè)信號(hào)輸出端串接可調(diào)電阻來進(jìn)行調(diào)零。

圖5 壓力傳感器結(jié)構(gòu)圖

圖6 壓力傳感器組成全橋電路圖
2.2.2 放大電路 壓力傳感器滿量程輸出5mV,與A/D轉(zhuǎn)換需要的電壓值相差很大,所以選用了兩級(jí)放大電路來進(jìn)行放大,由ICL7650構(gòu)成前置放大電路,OP07構(gòu)成二級(jí)放大電路。
1)前置放大電路
前置放大電路主要由ICL7650構(gòu)成,該芯片是利用 CMOS 工藝和動(dòng)態(tài)校零技術(shù)制作的一款斬波穩(wěn)零式高精度運(yùn)算放大電路,具有輸入偏置電流小、失調(diào)小、增益高、共模抑制能力強(qiáng)、響應(yīng)快、漂移低等優(yōu)點(diǎn)。前置放大電路圖如圖7所示,因?yàn)橄到y(tǒng)是單電源供電,所以采用差分信號(hào)輸入。壓力傳感器輸出的信號(hào)Vout+接入IN-,Vout-接入IN+,進(jìn)行反相放大,放大倍數(shù)為100倍[7,8]。

圖7 ICL7650前置放大電路圖
2)二級(jí)放大電路
二級(jí)放大電路主要由OP07構(gòu)成,是一種非噪聲,非斬波穩(wěn)零的雙極性運(yùn)算放大集成電路。由于有非常低的輸入失調(diào)電壓,所以不需要額外的調(diào)零措施。放大電路如圖8所示,將ICL7650輸出的電壓信號(hào)放大10倍。為了能在單電源供電的情況下使用,二級(jí)放大電路設(shè)計(jì)為反相放大,通過程序調(diào)整對(duì)反變換進(jìn)行矯正[8]。

圖8 OP07二級(jí)放大電路圖
2.2.3 A/D轉(zhuǎn)換電路 A/D轉(zhuǎn)換電路主要由ADS1115構(gòu)成。ADS1115是具有16位分辨率的高精度模數(shù)轉(zhuǎn)換器,具有一個(gè)輸入多路復(fù)用器,可以提供2個(gè)差分輸入或4個(gè)單端輸入。16位二進(jìn)制數(shù),第一位為符號(hào)位,因?yàn)橹皇褂昧苏龜?shù)范圍,所以輸出數(shù)據(jù)為15位二進(jìn)制數(shù),即0~32767.放大后的電壓變化范圍為0~4.3V,可知實(shí)際最大稱重為172 kg.通過計(jì)算可知,1個(gè)二進(jìn)制數(shù)變化對(duì)應(yīng)5.24 g,精度符合需求。因?yàn)槎?jí)放大電路是反相放大,所以采集后的數(shù)據(jù)為32767~0變化,需要在程序算法進(jìn)行調(diào)整。A/D轉(zhuǎn)換電路圖如圖9所示。

圖9 A/D轉(zhuǎn)換電路圖
考慮配置到現(xiàn)有的垃圾桶上。具體設(shè)計(jì)為底座加支架的結(jié)構(gòu)。底座設(shè)計(jì)類似電子秤,兩層鋼板中間固定傳感器,為了穩(wěn)固,四個(gè)傳感器分別固定在四角。在底座后端,固定一根長(zhǎng)桿,頂端放置攝像頭、音箱等外設(shè),從底座到攝像頭的距離是常見垃圾桶高度加蓋長(zhǎng)。對(duì)每一個(gè)種類的垃圾桶都進(jìn)行裝配。系統(tǒng)結(jié)構(gòu)圖如圖10所示。

圖10 系統(tǒng)結(jié)構(gòu)設(shè)計(jì)圖
根據(jù)垃圾桶的建模結(jié)構(gòu)設(shè)計(jì)圖,進(jìn)行實(shí)物制作,如圖11所示。

圖11 實(shí)物圖
本設(shè)計(jì)的程序主要有三個(gè)部分:1)Linux端,主要有人臉檢測(cè)部分,稱重采集數(shù)據(jù)部分,服務(wù)器通信部分;2)服務(wù)器端,主要有人臉識(shí)別部分,通信部分,數(shù)據(jù)庫(kù)存取部分;3)網(wǎng)頁前端,用于管理數(shù)據(jù)庫(kù)。
人臉檢測(cè)識(shí)別有兩個(gè)部分,第一個(gè)是人臉檢測(cè),Linux系統(tǒng)端檢測(cè)攝像頭的每一幀圖像是否有人臉并剪裁出人臉區(qū)域圖像,保存到本地;第二個(gè)是人臉識(shí)別,在服務(wù)器PC(Personal Computer)端根據(jù)收到的人臉圖片與數(shù)據(jù)庫(kù)中的用戶圖片對(duì)比,完成識(shí)別。如果是數(shù)據(jù)庫(kù)中沒有的新用戶圖像,則進(jìn)行保存。
3.1.1 Linux系統(tǒng)端 Linux系統(tǒng)端是人臉檢測(cè)。需要把攝像頭每一幀的圖像進(jìn)行人臉檢測(cè),將人像部分標(biāo)注矩形框,根據(jù)標(biāo)注的矩形框進(jìn)行圖片剪裁,將剪裁的人臉圖片保存在本地文件夾中。
以TensorFlow1.14為工具,使用深度卷積神經(jīng)絡(luò)的人臉檢測(cè)和人臉對(duì)齊方法——MTCNN(Multi-task convolutional neural networks)。MTCNN由三個(gè)神經(jīng)網(wǎng)絡(luò)構(gòu)成:P-NET,R-NET,O-NET。首先將圖片縮放到不同尺度,這樣不同大小的臉可以進(jìn)行同尺度的檢測(cè)識(shí)別。
算法使用了三個(gè)神經(jīng)網(wǎng)絡(luò)。P-Net的輸入是一個(gè)寬和高皆為12像素,同時(shí)是3通道的RGB圖像,該網(wǎng)絡(luò)要判斷這個(gè)12×12的圖像中是否含有人臉,并且給出人臉框和關(guān)鍵點(diǎn)的位置。R-NET對(duì)P-NET的結(jié)果進(jìn)一步調(diào)優(yōu),結(jié)構(gòu)與P-NET類似,不同在于R-Net是24×24×3的圖像,P-Net,R-Net結(jié)構(gòu)如圖12所示。所得區(qū)域放大到48×48,輸入到O-NET,O-NET結(jié)構(gòu)同P-NET類似,不同在于輸入的是48×48×3的圖像,O-Net結(jié)構(gòu)如圖13所示。

圖12 P-Net,R-net網(wǎng)絡(luò)結(jié)構(gòu)

圖13 O-Net網(wǎng)絡(luò)結(jié)構(gòu)
整體來看,從P-Net到O-Net,網(wǎng)絡(luò)輸入的圖片越來越大,卷積層的通道數(shù)越來越多,內(nèi)部層數(shù)也越來越多,識(shí)別的準(zhǔn)確率是越來越高的。P-Net到O-Net識(shí)別速度依次遞減,準(zhǔn)確率依次遞增,如果只是用O-Net,識(shí)別速度會(huì)特別慢。采取這種結(jié)構(gòu)的優(yōu)點(diǎn)在于,通過P-Net,R-Net過濾后,O-Net的識(shí)別速度會(huì)快很多,整體識(shí)別速率快,準(zhǔn)確率高。實(shí)現(xiàn)過程如圖14所示[9,10]。

圖14 實(shí)現(xiàn)過程
3.1.2 服務(wù)器PC(Personal Computer)端 服務(wù)器接收到人臉區(qū)域的圖片后,接下來進(jìn)行人臉識(shí)別。輸入神經(jīng)網(wǎng)絡(luò)的是圖像,經(jīng)過一系列卷積計(jì)算后,全連接分類得到類別概率[10]。
在原始的CNN模型中,使用的是Softmax損失,對(duì)人臉來說,每一類就是一個(gè)人。Softmax損失可以區(qū)別每個(gè)人,單本質(zhì)上對(duì)每一類向量表示之間的距離沒有做出要求。使用中心損失定義改進(jìn)這種情況。
設(shè)人臉圖像為xi,對(duì)應(yīng)類別yi,類別中心cyi,對(duì)應(yīng)特征f(xi)。
中心定義為
多張圖像中心損失為值加在一起

L=Lsoftmax+γLcenter
在提取特征值后,這種特征已經(jīng)具有相同人對(duì)應(yīng)向量距離小,不同人對(duì)應(yīng)距離大的特點(diǎn),只需要計(jì)算向量之間的距離,設(shè)定合適的報(bào)警閾值。
稱重算法是將輸入的AD值轉(zhuǎn)換為穩(wěn)定的重量數(shù)據(jù)輸出。
采樣頻率50Hz,算法流程圖如圖15所示。1)判斷AD值是否發(fā)生變化。輸入的AD值會(huì)在一個(gè)小范圍內(nèi)波動(dòng),當(dāng)AD值處于一個(gè)范圍數(shù)d中時(shí),認(rèn)為AD值不變,即此時(shí)處于穩(wěn)定的狀態(tài),當(dāng)AD值大于這個(gè)范圍數(shù)d時(shí),認(rèn)為AD值發(fā)生變化,即重物狀態(tài)發(fā)生變化。2)變化后判斷是否穩(wěn)定。垃圾剛?cè)尤肜皶r(shí),會(huì)有一個(gè)短暫的沖擊,所以,當(dāng)采集的AD值發(fā)生變化時(shí),每接收到一個(gè)AD值,都會(huì)與上一個(gè)AD值進(jìn)行比較,差值小于d,計(jì)數(shù)加1,差值大于d,計(jì)數(shù)清零,當(dāng)計(jì)數(shù)達(dá)到n時(shí),認(rèn)為扔進(jìn)的垃圾已經(jīng)穩(wěn)定,輸出此時(shí)的AD差值。3)取均值。當(dāng)狀態(tài)穩(wěn)定后,對(duì)輸出的重量變化值取m個(gè)計(jì)算均值輸出,即投入垃圾的重量。

圖15 稱重算法流程圖
服務(wù)器-數(shù)據(jù)庫(kù)部分主要是與Linux系統(tǒng)板通過Socket傳輸圖片和文本信息,與數(shù)據(jù)庫(kù)提取和存儲(chǔ)圖片及文本信息,傳輸過程如圖16所示。

圖16 Socket傳輸過程圖
1)服務(wù)器端有一個(gè)程序在運(yùn)行,Linux系統(tǒng)端與這個(gè)程序進(jìn)行通信。Linux系統(tǒng)端先發(fā)送文本信息再發(fā)送圖片信息。發(fā)送接收信息使用Python Socket模塊中的send,recv命令。發(fā)送圖片信息時(shí),Linux系統(tǒng)端首先定義好文件頭信息,包含文件名和文件大小,通過struct模塊打包好后,先發(fā)送給服務(wù)器,之后文件則每次發(fā)送128bytes,經(jīng)過多次循環(huán)后將整個(gè)文件發(fā)送給服務(wù)器端。服務(wù)器端通過struct模塊獲取到文件頭信息,再將接收的圖片文件存到本地,通過頭文件信息給文件命名。
2)使用的數(shù)據(jù)庫(kù)是MongoDB,一個(gè)基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫(kù)系統(tǒng),其內(nèi)容存儲(chǔ)形式類似JSON對(duì)象,它的字段值可以包含其他文檔、數(shù)組及文檔數(shù)組,非常靈活。首先,建立一個(gè)數(shù)據(jù)庫(kù),在對(duì)應(yīng)數(shù)據(jù)庫(kù)中建立一個(gè)集合,通過GridFS實(shí)現(xiàn)圖片的存取。程序流程,鏈接MongoDB,從本地目錄遍歷所有圖片,將圖片名字存到集合中,循環(huán)讀取目錄名字,在每一次循環(huán)中,使用目錄地址加文件名構(gòu)成存入地址,創(chuàng)建文件和寫入流,把地址和名字拆分后將數(shù)據(jù)寫入,并打印數(shù)據(jù)id。創(chuàng)建成功后,會(huì)在集合中產(chǎn)生fs.flies和fs.chunks.根據(jù)存儲(chǔ)時(shí)打印的id讀取圖片,給予GridFS模塊來寫出[11]。
通過實(shí)驗(yàn)驗(yàn)證,設(shè)計(jì)方案是可行的,系統(tǒng)運(yùn)行能達(dá)到預(yù)期的效果。改善垃圾分類最好的環(huán)節(jié)是在用戶端進(jìn)行干預(yù),做正確的垃圾分類投放。系統(tǒng)可以裝配到現(xiàn)有的垃圾回收設(shè)施上,成本較低;通過人臉的采集和服務(wù)器數(shù)據(jù)庫(kù)結(jié)合可以對(duì)個(gè)人行為進(jìn)行更有效的監(jiān)督和激勵(lì)。