馬 寧
(蘇州大學,江蘇 蘇州 215100)
自改革開放以來,我國國民經(jīng)濟不斷提高,公民可支配收入也不斷提高,對普通家庭來說,汽車不再是遙不可及的奢侈品。越來越多的家庭購買了一輛汽車,條件好的家庭甚至更多。據(jù)調(diào)查,2003年,我國私家車擁有量不足600萬輛;2014年超過1億輛;2019年底,突破2億輛,達到2.07億輛。汽車的普及固然給民眾生活帶來了方便,也帶來了堵車、停車難、環(huán)境污染等問題。
當下許多小區(qū)、商場、景區(qū)都修建了停車場,大部分停車場都使用了自動化停車系統(tǒng),但費用較高,受環(huán)境限制多,難以滿足露天停車場的需求,且仍需要人工輔助管理;而一些資金不充裕、車位不充?;蛘咭颦h(huán)境限制不能安裝自動化停車系統(tǒng)的停車場也需要及時統(tǒng)計車位信息,方便游客停車。
另一方面,過去十年,我國私家車數(shù)量翻了一倍,停車場建設(shè)節(jié)奏卻相對落后。據(jù)國家發(fā)改委估計:當前缺口已升至8000萬個左右。加強停車場建設(shè)迫在眉睫,而另一方面,停車場建設(shè)費用過高,導致很多中小企業(yè)無力承擔,其余社會資本也持觀望態(tài)度,不愿加強投資?!安凰憷?,靜態(tài)收回建設(shè)成本需30多年。”[1]其中自動化停車系統(tǒng)雖然不是最貴的部分,但若能減少開支,也將減少大量成本,加速停車場建設(shè)。
因此針對以上需求,開發(fā)一種價格低廉、智能、受環(huán)境限制小、方便管理的車位實時監(jiān)測系統(tǒng)迫在眉睫。
Python3是一種廣泛使用的解釋性語言,它提供了高效的高級函數(shù)功能以及簡單強大的面向?qū)ο蠊δ?。python語言邏輯清晰,代碼簡潔,對中文有較好的支持,且內(nèi)置了多種常用數(shù)據(jù)類型,擁有大量功能強大的第三方庫,如Numpy、Pandas、OpenCV、Django等等。經(jīng)過幾代的更新與迭代,Python功能越來越完善。在2021年10月,語言流行指數(shù)排行榜Tiobe將Python加冕為最受歡迎的編程語言,是20年來首次將其置于Java、C等老牌編程語言之上,可見其火熱程度。本文使用解釋器版本為Python3.7,IDE為Pycharm2021。
OpenCV是一個基于Apache2.0發(fā)行的機器視覺和機器學習開源庫,它具有良好的兼容性,可以運行在Linux、Windows、Android和Mac OS等多個操作系統(tǒng)上。它整體由C語言和C++語言構(gòu)成,同時提供了Python、Ruby、MATLAB等編程語言的拓展接口,能夠使用多種語言完成開發(fā)工作,其內(nèi)置了大量圖像處理和計算機視覺領(lǐng)域的通用算法,可以實現(xiàn)物體識別、人臉識別、動作識別、運動跟蹤等多種功能,是圖像處理、機器視覺領(lǐng)域重要的軟件庫[2-3]。
本文使用OpenCV版本為4.5.3.56。
人類的視覺系統(tǒng)在大腦可視皮層是分級處理的,大腦的處理視覺信息的工作過程是一個不斷迭代、不斷抽象的過程。首先從瞳孔攝入的原始圖像開始,再由大腦皮層某些細胞發(fā)現(xiàn)物體的邊緣和方向;然后由大腦判定眼前物體的大致形狀,進行抽象化;接著大腦進一步進行判定物體的屬類;最后通過分析出的信息,得出結(jié)論。
CNN網(wǎng)絡(luò)全稱卷積神經(jīng)網(wǎng)絡(luò),是受人類視覺神經(jīng)系統(tǒng)啟發(fā)而開發(fā)出的深度學習模式。它可分為卷積層、池化層和全連接層,其中卷積層用來提取圖像中的局部特征;池化層用來大幅降低參數(shù)量級;全連接層用來輸出結(jié)果。卷積神經(jīng)網(wǎng)絡(luò)能夠較好地處理像素和音視頻等有穩(wěn)定的效果且對數(shù)據(jù)沒有額外的特征工程要求的數(shù)據(jù)信息,是深度學習的經(jīng)典算法,被廣泛應(yīng)用于計算機視覺、自然語言處理等領(lǐng)域。
系統(tǒng)設(shè)計流程大致可分為預處理,車位劃分,CNN模型構(gòu)建與訓練,車位識別等階段。預處理階段將對信息進行處理,只保留其中的有效信息;車位劃分階段將車位提取出來,分別保存作為樣本;模型訓練階段將訓練二分類模型識別停車位上是否有車;最后對視頻的實時監(jiān)測,并標記空位、統(tǒng)計數(shù)量,實時顯示。
首先導入所需的停車場監(jiān)控視頻,該視頻下載自網(wǎng)絡(luò),采用該視頻的理由是光線充足,樣本量大,交通環(huán)境相對不復雜,利于設(shè)計和訓練。視頻的本質(zhì)是一組連續(xù)的圖像,當圖像變化超過24幀/s以上時,根據(jù)人眼的視覺暫留原理,會在大腦中產(chǎn)生的連續(xù)的畫面。因此對于視頻的處理的本質(zhì)就是對圖像的處理。又因為視頻拍攝機位固定不動,所以對整個視頻的車位劃分可以簡化到對單幀圖像的車位劃分,大大提升了效率[4-5]。
為了方便后期處理,首先要進行背景過濾,目的是過濾掉圖像中無關(guān)的背景信息,方便后續(xù)的識別,方法是定義掩模,設(shè)置最大閾值和最小閾值,將閾值區(qū)間外的信息轉(zhuǎn)化為零值信息。
第二步要進行二值化處理,將圖像轉(zhuǎn)化為灰度圖。這是因為灰度圖只保留了亮度信息,省略了大量無關(guān)信息,有效降低了后期運算量。
第三步進行Canny邊緣檢測,該方法分為四個步驟:高斯濾波、計算梯度值和梯度方向、過濾非最大值、雙閾值檢測法。它可以有效確定真實的和潛在的邊緣,能夠較好地檢測出大部分所需邊界[6]。
因為停車場的邊界不規(guī)則,外部的樓頂、道路信息不屬于停車場范圍,需要過濾掉,所以第四步需要沿停車場路徑設(shè)置8個節(jié)點,用來框選停車場的圖像,使用零點信息圖像覆蓋掉不需要的部分,僅保留停車場區(qū)域。至此預處理階段的工作就完成了。見圖1、圖2。
圖1 原始圖像
圖2 預處理結(jié)果
通過觀察可以發(fā)現(xiàn),停車場車位由橫豎不同的直線構(gòu)成,可以通過檢測這些直線,進一步劃分區(qū)域。方法是使用霍夫變換,霍夫變換是一種廣泛應(yīng)用在計算機視覺的一種特征檢測算法,用來找出圖形中的某些特征,霍夫變換通過給定的要辨別的形狀的種類,接著在參數(shù)空間中通過投票機制來決定物體的形狀,并過濾掉間隔過大或過小的物體,來獲取到較為準確的結(jié)果。圖像中某些裂痕或其他線段可能會被誤認為車位線,而車位線基本呈豎直或水平方向,可以通過計算線段斜率來進一步剔除不合規(guī)的線段,提高準確率。
接著對停車位進行區(qū)域劃分,通過觀察可以發(fā)現(xiàn),停車場的車位可分為17列,可以將相近橫坐標的車位線分類到同一集合,再按縱坐標將各個集合中的車位線從下到上進行排序,并通過哈希算法判斷是否出現(xiàn)重復的線段,若出現(xiàn)則將其剔除。這樣做的目的是后續(xù)處理時,對整個停車場的處理可以看做對17個區(qū)域的單獨處理,更方便模型訓練和數(shù)量統(tǒng)計。
但是此時算法獲得的車位線集合仍然不夠理想,這是因為部分車輛遮擋線段,造成霍夫變換識別不準確。為了解決這一問題,需要將各個車位線集合的橫線長度統(tǒng)一取其眾數(shù),并將所有線段的起始橫坐標點設(shè)為各個車位線集合的最左值,接著將單個車位線集合中所有的豎線合并成同一條豎線。這樣劃分的車位就更加準確和統(tǒng)一。
可以看到劃分的結(jié)果基本符合預期,接著將獲得的車位坐標信息寫入pickle文件,用以保存。最后按劃分好的車位線集合裁切車位,由于圖像像素值過小,所以在保存前需要將其進行放大操作,最后保存到測試集文件夾中,用作下一步的模型訓練與測試中。見下頁圖3。
圖3 車位劃分結(jié)果
獲得車位圖像后將其按照70%、30%的比例劃分為訓練集、測試集,再將其按照有無車輛占據(jù)車位分別劃分為占據(jù)集和非占據(jù)集,用于后續(xù)模型訓練。
本次模型訓練使用VGG16網(wǎng)絡(luò),VGGNet是牛津大學和谷歌DeepMind于2014年合作研發(fā)的神經(jīng)網(wǎng)絡(luò),由13層卷積層+3層全連接層而組成。卷積層是卷積神經(jīng)網(wǎng)絡(luò)的核心,卷積過程本質(zhì)是基于一個小矩陣,也就是卷積核,在圖像的每層像素矩陣上不斷按步長掃描過去,掃到的數(shù)值與卷積核對應(yīng)位置的數(shù)相乘,然后相加求和,全部掃完就會生成一個新的矩陣。卷積核相當于一個過濾器,用于提取圖像特征,卷積核一般有3*3和5*5大小,通常使用是3*3大小的,訓練效果更好。全連接層指的是第n-1層和第n層的各個節(jié)點之間都有連接,即第n層的節(jié)點的激活函數(shù)輸入是第n-1層所有節(jié)點的加權(quán),用來把前邊提取到的特征綜合起來。在整個卷積神經(jīng)網(wǎng)絡(luò)中起到“分類器”的作用。
由于數(shù)據(jù)集規(guī)模較小,為了得到較好的模型,第三步進行數(shù)據(jù)增強操作。數(shù)據(jù)增強按照使用方法可分為線上增強和線下增強,其中線下增強適用于規(guī)模較小的數(shù)據(jù)集,能夠有效增加其的大小。增強的倍數(shù)取決于轉(zhuǎn)換圖片的個數(shù),比如對所有圖片進行旋轉(zhuǎn)操作,將使數(shù)據(jù)集增加一倍。常用的數(shù)據(jù)增強有兩種,有監(jiān)督和無監(jiān)督,常用的是有監(jiān)督數(shù)據(jù)增強型,它是基于現(xiàn)有的數(shù)據(jù)集,通過分析數(shù)據(jù)的完備性,采用一定的規(guī)則對現(xiàn)有數(shù)據(jù)進行擴充。有監(jiān)督數(shù)據(jù)增強又可以細分為單樣本數(shù)據(jù)增強和多樣本數(shù)據(jù)增強,在實際應(yīng)用中,單樣本數(shù)據(jù)增強使用更多。
最后將訓練集的數(shù)據(jù)導入模型,進行訓練。所有程序運行完成后得到的測試集的準確率達91.4%,準確率基本符合預期。后續(xù)可以將VCC16改為ResNet50,以進一步提高準確率,但ResNet50的訓練速度相較VCC16較慢,從效率角度考慮,最終選擇了VCC16。最后將訓練好的模型保存,用于下一步操作。
首先導入視頻,將視頻逐幀提取,并對逐幀畫面用已經(jīng)訓練好的模型進行測試。并對每幀的車輛數(shù)據(jù)進行統(tǒng)計,在視頻左上角顯示車位總數(shù)和剩余空位。此時視頻較為卡頓,可以在后續(xù)優(yōu)化中使用多線程或多GPU進行處理,提高速度。見圖4。
圖4 車位檢測結(jié)果
程序會對視頻進行實時處理和檢測,視頻中未被占據(jù)的車位都被標記為綠色,被占據(jù)的車位沒有任何標記,通過對綠色矩形的計數(shù),在左上角實時顯示車位總數(shù)和剩余車位。此時視頻某些時段對某些區(qū)域出現(xiàn)了誤標記,比如將停車場的引導線區(qū)域被標記為空停車位,或者將帳篷標記為占用車位??梢酝ㄟ^修改CNN模型進一步改善。其余區(qū)域的檢測和統(tǒng)計基本符合預期,當車輛離開車位,視頻中便以綠色進行標記,同時空位加一;當車輛進入車位,視頻的綠色標記便消失,同時空位減一。實現(xiàn)了對停車位信息的處理和檢測。
通過對OpenCV和卷積神經(jīng)網(wǎng)絡(luò)實現(xiàn)了對停車場車位的占用情況進行了實時監(jiān)測和統(tǒng)計,可以部署到較為開闊的停車場,方便管理。此外,該系統(tǒng)還可以進一步優(yōu)化,以提高速度,適應(yīng)更復雜的場景,從而為停車場管理提供更加有效、及時的數(shù)據(jù)。