Apollo感知模塊:(基於單目的攝像頭物體檢測)

apollo用的是yolo3d,這個模型在apollo的/apollo/modules/perception/model/yolo_camera_detector/yolo3d_1128這個文件夾下是找不到的,這個文件掛載在docker環境中,我們可以找到這個文件將其複製出來,以下命令可以幫助你解決這個問題:

docker ps
docker inspect apollo_dev
docker volume ls -qf dangling=true
docker volume inspect file
docker exec -it containerid /bin/sh

找到文件所在目錄,裏面存放了caffe的模型文件和權重文件,可以通過caffe可視化環境將其graph顯示出來看一下yolo3d的網絡結構。

apollo的yolo3d模型其實是基於yolov2的基本框架來的,這個網上有相關開源代碼及論文,yolo3d物體檢測輸出爲2D框(以像素爲單位),3D真實物體尺寸(以米爲單位),障礙物類別和障礙物相對偏轉角(Alpha Angle,和KITTI數據集定義一致)。當然其中還加入了車道線檢測Decoder的設計,有着和FPN(特徵金字塔)類似的鏈接,其實yolov3也是基於特徵金字塔模型搭建。關於預測物體真實大小及Alpha Angle可以通過如下命令下載相關代碼,相關論文爲《3D Bounding Box Estimation Using Deep Learning and Geometry》,可以參考相關loss的設計,yolo3d是yolov2 + 3DBOX + Decoder的組合設計,是一個multitask。

git clone https://github.com/smallcorgi/3D-Deepbox.git

那麼我們知道2DBox,預測出物體的真實大小以及Alpha Angle,其實就可以用來單目測距了,任一物體,已知它的長寬高、朝向和距離,則它在圖像上的具體形狀大小等可唯一確定,反之亦然,具體參考論文《Single View Metrology》。

我們已知圖像的2DBox、物體真實尺寸以及朝向,那麼我們就可以還原圖像中的3DBox了,以及測距,在opollo代碼中這一部分是在/apollo/modules/perception/obstacle/camera/converter,想要對這部分代碼進行測試,我用的IDE是KDEVELOP,單獨將相關代碼摘出,自己補全cmakelist文件,apollo使用的是bzael編譯的,這個目前不熟,所以要靠自己寫cmakelist文件,添加相關編譯文件及庫鏈接,測試數據直接用KITTI數據集上的就可以,由一個重要的前提就是相機標定文件一定要替換成KITTI數據的標定文件,具體位置在/apollo/modules/perception/data/params,將裏面的相關文件進行替換即可。

當然這只是完成功能測試,由於apollo改寫的底層caffe框架沒有開源,只能藉助tensorflow或者其他框架來處理這個模型,其實這部分代碼也有相關python的代碼,tensorflow是基於圖的概念,我們利用python將整個網絡的graph保存出來,然後利用tensorflow的c++模塊進行讀圖就可以了,還有一點,apollo用了好多google的庫,比如protobuf,apollo用到的是3.3.0版本,tensorflow高版本用的是3.6.0版本,很有可能這兩者結合的時候版本衝突,所以要將apollo的protobuf版本提升值3.6.0,相關的根據proto文件生成的c++代碼要進行相應替換。那麼你就可以看到攝像頭是如何做到由2D到3D的轉換了。復現效果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章