編譯orb-slam2_with_semantic_label[純記錄一下]

目錄

一 編譯thirdparty的DBoW和g2o

二 編譯thirdparty/darknet

三 運行orb-slam2

PS:編譯darknet


Github:qixuxiang/orb-slam2_with_semantic_label

結合orb-slam2和yoloV3的作品.要求以及本人是:

  • Ubuntu 14.04/Ubuntu 16.04
  • ORBSLAM2
  • CUDA >=6.5 CUDA9.0 CUDNN7.1
  • C++11(must)
  • gcc5(must)
  • cmake

一 編譯thirdparty的DBoW和g2o

之前安裝過orb-slam2 所以編譯項輕鬆通過,直接build裏cmake.. make

二 編譯thirdparty/darknet

最開始直接用作者編譯好的 報錯:

libcurand.so.8.0: cannot open shared object file: No such file or directory 
libYOLOv3SE.so not found. or can't load dependency dlls

我安裝的是cuda9.0 算了還是重新編譯吧.

在thirdparty/darknet文件夾

sudo chmod +x build_linux.sh #給權限
./build_linux.sh  #.sh裏面的內容就是編譯 很方便!作者很nice!

三 運行orb-slam2

剛開始直接顯示段錯誤,連繫統最開始運行的那段"商標"都prinf不出來,後來我重新編譯了一個pcl的依賴項,似乎是把vtk從高版本換成低版本了(vtk6.0-->vtk5.0)

還嘗試了輸出系統的stack size 我把我本來的stack size從8192改成了102800之類的大數,也不行.

ulimit -a
ulimit -s 102800

還有一些關於pcl調試的內容,寫在這裏了 ubuntu16.04重新安裝PCL[純記錄,無內容] 看了一下真的沒有內容 純粹記下來給自己看

嘗試了strace調試,差點沒把我煩死,主要是程序太大,調用的東西太多,會把這個終端都給刷完,根本看不到有效的信息.gdb編譯沒嘗試.

strace ./rgbd-tum

ps -ef |grep rgbd_tum
查看當前exe的ID號 然後我幹嘛的我就忘了

這之後我把darknet編譯了之後,程序在運行了一會兒後突然出現段錯誤,而且我在code中設置了無數prinf語句,每次編譯都會在不同的語句中崩潰退出(同一次編譯後的運行會在相同的語句退出,但是每次編譯又會有所區別).除此之外,code中又是基本能確定正確的語句.這說明:不是代碼本身,而是哪裏調用的鏈接有問題

sudo dmesg|grep segfault

出來的結果yolov3SE.so有問題,我就去編譯了原版本的darknet,在編譯過程中發現原來我orb-slam2-semantic-label程序當中的bin/coco.names和yolov3.cfg下載錯了,我直接下載了github的那個網頁鏈接而不是文件本身,所以系統纔出了問題.改了之後程序就可以跑了

這之後再修改一下yolov3.cfg 適應一下我不太好的gpu 就好了

rgbd_tum: /home/zbq/append/projects/orb-slam2_with_semantic_label-master/Thirdparty/
darknet/src/cuda.c:36: check_error: Assertion `0' failed.

PS:編譯darknet

YOLO: Real-Time Object Detection yolo本身真是太好編譯了 darknet這個框架真是最方便的框架 輕鬆安裝並且調試了

只不過運行./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg遇到了CUDA Error: out of memory報錯,以下是幾個暫時有效的方法:

  1. 把yolov3.cfg裏的subvision增大,最開始是batch=64 subvision=2 改成batch=64 subvision=64 這個subvision代表了一次性操作多少個batch,改成一次只扔一個操作似乎對機器要友好一點 這個的效果是,我本來是在第十幾次conv時error 現在變成五十幾層conv時error
  2. nvidia-smi查看當前進程, /usr/lib/xorg/Xorg 和 compiz  都是必須的,一般還有別的線程 前面有PID 號 把那個線程殺死
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      1101      G   /usr/lib/xorg/Xorg                           325MiB |
    |    0      1899      G   compiz                                        66MiB |
    |    0      2464      G   ...-token=CE9B2F31BA7B8B457108FB3574EA78EB    72MiB |
    
    kill -9 2464

    實際上,沒啥用.該不行的還是不行 可能是我這個線程本來就沒佔什麼顯存的原因吧

  3. 將yolov3.cfg裏的width=608 height=608改成width=416 height=416.有人說沒影響 但是,唉,我也不知道.總之這個改完後darknet也運行成功了,orb-slam2-semantic-label也運行成功了(但是點雲圖似乎有點不太對勁,所以先這樣)

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