陳鴻彬,程楷泳,林梓泓,連曉茵,劉培杰,陳鍵宇
(華南農(nóng)業(yè)大學(xué)數(shù)學(xué)與信息學(xué)院,廣州510642)
近年來,隨著國民生產(chǎn)總值的提高,人們變得越來越富裕,大多數(shù)人會(huì)選擇購買機(jī)動(dòng)車來提高自己的出行效率。據(jù)統(tǒng)計(jì)[1],機(jī)動(dòng)車的數(shù)量呈逐年上升趨勢,截止到2019 年上半年全國機(jī)動(dòng)車保有量已達(dá)3.4 億,如圖1 所示。雖然機(jī)動(dòng)車在一定程度上方便了我們的出行,但是隨之而來的道路擁堵問題也變得不容忽視,因此,越來越多的市民選擇乘坐公共交通工具出行。加之,人們環(huán)保意識(shí)不斷提高,政府大力提倡低碳生活,公交車出行已經(jīng)成了一種大眾認(rèn)同的出行方式。與此同時(shí),公交車司機(jī)肩負(fù)著全車乘客的安危,如何規(guī)范司機(jī)的行為、降低事故發(fā)生率就顯得尤為重要。
當(dāng)兩車相撞時(shí),駕駛員不系安全帶的死亡率為75%,而系安全帶的生還率為95%。作為車內(nèi)最有效的保護(hù)措施之一,佩戴安全帶駕駛一直是我國法律明文規(guī)定的駕駛行為,但目前對駕駛員是否佩戴安全帶的問題仍以人工篩查為主。但是傳統(tǒng)的檢測方法存在效率低下、準(zhǔn)確率不高、易受人為因素干擾、需要耗費(fèi)大量的人力物力等問題,實(shí)現(xiàn)未系安全帶檢測的智能化處理逐漸成為研究的熱點(diǎn)。
圖1 2014到2019年上半年全國機(jī)動(dòng)車保有量
深度學(xué)習(xí)是近年來人工智能領(lǐng)域取得的重大突破,它在語音識(shí)別、計(jì)算機(jī)視覺、圖像與視頻分析、多媒體、教育事業(yè)[2]等諸多領(lǐng)域的應(yīng)用取得了巨大成功。與傳統(tǒng)的圖像處理相比,深度學(xué)習(xí)對數(shù)據(jù)集的表達(dá)更高效和精確,提取的抽下行特征魯棒性更強(qiáng),泛化能力更好。
因此,把深度學(xué)習(xí)運(yùn)用到駕駛員是否佩戴安全帶的檢測也逐漸稱為研究的熱點(diǎn)。
目前,國內(nèi)外主要的安全帶檢測方法有以下幾種:
(1)通過安裝傳感器的方法對安全帶佩戴進(jìn)行檢測識(shí)別,如在卡座中安裝傳感器進(jìn)行檢測[3],系統(tǒng)判定只有當(dāng)安全帶卡扣插入安全帶卡座并且鎖定的情況才是安全帶正常佩戴的情況。但是駕駛員經(jīng)常有假佩戴的行為出現(xiàn)[4],例如先將安全帶卡扣扣好,然后再坐在座椅上。
(2)通過在坐墊和靠背上安裝壓力傳感器來進(jìn)行輔助檢測,但這種方法不能直接檢測出駕駛員是否佩戴安全帶,準(zhǔn)確率不高[5]。
(3)基于灰度積分投影的方法對安全帶進(jìn)行檢測識(shí)別[6]。通過道路監(jiān)控的方式采集的駕駛員圖像,對安全帶佩戴進(jìn)行檢測。但是該方法需要具有反光性能的安全帶,不具有普遍適用性。
(4)以Guo 等人為代表提出的基于圖像處理的傳統(tǒng)方法[7],該方法將邊緣檢測和霍夫直線變化相結(jié)合,檢測安全帶的兩條長直線邊緣,從而實(shí)現(xiàn)對安全帶的檢測。但是該方法受缺乏魯棒性,而且對圖像的質(zhì)量要求較高,因此較難推廣。
(5)以Chen 等人為代表提出的基于AdaBoost 的安全帶檢測系統(tǒng)[8],該方法通過Haar 特征提取和模型訓(xùn)練,用加權(quán)級(jí)聯(lián)的方法把各種弱分類器變成一個(gè)強(qiáng)分類器[9],最后經(jīng)過高斯混合模型的后處理得到安全帶的精確檢測結(jié)果。雖然該方法與傳統(tǒng)方法相比,檢測精度和魯棒性有了一定提升,但是其檢測精度還達(dá)不到可推廣應(yīng)用的地步,對圖像質(zhì)量的要求仍較高,安全帶檢測的誤報(bào)也較多。
本文旨在實(shí)現(xiàn)對公交車司機(jī)是否系安全帶的智能檢測,即通過對車內(nèi)視頻資料的處理和分析,定位安全帶的位置,通過圖像處理識(shí)別出公交車司機(jī)是否系安全帶,對不按規(guī)定佩戴安全帶的公交車司機(jī)給予一定的懲罰,從而規(guī)范公交車司機(jī)行為,降低事故發(fā)生率。
傳統(tǒng)機(jī)器學(xué)習(xí)存在以下幾個(gè)弊端:
(1)訓(xùn)練機(jī)器模型需要有大量的數(shù)據(jù),這些數(shù)據(jù)往往需要人工標(biāo)注[10],耗時(shí)耗力。
(2)龐大的訓(xùn)練數(shù)據(jù)難以獲取。
(3)數(shù)據(jù)分布差異
在大多數(shù)情況下,面對某一領(lǐng)域的某一特定問題,都不可能找到足夠充分的訓(xùn)練數(shù)據(jù)。但是,得益于一種技術(shù)的幫助,從其他數(shù)據(jù)源訓(xùn)練得到的模型,經(jīng)過一定的修改和完善,就可以在類似的領(lǐng)域得到復(fù)用,這一點(diǎn)大大緩解了數(shù)據(jù)源不足引起的問題,而這一關(guān)鍵技術(shù)就是遷移學(xué)習(xí)(Transfer Learning)[11]。
遷移學(xué)習(xí)是將一個(gè)領(lǐng)域的已經(jīng)成熟的知識(shí)應(yīng)用到其他的場景中。用神經(jīng)網(wǎng)絡(luò)的角度來表述,就是一層層網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)的權(quán)重從一個(gè)訓(xùn)練好的網(wǎng)絡(luò)遷移到一個(gè)全新的網(wǎng)絡(luò)里,而不是從頭開始,為每特定的任務(wù)訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)。假設(shè)現(xiàn)有一個(gè)可以高精確度分辨貓和狗的深度神經(jīng)網(wǎng)絡(luò),而想新訓(xùn)練一個(gè)能夠分別不同品種的狗的圖片模型,你需要做的不是從頭訓(xùn)練那些用來分辨直線,銳角的神經(jīng)網(wǎng)絡(luò)的前幾層,而是利用訓(xùn)練好的網(wǎng)絡(luò),提取初級(jí)特征,之后只訓(xùn)練最后幾層神經(jīng)元,讓其可以分辨狗的品種。節(jié)省資源是遷移學(xué)習(xí)最大意義之一,舉圖像識(shí)別中最常見的例子,訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)來識(shí)別不同的品種的貓,你若是從頭開始訓(xùn)練,你需要百萬級(jí)的帶標(biāo)注數(shù)據(jù),海量的顯卡資源。而若是使用遷移學(xué)習(xí),你可以使用Google 發(fā)布的Incep?tion 這樣成熟的物品分類的網(wǎng)絡(luò),只訓(xùn)練最后的Soft?max 層,你只需要幾千張圖片,使用普通的CPU 就能完成,而且模型的準(zhǔn)確性不差。對于數(shù)據(jù)集本身很?。◣浊垐D片)的情況,從頭開始訓(xùn)練具有幾千萬參數(shù)的大型神經(jīng)網(wǎng)絡(luò)是不現(xiàn)實(shí)的,因?yàn)樵酱蟮哪P蛯?shù)據(jù)量的要求越大,過擬合無法避免。這時(shí)候如果還想用上大型神經(jīng)網(wǎng)絡(luò)的超強(qiáng)特征提取能力,只能靠遷移學(xué)習(xí)。
以上所提及的遷移學(xué)習(xí)模型在這里采用的是GoogLeNet(Inception V3),Inception V3 將7×7 分解成兩個(gè)一維的卷積,既可以加速計(jì)算,又可以將1 個(gè)卷積拆成2 個(gè)卷積,使得網(wǎng)絡(luò)深度進(jìn)一步增加,增加了網(wǎng)絡(luò)的非線性(每增加一層都要進(jìn)行ReLU)。我們在使用這個(gè)模型的時(shí)候不修改bottleneck 層之前的參數(shù),只需要訓(xùn)練最后一層全連接層就可以了。如圖2 和圖3所示。
圖2
圖3
具體思路:
(1)從預(yù)訓(xùn)練模型以字符串形式讀取數(shù)據(jù),并解析其中的瓶頸層張量,jepg 格式圖像數(shù)據(jù)張量,預(yù)訓(xùn)練圖像大小張量[13],然后使用TensorFlow.import_graph_def導(dǎo)入初始圖中。
(2)獲取訓(xùn)練圖像數(shù)據(jù),根據(jù)讀取設(shè)置好的文件夾里的圖像數(shù)據(jù),并以文件夾名稱作為該類的名稱。
(3)確保訓(xùn)練集、測試集和驗(yàn)證集數(shù)據(jù)都被緩存。因?yàn)槲覀儠?huì)多次讀取到同一幅圖像,我們在預(yù)處理過程中為每個(gè)圖像計(jì)算一次瓶頸層值并保存下來,然后在訓(xùn)練期間重復(fù)讀取這些緩存值,這樣子操作可以大大加快速度。
(4)為訓(xùn)練添加新的Softmax 和全連接層。重新訓(xùn)練頂層來識(shí)別我們的新類,在這里我們實(shí)現(xiàn)的根據(jù)是TensorFlow 官方發(fā)布的一個(gè)操作。
(5)插入用于我們評估結(jié)果準(zhǔn)確性的標(biāo)簽。
(6)將所有summary 全部保存到磁盤,以便訓(xùn)練完成以后在TensorBoard 顯示。
(7)讀取命令行指定的一個(gè)文件來保存圖。
(8)將所有權(quán)重設(shè)置為初始默認(rèn)值。
(9)至此構(gòu)造完了一個(gè)圖,創(chuàng)建一個(gè)Session 對象并啟動(dòng)它。
(10)讀取手動(dòng)設(shè)置的迭代次數(shù),進(jìn)行迭代。
在每次迭代中,獲取一批輸入瓶頸值,這些值可以通過應(yīng)用失真每次重新計(jì)算,也可以從存儲(chǔ)在磁盤上的緩存中計(jì)算。
①獲取訓(xùn)練圖像失真后的瓶頸值,為每個(gè)圖像重新計(jì)算完整的模型。相反,為所要的類別找到隨機(jī)的圖像,運(yùn)行它們通過變形圖,然后運(yùn)行全圖得到每個(gè)瓶頸的結(jié)果。
②檢索緩存映像的瓶頸值。如果沒有任何失真圖像被應(yīng)用,可以直接從磁盤檢索緩存的瓶頸值,然后選擇一個(gè)隨機(jī)集合來自指定類別的圖像。
③將訓(xùn)練過程數(shù)據(jù)保存在filewriter 指定的文件中。
④將加權(quán)的訓(xùn)練好的圖和標(biāo)簽作為一個(gè)常量。
(11)迭代結(jié)束訓(xùn)練也完成了。
本模型選用百度安全帶分類圖片庫的圖片數(shù)據(jù),采用Google 提供的Inception-v3 模型[14]作為預(yù)訓(xùn)練模型。本遷移學(xué)習(xí)方法的具體實(shí)現(xiàn)是,不修改bottleneck層之前的參數(shù),替換掉了Inception-v3 模型的最后一層全連接層,以達(dá)到識(shí)別我們目標(biāo)分類的目的。操作步驟為:
(1)設(shè)置我們寫入TensorBoard 摘要的目錄。
(2)設(shè)置預(yù)訓(xùn)練圖像。
(3)查看文件夾結(jié)構(gòu),創(chuàng)建所有圖像的列表。
(4)驗(yàn)證我們是否需要應(yīng)用扭曲操作。
(5)定義新的全連接層和Softmax 層來訓(xùn)練模型以解決新的圖片分類問題。
(6)創(chuàng)建評價(jià)模型性能指標(biāo)的計(jì)算圖并用Tensor?Board 可視化平均精度。
(7)按照命令行的要求運(yùn)行多個(gè)周期的訓(xùn)練,每次隨機(jī)得到一批訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練,每迭代幾次在驗(yàn)證集上做一次測試以評估模型性能并保存在驗(yàn)證集上最佳的測試精度及相應(yīng)的模型,同時(shí)保存TensorBoard 日志信息。
(8)完成了所有的訓(xùn)練,在一些我們從未用過的新的圖像上,運(yùn)行一個(gè)最后的測試評估這樣子,我們就訓(xùn)練出一個(gè)應(yīng)用于安全帶識(shí)別的訓(xùn)練模型。
在上述算法實(shí)現(xiàn)的基礎(chǔ)之上,我們完成了安全帶識(shí)別系統(tǒng)的搭建,采用C/S 架構(gòu)實(shí)現(xiàn)[15],主要分為兩個(gè)模塊:客戶端模塊、服務(wù)器端模塊。如圖4 所示。
圖4
客戶端界面用的是JavaFx 進(jìn)行編寫,后臺(tái)采用的是Java,與服務(wù)器之間通過Socket 進(jìn)行通信,服務(wù)器環(huán)境采用的是TensorFlow2.0,數(shù)據(jù)庫采用的是MySQL。
(1)功能設(shè)計(jì)
客戶端負(fù)責(zé)將選取的視頻進(jìn)行截幀,然后調(diào)用服務(wù)器端的訓(xùn)練模型進(jìn)行識(shí)別,識(shí)別完成之后對結(jié)果進(jìn)行存儲(chǔ),還可進(jìn)行識(shí)別結(jié)果的查詢。
(2)具體實(shí)現(xiàn)
先從本地上選取視頻,將選取的視頻按照一定的幀率進(jìn)行截圖,并存進(jìn)指定本機(jī)的指定文件夾內(nèi)。接下來,客戶端與服務(wù)器端建立Socket 通信,將文件夾中的照片傳遞到服務(wù)器端并調(diào)用訓(xùn)練模型進(jìn)行識(shí)別。最后,客戶端接受服務(wù)器端識(shí)別的每張照片識(shí)別概率并與預(yù)先設(shè)定好的概率進(jìn)行比較,確定出每張照片是否違規(guī),根據(jù)比較結(jié)果進(jìn)行展示,將識(shí)別結(jié)果進(jìn)行存儲(chǔ)。
(1)功能設(shè)計(jì)
服務(wù)器端負(fù)責(zé)將客戶端發(fā)送的多張圖片進(jìn)行存儲(chǔ),通過調(diào)用訓(xùn)練模型進(jìn)行識(shí)別,將識(shí)別結(jié)果返回給客戶端。主要涉及兩個(gè)功能:
①接收客戶端發(fā)送的多張jpg 格式圖片,識(shí)別出圖片名字并臨時(shí)存儲(chǔ)到本地圖片文件夾中。
②調(diào)用訓(xùn)練模型識(shí)別多張圖片,并將識(shí)別結(jié)果與圖片對應(yīng)返回給客戶端。
(2)具體實(shí)現(xiàn)
使用serverSocket 與客戶端進(jìn)行Socket 通信[16],并采用多線程處理客戶端的多個(gè)請求消息,達(dá)到并發(fā)處理多個(gè)客戶端請求的目的。單次通信操作中,使用cli?ent.recv()方法接收客戶端發(fā)來的二進(jìn)制數(shù)據(jù)流,首先讀取圖片張數(shù),讀取完圖片張數(shù)后依次讀取每一張圖片數(shù)據(jù),將其臨時(shí)存儲(chǔ)在圖片文件夾中,調(diào)用訓(xùn)練模型進(jìn)行識(shí)別,并將結(jié)果通過socket 通道以二進(jìn)制數(shù)據(jù)流的格式返回給客戶端,這樣子就完成了單張圖片的識(shí)別操作。
以下是具體實(shí)現(xiàn)過程:
①建立socket 連接過程
首先使用socket.socket()方法建立服務(wù)器端sock?et,使用bind()綁定目標(biāo)端口,之后使用listen()方法開始監(jiān)聽,等待客戶端的建立socket 請求。當(dāng)監(jiān)聽到客戶端發(fā)送來的socket 請求,使用_thread.start_new_thread()方法調(diào)用多線程處理客戶端消息,主線程繼續(xù)監(jiān)聽目標(biāo)端口,因此可以同時(shí)處理多個(gè)客戶端信息。
②接收圖片數(shù)據(jù)流過程
首先,使用struct.calcsize()方法接收圖片張數(shù)的位數(shù)信息,之后用client.recv()方法接收圖片張數(shù)信息,之后根據(jù)圖片張數(shù)信息使用循環(huán)接收圖片數(shù)據(jù)流,存放到服務(wù)器端圖片文件夾中。具體實(shí)現(xiàn)思路如下:
先從客戶端socket 中獲取獲取一個(gè)數(shù)字長度的字符代表圖片張數(shù)的位數(shù)N,接收成功后,根據(jù)圖片張數(shù)的位數(shù)獲取N 個(gè)字符X,代表圖片張數(shù),之后進(jìn)入X 個(gè)循環(huán),每個(gè)循環(huán)中再有如下的步驟:首先獲取一個(gè)字符長度的文件名位數(shù)Y,再獲取Y 個(gè)字符的文件名;獲取完文件名之后開始獲取文件大小位數(shù)Z,根據(jù)Z 再獲取文件大小,此時(shí)一個(gè)文件的接收完畢。每次接收完圖片后清空輸入緩沖區(qū)。
③調(diào)用訓(xùn)練模型進(jìn)行識(shí)別并返回識(shí)別結(jié)果過程
每次成功接收一張圖片數(shù)據(jù)流并存放到圖片文件夾中之后,調(diào)用訓(xùn)練模型進(jìn)行識(shí)別,得到識(shí)別結(jié)果,并使用client.sendall()方法將識(shí)別結(jié)果返回。
安全帶識(shí)別系統(tǒng)的運(yùn)行如圖5 所示。
圖5
整個(gè)系統(tǒng)客戶端界面簡潔,功能結(jié)構(gòu)清晰,如圖6所示,客戶識(shí)別即可進(jìn)行視頻的選擇并開始識(shí)別,此過程需要一定時(shí)間,如圖7 所示,系統(tǒng)識(shí)別完成后則會(huì)顯示出結(jié)果,如圖8。
總體來說,本系統(tǒng)軟件能夠基本實(shí)現(xiàn)對公交車司機(jī)是否系安全帶的智能檢測,操作簡單,易用性強(qiáng),可移植性強(qiáng)。由于時(shí)間倉促,一些技術(shù)和設(shè)備所限,該系統(tǒng)存在一些不足之處,有待于進(jìn)一步改進(jìn)和完善。具體說來有:界面的美觀性和檢測的效率還需要加強(qiáng),本系統(tǒng)的訓(xùn)練集還是比較不足,后續(xù)會(huì)加強(qiáng)訓(xùn)練本系統(tǒng)的識(shí)別樣本,進(jìn)一步增強(qiáng)識(shí)別準(zhǔn)確性。系統(tǒng)設(shè)計(jì)在不違反系統(tǒng)整體性的基礎(chǔ)上,可根據(jù)用戶的需求進(jìn)行二次開發(fā),不斷完善系統(tǒng)功能,便于系統(tǒng)的不斷升級(jí)。希望本系統(tǒng)能夠幫助規(guī)范公交車司機(jī)行為,降低事故發(fā)生率。
圖6
圖7
圖8