點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

如何使用Mask-RCNN檢測停車位可用性?

空/占用停車位
我最近做了一個項目,根據(jù)安全攝像頭的照片來檢測停車位是否可用或被占用。我的工作有局限性,我將進一步詳細(xì)介紹這些局限性,但一旦這些問題得到解決,這個項目可能是一個低成本的解決方案,以優(yōu)化停車位的可用性。安裝這些額外的設(shè)備肯定是有潛力的。讓我詳細(xì)說明我在這個項目中使用的資源。Kaggle上有一個停車場數(shù)據(jù)集,無論位置是否被占用,它都有足夠的數(shù)據(jù)點來訓(xùn)練一個深度學(xué)習(xí)模型和xml文件,我們可以在這里訪問數(shù)據(jù)集停車場數(shù)據(jù)集。對于模型,我使用了最先進的目標(biāo)檢測和分割Mask-RCNN模型,它的性能驚人,可以通過這個鏈接訪問。如我們所見,Mask-RCNN在COCO數(shù)據(jù)集模型上進行了直接即用的預(yù)訓(xùn)練,在目標(biāo)檢測和分割方面做得很好。盡管在某些情況下,它把汽車誤分為火車和卡車。
Mask-RCNN對象檢測和分割
我也嘗試了YOLO-v3,它的性能是一樣的,所以我沒有進一步使用YOLO模型,但如果小伙伴正在尋找替代的模型,YOLO是一個很棒的對象檢測模型,這里有鏈接。
YOLO模型檢測停車場上的車輛
首先我使用Mask-RCNN模型來檢測車位上的車輛,并給定可用車位的數(shù)量來計算空車位。我們的模型不需要所有的COCO類,所以我將類限制為汽車、卡車和摩托車。但是預(yù)先訓(xùn)練的COCO數(shù)據(jù)集模型在檢測小物體方面做得并不好,即使我嘗試調(diào)整閾值和邊界框,那些被誤分類為火車的汽車也沒有被檢測到。這里繪制的是邊界框,而不是可視化方法提供的模型。
Mask-RCNN模型預(yù)測
基于數(shù)據(jù)集的預(yù)測,這樣我們就有兩個類來預(yù)測這個位置是被占用了還是空了。這個停車場數(shù)據(jù)集的不足之處是,只從兩個角度拍攝照片,這導(dǎo)致訓(xùn)練模型時存在過擬合問題,沒有很好的泛化能力。其次,每個車位的標(biāo)注不完整,在訓(xùn)練過程中會產(chǎn)生異常,并且并不是所有照片上可用的車位都被標(biāo)注了,這也導(dǎo)致了模型的性能較差。我將向小伙伴展示我的意思,下面的照片只是顯示了有多少停車位被注釋:
并非所有停車位都已標(biāo)注


注釋文件中缺少信息
缺少信息的停車位數(shù)量可能會增加到10-15個停車位,但在運行一些代碼后,我認(rèn)為這可以手動修復(fù):有太多的文件需要修復(fù),只為了訓(xùn)練模型的頂層,避免這些文件比較容易。為了解析xml文件,我使用了內(nèi)置的python包XML .etree.Elementtree。同樣值得注意的是,邊界框的坐標(biāo)是以一個中心點的角度給出的,所以如果我們想要正確地解析和創(chuàng)建邊界框,就必須進行一些調(diào)整。


