基于OpencvTensorflow实现实时查找停车位置
介紹
你是不是經常在停車場周圍轉來轉去尋找停車位。如果你的手機能準確地告訴你最近的停車位在哪里,那是不是很爽?事實證明,基于深度學習和OpenCV解決這個問題相對容易,只需獲取停車場的實時視頻即可。下面的GIF圖片突出顯示洛杉磯機場停車場上所有可用的停車位,并顯示可用停車位的數量,關鍵是這一過程是實時的!
你可以在Github repo找到我曾用過的代碼。
步驟概述
構建這個停車檢測模型主要有兩個步驟:
1.檢測所有可用的停車位;
2.確定停車位是空的還是被占用的;
因為安裝了攝像頭視圖,我們可以使用OpenCV對每個停車位進行一次映射。一旦你知道了每個停車位的位置,你就可以用深度學習來預測它是否空著。我已經在我的博客上分享了所涉及的一個高層次步驟的概述。如果你對詳細代碼感興趣,請看看我的博客。
檢測所有可用停車位的位置
檢測停車位的基本思路是,所有的停車點的分隔線都是處于水平線,而一列中的停車點之間的間隔大致相等。首先使用Canny邊緣檢測來獲得邊緣圖像。我還把沒有停車的地方遮了起來。如下所示:
然后我在邊緣圖像上做了霍夫變換,畫出了它能識別的所有線。我只選擇斜率接近于零的直線來隔離水平線。霍夫變換的輸出如下:
正如你所看到的那樣,霍夫變換在識別停車線方面做得相當好,但是輸出有噪聲——幾個停車線被多次檢測到,而有些被遺漏了。那么我們如何解決這個問題呢?然后我用觀察和直覺開始,通過使用霍夫變換返回的坐標,聚集x坐標來確定主要的停車道。利用聚類邏輯來識別車道線x坐標的間隔。這樣就能識別出這里的12個車道。如下:
如果所有這些看起來都很復雜,別擔心5——我已經在github的jupyter notebook上一步一步地記錄了代碼。現在我已經知道了所有的停車道都在哪里,通過合理地假設所有的停車點大小都一樣來識別每個單獨的停車位。我仔細觀察了結果,以確保盡可能準確地捕捉到點之間的邊界。我終于能夠標出每個停車位。如下:
當完成了每個車位的定位之后,我們可以為每個點分配一個ID,并將其坐標保存在字典中并將它pickled了一下,以便以后能取回。這是可以實現的,因為安裝了攝像頭,我們不需要一次又一次地計算每個點在視圖中的位置。更多詳情請登錄我的博客。
識別該車位是否有標記
現在我們有了每個停車位的映射,可以通過以下幾種方式來確定這個停車位是否被占用:
1.使用OpenCV檢查視頻圖像中停車位的像素顏色是否與空停車位的顏色一致。這是一種簡單的方法,但容易出錯。例如,燈光的變化將會改變一個空停車位的顏色,在一天的光照變化中,這種方法將無法正確工作。如果有可能的話,這種邏輯會把灰色的汽車當成空停車位;
2.使用目標檢測來識別所有的汽車,然后檢查汽車的位置是否與停車位重疊。我做了嘗試,發現實時檢測模型真的很難檢測小尺寸的對象,檢測到的車輛不超過30%;
3.使用CNN檢測每個停車位,并預測是否有人停車,這種方法最終效果最好。
要構建一個CNN,我們需要停車位有車以及無車這兩種情況的圖像。我提取了每個停車位的圖像,并將其保存在文件夾中,然后將這些圖像分組。我還在Github上分享了這個訓練文件夾。
因為在1280x720像素的圖像中有近550個車位,所以每個車位的大小只有15x60像素左右。下面是空車位和被占用車位的圖像:
然而,由于被占用車位和空車位看起來有很大的不同,這對CNN來說應該不是一個具有挑戰性的問題。
然而,我只有大約550張關于這兩個類的圖片,所以決定利用VGG的前10層,并在VGG模型的輸出添加一個單一的softmax圖層來進行遷移學習。你可以在這里找到這個遷移學習模型的代碼,準確率達到94%。見下文:
現在,我將停車位檢測和CNN預測器結合起來,構建了一個停車位檢測器,準確率非常高。
我還在notebook記錄了在視頻流上運行這個的代碼。
結論
對于聯合不同的工具和使用深度學習來構建實際應用程序這么容易我感到很驚奇,我在兩個下午完成了這項工作。
準備進一步探索的其他幾個想法:
1.如果可以將車位檢測邏輯擴展到任何可能使用深度學習的車位地圖上,那就太好了,OpenCV對每個用例進行調優有限制;
2.CNN使用的VGG模型是一個重量化模型,想要嘗試更輕量化的模型。
云服務器99元拼團購!拉新還可贏現金紅包!300萬等你瓜分!
馬上一鍵開團贏紅包: http://click.aliyun.com/m/1000019899/
本文作者:【方向】
閱讀原文
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的基于OpencvTensorflow实现实时查找停车位置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10月29日云栖精选夜读 | 十条精进原
- 下一篇: KVM 虚拟机迁移