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