兩分鐘demo:自動駕駛入門之別撞人和公共汽車了
這次的兩分鐘深度學習demo要講的是卷積網路的另一個應用,通過視覺和深度神經網路實時檢測目標。它是自動駕駛汽車的基礎任務之一,畢竟除了讓車「按著線開」這樣的相對簡單的任務,也得讓車認識周圍環境這樣才不會引發交通事故。計時開始。
Demo 演示
系統要求:和 FlappyBird 的demo一樣,要求 python,MXNet,X11,有支持CUDA的nVidia GPU。這個 Demo 仍然專註使用 MXNet 作為深度學習平台運行,請按照安裝說明自行安裝編譯GPU版的MXNet並在config.mk里打開 cuDNN支持,github 傳送門 https://github.com/dmlc/mxnet
SSD單網路多目標檢測github傳送門 zhreshold/mxnet-ssd 感謝 Joshua Z. Zhang 老師細緻完備的工作,讓我們可以快速上手學習。在 git clone 之後,我們需要下載預先訓練好的模型 ssd_300_voc_0712.zip,放到 models/ 目錄里並解壓縮。然後到這裡下載我們舊金山市街頭一張街景圖當作輸入並執行:
python demo.py --images sf_street.jpgnDetection time for 1 images: 0.3850 secn
可以看到,一塊 GTX 960的運算能力可以在0.385秒內識別出圖中的公共汽車和近景的行人,並且連圖片右下角出現半個的人都可以識別並精確圈出位置。
另外一個例子也是舊金山街景,程序在很短的時間裡識別出了近處路面上的汽車,包括各種朝向和停在路邊的各種汽車(輸入圖片下載地址):
技術要點:這個demo需要重新編譯安裝一下自帶的mxnet fork repo,裡面包含作者自己實現的「mx.symbol.Scale」,否則會出現這個錯誤:
from_layer = mx.symbol.Scale(data=from_layer, mode="spatial", nAttributeError: module object has no attribute Scalen
理論知識
物體檢測是計算機視覺里基礎研究課題之一,它的任務是在一張圖裡找到想要的物體以及對應的位置。在最近的自動駕駛汽車熱潮里,它更有自己不可替代的地位,需要不斷追求更快更準確更容錯的檢測方法。基於深度神經網路的常見方法一般是 Faster RCNN(MXNet實現 github 傳送門 precedenceguo/mx-rcnn ),Yolo (You Only Look Once),SSD等等,這裡有一個總結大全,感興趣的觀眾朋友可以參考 Object Detection 。
傳統目標檢測方法一般通過掃描整個圖片(selective search)尋找可能是物體的區域並畫個大概的框,然後通過一個卷積網路判斷這個區域里是不是物體以及是哪種物體,再優化這個框的位置。在 Faster RCCN里,它通過一個卷積網路 RPN (Region Proposal Network) 快速畫這個大框。它的方法是把RPN的最後一層卷積層輸出的特徵(feature map)的點對應到原圖的一群點,用這些點周圍的區域(稱之為錨點 anchors)來訓練 RPN,對於每一個錨點區域如果它和圖片中某個物體重疊部分小於某個閾值就被認為是背景,而背景的損失函數值設定為0,以此優化和訓練 RPN 使之學習到相對精確的物體位置。
SSD: Single Shot MultiBox Detector 這個2015年提出的方法使用單個網路實現同一張圖裡多個行人、汽車等目標的識別,它對比其他方法的優勢在於實時和快速,這個demo的實驗可以達到每秒95張圖(單張Titan X)的速度。它同時也解決了 Faster RCNN從最後一層卷積層回推導致原圖裡太小的物體不能識別的問題,它允許每一卷積層德特徵點都可以回推到原圖尋找錨點,從而可以識別出來相對更小的目標。
隨著物體檢測不斷發展,現有演算法的弱點比如說檢測過小的目標,各種光照條件下的物體檢測等問題都會不斷的克服,未來會有越來越多的有效檢測方法。
思考題
- 為什麼自動駕駛汽車需要快速準確的物體檢測方法?
- RPN的方法對傳統方法有什麼優勢?這些優勢是怎麼在深度網路里體現的?
- 在 Joshua Z. Zhang 老師的代碼里,定義了哪幾種可以識別和檢測的物體?參考答案看 demo.py 的開頭部分。
- 這一套代碼速度很快,可以用到視頻的實時識別上,你有興趣寫一個視頻識別版么?在評論里留下 github 鏈接,我會替你點贊的。(2016.12.20更新,@想飛的石頭已經寫好了他的視頻識別,github傳送門 burness/mxnet-101 視頻demo https://www.youtube.com/watch?v=u1w8Re-tU0g&feature=youtu.be 大家都來學習一下,點個贊!)
加分題
這個demo使用了默認參數,觀眾朋友們可能發現有些近景的單人被標記了多次,遠景的部分汽車沒有很好的識別到。它可以通過調整哪些參數進一步優化,這個任務就當作加分題留給觀眾朋友們在代碼里摸索。
兩分鐘閱讀時間結束。這是後記。物體目標檢測是一個比較難但是比較貼近實際生活的話題,它讓觀眾朋友們接觸一下自動駕駛汽車裡面需要的深度學習技術。我也想通過介紹冰山一角體驗一下技術難度,畢竟我們不能像某些培訓班那樣開個收費培訓教跑個「按著線開」的demo然後就告訴你自動駕駛就這麼簡單你明天就可以自己做個車上路啦,這樣多危險啊。在國內外很多公司在探索研究和製作各種自動駕駛汽車,國內做的比較好的比如說圖森互聯基於視覺的自動駕駛,他們主要成員也是MXNet的重要貢獻者。如果有興趣接受自動駕駛的科研挑戰,不妨考慮和這些優秀的研究組學習合作,參加一線科研工作,共同推進自動駕駛汽車的發展。
當然了,搞深度學習還是要用最好用的平台 MXNet。
推薦閱讀:
※如何看待 Google 母公司拆分成立的無人駕駛公司 Waymo?
※被 Google 指控盜取商業機密,Uber 的日子更難過了
※幾個感知感測器的小總結
※如何看待最近谷歌放棄研發自動駕駛輔助系統?
※雅虎 440 萬美元投資軟銀旗下 SB Drive,公共交通或成為自動駕駛落地的先行者
TAG:深度学习DeepLearning | 机器学习 | 自动驾驶 |