摘要: 一個小例子帶你玩轉Opencv+tensorflow~
你是否是常常在停車場周圍轉來轉去尋找停車位。若是你的手機能準確地告訴你最近的停車位在哪裏,那是否是很爽?事實證實,基於深度學習和OpenCV解決這個問題相對容易,只需獲取停車場的實時視頻便可。下面的GIF圖片突出顯示洛杉磯機場停車場上全部可用的停車位,並顯示可用停車位的數量,關鍵是這一過程是實時的!html
你能夠在Github repo找到我曾用過的代碼。git
構建這個停車檢測模型主要有兩個步驟:github
1.檢測全部可用的停車位;服務器
2.肯定停車位是空的仍是被佔用的;ide
由於安裝了攝像頭視圖,咱們可使用OpenCV對每一個停車位進行一次映射。一旦你知道了每一個停車位的位置,你就能夠用深度學習來預測它是否空着。我已經在個人博客上分享了所涉及的一個高層次步驟的概述。若是你對詳細代碼感興趣,請看看個人博客。工具
檢測停車位的基本思路是,全部的停車點的分隔線都是處於水平線,而一列中的停車點之間的間隔大體相等。首先使用Canny邊緣檢測來得到邊緣圖像。我還把沒有停車的地方遮了起來。以下所示:學習
而後我在邊緣圖像上作了霍夫變換,畫出了它能識別的全部線。我只選擇斜率接近於零的直線來隔離水平線。霍夫變換的輸出以下:spa
正如你所看到的那樣,霍夫變換在識別停車線方面作得至關好,可是輸出有噪聲——幾個停車線被屢次檢測到,而有些被遺漏了。那麼咱們如何解決這個問題呢?而後我用觀察和直覺開始,經過使用霍夫變換返回的座標,彙集x座標來肯定主要的停車道。利用聚類邏輯來識別車道線x座標的間隔。這樣就能識別出這裏的12個車道。以下:視頻
若是全部這些看起來都很複雜,別擔憂5——我已經在github的jupyter notebook上一步一步地記錄了代碼。如今我已經知道了全部的停車道都在哪裏,經過合理地假設全部的停車點大小都同樣來識別每一個單獨的停車位。我仔細觀察告終果,以確保儘量準確地捕捉到點之間的邊界。我終於可以標出每一個停車位。以下:htm
當完成了每一個車位的定位以後,咱們能夠爲每一個點分配一個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/
本文爲雲棲社區原創內容,未經容許不得轉載。