函數(shù)解析xml文件,提取停車位的輪廓
由于Mask-RCNN使用掩碼來訓(xùn)練類,采用與KangarooDetection文章類似的方式,可以在這里訪問,我使用邊界框來創(chuàng)建掩碼。這篇文章實際上幫助我們理解了如何使用Mask-RCNN模型,并且機器學(xué)習(xí)掌握對于許多機器學(xué)習(xí)應(yīng)用程序來說是一個很好的資源。如果小伙伴還沒看過的話,可以瀏覽一下。主要的區(qū)別是,我們將檢測兩個類,而不是一個,從而創(chuàng)建基于占用分類的掩碼,以及如何計算邊界框。
函數(shù)在邊界框之外創(chuàng)建掩碼,并創(chuàng)建兩個要檢測的類
至于數(shù)據(jù)集結(jié)構(gòu),我們必須為訓(xùn)練和測試數(shù)據(jù)創(chuàng)建兩個目錄,每個包含圖像文件夾和匹配的標(biāo)簽文件夾,其中每個xml文件除了擴展名不同之外,都具有相同的文件名。而其余部分實際上是遵循一般的做法來訓(xùn)練Mask-RCNN的頂層,小伙伴可以在Matterport GitHub上查看不同的示例代碼。我們必須創(chuàng)建一個類ParkingLot來加載數(shù)據(jù)集,通過解析帶注釋的xml文件提取邊界框的輪廓。
創(chuàng)建停車場類
然后,我們需要指定配置類,基于我們希望模型訓(xùn)練的類,加載訓(xùn)練和測試數(shù)據(jù)集,使用“訓(xùn)練”模式加載模型,并開始訓(xùn)練。
停車配置類
模型將在每個時期后保存在日志文件夾中,以便在訓(xùn)練完成后,我們可以繼續(xù)加載模型以評估其性能。使用Mask-RCNN實現(xiàn)這一點的方法是創(chuàng)建新的配置類,該類將限制我們的預(yù)測范圍。
預(yù)測配置類
用“驗證集”模式加載模型,從logs文件夾加載模型:


函數(shù)繪制檢測對象的邊界框
因此,如果我們加載任意隨機圖像,檢測可用和已占用的停車位,使用我們的函數(shù)來繪制它們,結(jié)果將是:
綠色框是可用的停車位,藍(lán)色邊界框是已占用的停車位。這個模型的性能看起來是相當(dāng)不錯,盡管它仍然不能檢測到小車/停車位。數(shù)據(jù)集中故意忽略了停在人行道旁的汽車,這樣模型在訓(xùn)練時就不會考慮這些汽車。這是MaskRCNN可視化方法的結(jié)果:

Mask-RCNN檢測可用停車位
考慮到這個結(jié)果,似乎模型的性能真的很好。但在我們的數(shù)據(jù)集中,我們只有停車場的兩個角度,因為我只訓(xùn)練頂級模型,我只使用了數(shù)據(jù)集的一部分。所以,可以看一下另一張停車場的照片,用類似的攝像頭定位,但不是這個數(shù)據(jù)集的一部分。


很明顯,這個模型與我們的停車場數(shù)據(jù)集過于匹配,這意味著它在同一個數(shù)據(jù)集上表現(xiàn)很好,但我沒有說訓(xùn)練,因為訓(xùn)練和測試照片實際上是位于停車場上不同汽車的相同照片,雖然技術(shù)上沒有泄漏測試數(shù)據(jù),但在某種意義上,他們是一樣的。預(yù)先訓(xùn)練過的、開箱即用的Mask-RCNN在探測車輛方面的表現(xiàn)要好得多。
鑒于這些結(jié)論和我之前提到的局限性,為了改進模型或向前推進,下一步應(yīng)該做什么?我們可以使用整個數(shù)據(jù)集從頭開始訓(xùn)練模型,看看它的執(zhí)行情況,嘗試調(diào)優(yōu)檢測閾值。我們也可以試著去做,也許這可以成為這篇文章的第二部分。但理想情況下,更多變化的數(shù)據(jù)集是必不可少的,完整的注釋是創(chuàng)建準(zhǔn)確的停車位檢測模型的基礎(chǔ)。此外,為了建立不僅準(zhǔn)確而且健壯的檢測模型,考慮到正在行駛而尚未停車的汽車和擅自停放的汽車是非常重要的,這些可能是未來需要進一步研究的步驟。
下載1:OpenCV-Contrib擴展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。下載2:Python視覺實戰(zhàn)項目52講在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~