実行前にORB-SLAM3が正常に動作することを確認してください。CPU版のlibtorchを使用するため、YOLOv5の深層学習環境も設定済みである必要があります。
具体的な設定手順については、以下のチュートリアルを参照してください:
【ORB-SLAM3】Ubuntu20.04でのビルドと実行 ubuntu20.04でのYOLOV5設定(仮想マシン以外) YOLO_ORB_SLAM3のビルドと実行
目次
一、依存ライブラリのインストール 1.1 Eigen 3のインストール 1.2 Pangolinのインストール 1.3 OpenCVとopencv_contribのインストール 1.4 libtorchのインストール
二、ビルドと実行
三、libtorchによる加速
- GPUドライバ
- CUDA 11.4
- cuDNN 8.6.0
- libtorch 1.12.0
- PyTorch 1.12.0
四、TensorRTによる加速
- インストールパッケージのダウンロード
- インストール
- インストールの検証
五、密集点群マップとオクトツリーマップ
六、ROSでの実行 cv_bridgeのインストール ビルドエラーの対処
一、依存ライブラリのインストール
1.1 Eigen 3のインストール
以下のリンクからEigen3.3.7をダウンロードします:
Eigen 3.3.7 · libeigen / eigen · GitLab
次に以下のコマンドを順番に実行してインストールします:
cd eigen-git-mirror
mkdir build && cd build
cmake ..
sudo make install
1.2 Pangolinのインストール
まず、ターミナルで以下のコマンドを実行して必要な依存関係をインストールします:
sudo apt-get install libxkbcommon-dev
sudo apt-get install wayland-protocols
sudo apt install libglew-dev
sudo apt-get install libepoxy-dev
ホームディレクトリでターミナルを開き、以下のコマンドを実行してPangolinのソースコードをダウンロードします:
git clone https://github.com/stevenlovegrove/Pangolin
次に以下のコマンドを順番に実行してインストールします:
mkdir build && cd build
cmake ..
make
sudo make install
1.3 OpenCVとopencv_contribのインストール
ターミナルで以下のコマンドを実行し、必要な依存関係をインストールします:
sudo apt install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt install pkg-config
以下のリンクから公式サイトでソースコードをダウンロードします。opencv-4.2.0のダウンロードを推奨します。他のバージョンをダウンロードすると競合が発生する可能性があります。
例:ROS noeticに同梱されているopencv4.2、他のバージョンをインストールすると競合が表示されることがあります。
Releases · opencv/opencv · GitHub
以下のリンクからopencvバージョンと一致するopencv_contribをダウンロードします:
https://github.com/opencv/opencv_contrib/releases/tag/4.2.0
ダウンロードしたopencv_contribを解凍し、opencv-4.2.0フォルダ内に配置します。
opencv-4.2.0フォルダ内のCMakeLists.txtを変更します:
559行目に以下を追加します:
include_directories("modules")
opencv-4.2.0ディレクトリでターミナルを開き、以下のコマンドを実行します:
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 -D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/opencv-4.2.0/opencv_contrib-4.2.0/modules/ ../
sudo make -j4
sudo make install
opencvでCUDA加速を使用する場合、cmake時に以下のコマンドを使用します:
cmake -D CUDA_nppicom_LIBRARY=stdc++ -D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/ubuntu/opencv-4.2.0/opencv_contrib-4.2.0/modules/ -D BUILD_EXAMPLES=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON WITH_TBB=ON WITH_V4L=ON WITH_QT=ON -D WITH_FFMPEG=ON -D WITH_LIBV4L=ON OPENCV_GENERATE_PKGCONFIG=YES BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D OPENCV_DNN_CUDA=ON -D CUDA_ARCH_BIN=8.6 -D WITH_CUDNN=ON -D CUDNN_INCLUDE_DIR=/usr/local/cuda/include/ -D WITH_ZLIB=ON -D BUILD_PNG=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D BUILD_TIFF=ON -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON3_EXECUTABLE=$(which python) -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..
OPENCV_EXTRA_MODULES_PATHはopencv_contribモジュールのパスを実際の状況に応じて変更してください
CUDA_ARCH_BINはGPUの計算能力で、実際のGPUモデルに応じて変更してください
CUDNN_INCLUDE_DIRはcuDNNのヘッダーファイルで、通常/usr/local/cuda/include/ディレクトリにインストールされます。実際のパスに応じて変更してください
ターミナルで以下のコマンドを実行します:
sudo gedit /etc/profile.d/pkgconfig.sh
開いたファイルに以下のコードを追加して、pkg-config環境を設定します:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
保存して終了します。ターミナルで以下のコマンドを実行して更新します:
source /etc/profile
ターミナルで以下のコマンドを実行して成功を確認します:
pkg-config --libs opencv4
以下の内容が表示されれば成功です:
ターミナルで以下のコマンドを実行します:
sudo gedit /etc/ld.so.conf.d/opencv4.conf
開いたファイルに以下のコードを追加して、動的ライブラリ環境を設定します:
/usr/local/lib
保存して終了します。最後に以下のコマンドを実行して、設定したパスを有効にします。
sudo ldconfig
opencv-4.2.0/samples/cpp/example_cmakeディレクトリで、ターミナルで以下のコマンドを順番に実行します:
cmake .
make
./opencv_example
以下の画面が表示されれば、インストール成功です。
ターミナルで以下のコマンドを実行します:
sudo gedit /etc/ld.so.conf.d/opencv.conf
開いたドキュメントに以下の内容を追加します:
/usr/local/lib
ターミナルで以下のコマンドを実行します:
sudo ldconfig
リンクに失敗した場合、以下のコマンドを入力します。実際のパスに応じて変更する必要があります:
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_adv_train.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn_ops_train.so.8
sudo ln -sf /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn.so.8.9.7 /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn.so.8
ターミナルで以下のコマンドを実行します:
sudo gedit /etc/bash.bashrc
ファイルの末尾に追加します:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存後終了します。
ターミナルで以下のコマンドを実行して、環境を更新します:
source /etc/bash.bashrc
/home/ubuntu/opencv-4.2.0/opencv_contrib-4.2.0/modules/xfeatures2d/include/opencv2でターミナルを開き、xfeatures2d.hppファイルとxfeatures2dフォルダを/usr/local/include/opencv4/opencv2/下にコピーします。
ターミナルで以下のコマンドを実行します:
sudo cp xfeatures2d.hpp /usr/local/include/opencv4/opencv2/
sudo cp -r xfeatures2d /usr/local/include/opencv4/opencv2/
1.4 libtorchのインストール
YOLO_ORB_SLAM3フォルダでターミナルを開き、以下のコマンドを実行してlibtorchパッケージをダウンロードします。注意:現在ダウンロードするのはCPU版です。
wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.11.0%2Bcpu.zip
ダウンロードしたlibtorchパッケージをYOLO_ORB_SLAM3/Thirdpartyフォルダに解凍し、libtorchに名前を変更します。
ファイル構造は以下のようになります:
二、ビルドと実行
主にORB-SLAM3のソースコードをベースに修正しているため、ORB-SLAM3のソースコードをダウンロードする必要があります。以下のコマンドを実行して取得します:
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
修正したsrcとincludeファイルをORB-SLAM3のものと置き換え、YOG_SLAMと名前を付けます。
CMakeLists.txtを以下のように修正します:
cmake_minimum_required(VERSION 3.2)
project(ORB_SLAM3)
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release)
ENDIF()
MESSAGE("Build type: " ${CMAKE_BUILD_TYPE})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -march=native")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native")
# Check C++11 or C++0x support
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if (COMPILER_SUPPORTS_CXX14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
add_definitions(-DCOMPILEDWITHC14)
message(STATUS "Using flag -std=c++14.")
elseif(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_definitions(-DCOMPILEDWITHC11)
message(STATUS "Using flag -std=c++11.")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
add_definitions(-DCOMPILEDWITHC0X)
message(STATUS "Using flag -std=c++0x.")
else()
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif()
add_definitions(-w)
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
set(CMAKE_PREFIX_PATH ${PROJECT_SOURCE_DIR}/Thirdparty/libtorch)
find_package(OpenCV 4.2)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 4.4 not found.")
endif()
MESSAGE("OPENCV VERSION:")
MESSAGE(${OpenCV_VERSION})
# opencv contribモジュールのパスを追加
list(APPEND CMAKE_MODULE_PATH "/home/ubuntu/opencv-4.2.0/opencv_contrib-4.2.0/modules")
find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
find_package(realsense2)
find_package(Torch REQUIRED)
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
${PROJECT_SOURCE_DIR}/Thirdparty/Sophus
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
${TORCH_INCLUDE_DIRS}
)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
add_library(${PROJECT_NAME} SHARED
src/System.cc
src/Tracking.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/ORBextractor.cc
src/ORBmatcher.cc
src/FrameDrawer.cc
src/Converter.cc
src/MapPoint.cc
src/KeyFrame.cc
src/Atlas.cc
src/Map.cc
src/MapDrawer.cc
src/Optimizer.cc
src/Frame.cc
src/KeyFrameDatabase.cc
src/Sim3Solver.cc
src/Viewer.cc
src/ImuTypes.cc
src/G2oTypes.cc
src/CameraModels/Pinhole.cpp
src/CameraModels/KannalaBrandt8.cpp
src/OptimizableTypes.cpp
src/MLPnPsolver.cpp
src/GeometricTools.cc
src/TwoViewReconstruction.cc
src/Config.cc
src/Settings.cc
src/YoloDetect.cpp
include/System.h
include/Tracking.h
include/LocalMapping.h
include/LoopClosing.h
include/ORBextractor.h
include/ORBmatcher.h
include/FrameDrawer.h
include/Converter.h
include/MapPoint.h
include/KeyFrame.h
include/Atlas.h
include/Map.h
include/MapDrawer.h
include/Optimizer.h
include/Frame.h
include/KeyFrameDatabase.h
include/Sim3Solver.h
include/Viewer.h
include/ImuTypes.h
include/G2oTypes.h
include/CameraModels/GeometricCamera.h
include/CameraModels/Pinhole.h
include/CameraModels/KannalaBrandt8.h
include/OptimizableTypes.h
include/MLPnPsolver.h
include/GeometricTools.h
include/TwoViewReconstruction.h
include/SerializationUtils.h
include/Config.h
include/Settings.h
include/YoloDetect.h)
add_subdirectory(Thirdparty/g2o)
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
${TORCH_LIBRARIES}
-lboost_serialization
-lcrypto
)
# contribモジュールのリンクを確保
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} /home/ubuntu/opencv-4.2.0/build/lib/libopencv_xfeatures2d.so)
# RealSense SDKが見つかった場合、ライブラリが追加され、その例がコンパイルされます
if(realsense2_FOUND)
include_directories(${PROJECT_NAME}
${realsense_INCLUDE_DIR}
)
target_link_libraries(${PROJECT_NAME}
${realsense2_LIBRARY}
)
endif()
# 例のビルド
# RGB-Dの例
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/Examples/RGB-D)
add_executable(rgbd_tum
Examples/RGB-D/rgbd_tum.cc)
target_link_libraries(rgbd_tum ${PROJECT_NAME})
if(realsense2_FOUND)
add_executable(rgbd_realsense_D435i
Examples/RGB-D/rgbd_realsense_D435i.cc)
target_link_libraries(rgbd_realsense_D435i ${PROJECT_NAME})
endif()
YOG_SLAM/Examples/RGB-Dにあるrgbd_realsense_D435i.ccとrgbd_tum.ccで、
monotonic_clockをすべてsteady_clockに置換します。
YOG_SLAMフォルダのbuild.shファイルの内容を以下に置き換えます:
echo "Thirdparty/DBoW2の設定とビルド ..."
cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
cd ../../g2o
echo "Thirdparty/g2oの設定とビルド ..."
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
cd ../../Sophus
echo "Thirdparty/Sophusの設定とビルド ..."
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
cd ../../../
echo "語彙の展開 ..."
cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..
echo "YOLO_ORB_SLAM3の設定とビルド ..."
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make rgbd_tum -j4
YOG_SLAMフォルダに新しいcoco.namesファイルを作成し、内容はCOCOデータセットに含まれる物体の種類です。
person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
YOLOv5で訓練した.ptファイルは、export.pyファイルを通じてtorchscript形式でエクスポートする必要があり、CPUモードでのエクスポートを選択します。
エクスポートパラメータは以下の通りです:
生成された.torchscriptファイルもYOG_SLAMフォルダに配置します。独自のモデルをエクスポートする際は、寸法HW 384640に注意してください。
ターミナルで以下のコードを実行してコンパイルします:
chmod +x build.sh
./build.sh
コンパイル時に以下のエラーが表示された場合:error: 'struct cudaPointerAttributes' has no member named 'memoryType'
/usr/local/include/pangolin/imageのmemcpy.hファイルで、
#ifdef HAVE_CUDAを#ifdef HAVE_CUDA_PANGOLINに変更します
/usr/local/include/pangolin/imageでターミナルを開き、以下のコマンドを実行して変更します:
sudo gedit memcpy.h
変更して保存します。
再度コンパイルします。(pangolinを再コンパイルしないでください。そうしないと修正が元に戻ります)
または:
memoryTypeをtypeに変更します
以下のリンクからRGBD-TUMデータセットをダウンロードします。
Computer Vision Group - Dataset Download
ここではfr3/walking_xyzをダウンロードします。
YOG_SLAMフォルダに新しいdatasetフォルダを作成し、ダウンロードしたデータセットをdatasetフォルダに解凍します。
YOG_SLAM/dataset/rgbd_dataset_freiburg3_walking_xyzフォルダでターミナルを開き、以下のコマンドを実行して新しいassociate.pyファイルを作成します。
touch associate.py
新しいassociate.pyを開き、以下のコードを貼り付けます。
import argparse
import sys
import os
import numpy
def load_timestamps(file_path):
"""
テキストファイルからタイムスタンプを読み込みます。
ファイル形式:
ファイル形式は"stamp d1 d2 d3 ..."で、stampはタイムスタンプ(一致させる必要あり)、
"d1 d2 d3.."はこのタイムスタンプに関連付けられた任意のデータ(例:3D位置と3D向き)です。
入力:
filename -- ファイル名
出力:
dict -- (stamp,data)タプルの辞書
"""
file = open(filename)
data = file.read()
lines = data.replace(","," ").replace("\t"," ").split("\n")
list = [[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"]
list = [(float(l[0]),l[1:]) for l in list if len(l)>1]
return dict(list)
def correlate_timestamps(first_dict, second_dict,offset,max_difference):
"""
2つの辞書のタイムスタンプを関連付けます。タイムスタンプが完全に一致することはないため、
各入力タプルの最も近い一致を見つけることを目指します。
入力:
first_dict -- 最初の辞書の (stamp,data) タプル
second_dict -- 2番目の辞書の (stamp,data) タプル
offset -- 両方の辞書間の時間オフセット(例:センサー間の遅延をモデル化するため)
max_difference -- 候補生成の検索半径
出力:
matches -- 一致したタプルのリスト ((stamp1,data1),(stamp2,data2))
"""
first_keys = list(first_dict.keys())
second_keys = list(second_dict.keys())
potential_matches = [(abs(a - (b + offset)), a, b)
for a in first_keys
for b in second_keys
if abs(a - (b + offset)) < max_difference]
potential_matches.sort()
matches = []
for diff, a, b in potential_matches:
if a in first_keys and b in second_keys:
first_keys.remove(a)
second_keys.remove(b)
matches.append((a, b))
matches.sort()
return matches
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='''
このスクリプトは2つのタイムスタンプ付きデータファイルを受け取り、それらを関連付けます
''')
parser.add_argument('first_file', help='最初のテキストファイル(形式:タイムスタンプ データ)')
parser.add_argument('second_file', help='2番目のテキストファイル(形式:タイムスタンプ データ)')
parser.add_argument('--first_only', help='最初のファイルから関連付けられた行のみを出力', action='store_true')
parser.add_argument('--offset', help='2番目のファイルのタイムスタンプに追加される時間オフセット(デフォルト:0.0)',default=0.0)
parser.add_argument('--max_difference', help='一致させるエントリの最大許容時間差(デフォルト:0.02)',default=0.02)
args = parser.parse_args()
first_dict = load_timestamps(args.first_file)
second_dict = load_timestamps(args.second_file)
matches = correlate_timestamps(first_dict, second_dict,float(args.offset),float(args.max_difference))
if args.first_only:
for a,b in matches:
print("%f %s"%(a," ".join(first_dict[a])))
else:
for a,b in matches:
print("%f %s %f %s"%(a," ".join(first_dict[a]),b-float(args.offset)," ".join(second_dict[b])))
YOG_SLAM/dataset/rgbd_dataset_freiburg3_walking_xyzフォルダでターミナルを開き、以下のコマンドを実行すると、datasetフォルダにassociations.txtファイルが自動的に生成されます。
python3 associate.py rgb.txt depth.txt > associations.txt
注意:rgb.txtとdepth.txtの順序を逆にしないでください。そうしないと、実行時にグレースケール画像になり、生成されるCameraTrajectory.txtとKeyFrameTrajectory.txtファイルが1行のデータしか持たない問題が発生する可能性があります
YOG_SLAMフォルダでターミナルを開き、以下のコマンドを実行して正常に実行できます:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml ./dataset/(データセットディレクトリ)/ ./dataset/(データセットディレクトリ)/associations.txt
ここでは:
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt ./Examples/RGB-D/TUM3.yaml ./dataset/rgbd_dataset_freiburg3_walking_xyz/ ./dataset/rgbd_dataset_freiburg3_walking_xyz/associations.txt
注意:TUM3.yamlはカメラ内部パラメータファイルで、データセットがどのカメラ内部パラメータを使用しているかに注意してください。fr3/walking_xyzの「fr3」はTUM3.yamlを使用することを示します。
以下の画面が表示されれば、実行成功です:
三、libtorchによる加速
コンピュータのGPU設定が異なるため、ここで一部の設定バージョンを修正する必要があります。
注意:GPUドライババージョンとcuda、cudnn、libtorch、pytorchバージョンは一つ一つ対応させて統一する必要があります。一致しない場合、様々なエラーが発生します。
1. GPUドライバ
GPUドライバは、ここではnvidia-driver-470を選択します。できるだけ低いバージョンを選択してください。高バージョンは対応するcuda、cudnnバージョンも高く、後で互換性の問題が発生します。
ターミナルで以下のコマンドを実行して、インストールしたGPUドライバを確認します:
nvidia-smi
表示されない場合は、再起動後にもう一度確認してください。
2. CUDA 11.4
ここでは以前CUDA 12.2をインストールしていたため、CUDA 12.2をアンインストールしてからCUDA 11.4をインストールする必要があります。
ターミナルを開き、以下のコマンドを実行してCUDA関連のパッケージをアンインストールします:
sudo apt-get remove --purge nvidia-cuda-toolkit
sudo apt-get autoremove
sudo apt-get autoclean
ターミナルで以下のコマンドを実行して、CUDAインストールディレクトリを削除します:
sudo rm -rf /usr/local/cuda-12.2
ターミナルで以下のコマンドを実行して環境変数を開きます:
gedit ~/.bashrc
以前追加したCUDA関連の環境変数を削除またはコメントアウトします。
ターミナルで以下のコマンドを実行して、環境を更新します:
source ~/.bashrc
ターミナルで以下のコマンドを実行して、システムがCUDAを正常にアンインストールしたことを確認します。
nvcc --version
出力が表示されないかエラーメッセージが表示される場合、CUDAは正常にアンインストールされています。
以下のリンクから、対応するCUDAバージョンをダウンロードします。ここでは11.4をダウンロードします
https://developer.nvidia.com/cuda-toolkit-archive
ターミナルで以下のコマンドを実行して、システムアーキテクチャを確認します。ここではX86アーキテクチャです:
uname -a
以下のリンクから、対応するCUDAバージョンをダウンロードします。ここでは11.4をダウンロードします:
wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda_11.4.0_470.42.01_linux.run
ファイルがダウンロードされた場所で、ターミナルを開き、以下のコマンドを実行してインストールします:
sudo sh cuda_11.4.0_470.42.01_linux.run
表示されるインターフェースでContinueを選択し、Enterキーを押して確定します。
acceptと入力し、Enterキーを押して確定します。
Enterキーまたはスペースキーでインストールする項目を選択します。ドライバはすでにインストールされているため、必ず選択を解除してください。そうしないと競合が発生し、画面が暗くなり続け、グラフィックインターフェースに入れなくなる可能性があります。Installを選択してインストールします。
インストールが成功すると、以下のインターフェースが表示されます:
ターミナルで以下のコマンドを実行して、環境変数を追加します:
gedit ~/.bashrc
開いたファイルの末尾に以下のコードを追加します:
注意:パスは実際の状況に応じて変更してください。
export PATH=/usr/local/cuda-11.4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH
保存して終了し、環境を更新します。
source ~/.bashrc
環境変数の設定が完了したら、ターミナルで以下のコマンドを入力します:
nvcc --version
以下の画面が表示されれば、インストール成功です:
3. cuDNN 8.6.0
以下のリンクを開きます:
https://developer.nvidia.com/rdp/cudnn-archive
CUDA 11.4に基づいて対応するcuDNNバージョンを選択します。ここでは8.6.0を選択します。
Local Installer for Linux x86_64を直接ダウンロードします。
以前他のバージョンをインストールした場合、以下のコマンドを実行して、以前インストールしたcudnnバージョンをアンインストールします:
# cuDNNヘッダーファイルを削除
sudo rm -f /usr/local/cuda/include/cudnn.h
sudo rm -f /usr/local/cuda/include/cudnn_version.h
# cuDNNライブラリファイルを削除
sudo rm -f /usr/local/cuda/lib64/libcudnn*
# ライブラリキャッシュを更新
sudo ldconfig
ダウンロードした圧縮ファイルをホームディレクトリに解凍し、ファイルをcudnnに名前を変更し、cudnnディレクトリでターミナルを開き、以下のコマンドを実行します:
sudo cp include/cudnn*.h /usr/local/cuda/include/
sudo cp lib/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
sudo ldconfig
ターミナルで以下のコマンドを実行します:
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
以下の画面が表示されれば、インストール成功です:
4. libtorch 1.12.0
ターミナルで以下のコマンドを実行して、一致するlibtorchをダウンロードします。ここではlibtorch 1.12.0です。
wget https://download.pytorch.org/libtorch/cu113/libtorch-cxx11-abi-shared-with-deps-1.12.0%2Bcu113.zip
ダウンロードしたlibtorchパッケージをThirdpartyフォルダに解凍し、libtorchに名前を変更します。
ファイル構造は以下のようになります:
対応するlibtorchパッケージがない場合、一致するpytorchパッケージを利用して、Thirdpartyフォルダに配置し、libtorchに名前を変更できます。
5. PyTorch 1.12.0
ターミナルで以下のコマンドを実行して、作成した仮想環境を開きます(yoloは作成した仮想環境名で、カスタム名です):
conda activate yolo
yolo仮想環境で、ターミナルで以下のコマンドを実行して、現在のPyTorchをアンインストールします。
pip uninstall torch torchvision torchaudio
yolo仮想環境で、ターミナルで以下のコマンドを実行します。CUDA 11.4バージョンのPyTorch1.12はまだないため、CUDA 11.3バージョンのPyTorchは通常CUDA 11.4と互換性があります。したがって、CUDA 11.4と互換性のあるCUDA 11.3版のPyTorch 1.12.0をインストールします。
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113
yolo仮想環境で、ターミナルで以下のコードを実行します:
python
import torch
print(torch.__version__) # 1.12.0+cu113と出力されるはずです
print(torch.version.cuda) # 11.3と出力されるはずです
print(torch.cuda.is_available()) # Trueと出力されるはずです
この時、出力されるバージョン番号と実際のバージョン番号は一致しているはずです。
以下のコマンドを続けて実行して仮想環境を終了します:
exit() # pythonを終了
conda deactivate # 仮想環境を終了
YOLOv5で訓練した.ptファイルは、export.pyファイルを通じてtorchscript形式でエクスポートする必要があり、GPUモードでのエクスポートを選択します。
エクスポートパラメータは以下の通りです:
後続の手順はコンパイルと実行を含み、二と同じです。walking_xyzデータセットを例にとると、以前はCPUを使用して平均追跡時間が68msだったのに対し、GPU torch加速後は平均追跡時間が37msになり、速度が大幅に向上したことがわかります。
四、TensorRTによる加速
以前に異なるバージョンのtensorrtをインストールしたため、まずアンインストールする必要があります。
作成したconda仮想環境に入ります。
ターミナルで以下のコマンドを実行して、TensorRT Pythonパッケージをアンインストールします:
pip uninstall tensorrt uff graphsurgeon onnx-graphsurgeon
ターミナルで以下のコマンドを実行して、TensorRTローカルインストールファイルを削除します:
# TensorRTインストールディレクトリを見つける(通常は環境ディレクトリ内)
find $CONDA_PREFIX -name "*TensorRT*" -exec rm -rf {} +
# 一般的なTensorRT関連ディレクトリを削除
rm -rf $CONDA_PREFIX/lib/python*/site-packages/tensorrt*
rm -rf $CONDA_PREFIX/lib/python*/site-packages/uff*
rm -rf $CONDA_PREFIX/lib/python*/site-packages/graphsurgeon*
rm -rf $CONDA_PREFIX/lib/python*/site-packages/onnx_graphsurgeon*
1. インストールパッケージのダウンロード
以下のダウンロードリンクに入ります:
https://developer.nvidia.com/tensorrt/download
GPUドライバ、cuda、cudnnと一致するバージョンを選択します。バージョンが一致しない場合、様々な問題が発生します。
ここではtTensorRT8 5 GA Update 1 for linux x86_64 and CUDA 11.0 ~ 11.8 1 tar packageを選択します。私のシステムは20.04で、これも互換して使用できます。
2. インストール
ダウンロードしたファイルをホームに解凍し、ファイル構造は以下のようになります:
ターミナルで以下のコマンドを実行して環境変数を追加します。パスは実際の状況に応じて変更してください:
gedit ~/.bashrc
開いたファイルに以下のコードを追加します:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/TensorRT-8.5.2.2/lib
開いたファイルを閉じて保存し、ターミナルで以下のコマンドを実行して環境を更新します:
source ~/.bashrc
他のソフトウェアがTensorRTのライブラリを見つけられないようにするため、TensorRTのライブラリとヘッダーファイルをシステムパスに追加します
TensorRT-8.5.2.2ディレクトリで、ターミナルで以下のコマンドを実行します:
sudo cp -r ./lib/* /usr/lib
sudo cp -r ./include/* /usr/include
後続のインストールは必ずcondaで作成した仮想環境で行ってください。ターミナルで以下のコマンドを実行して、作成した仮想環境をアクティブにします。ここではyoloで、実際の状況に応じて変更してください:
conda activate yolo
TensorRT-8.5.2.2/pythonディレクトリで、ターミナルで以下のコマンドを実行してTensorRTをインストールします。cp38はpythonバージョンが3.8であることを示し、バージョンに応じて対応するファイルをインストールします:
ターミナルで以下のコマンドを実行してpythonバージョンを確認します:
python --version
pip install tensorrt-8.5.2.2-cp38-none-linux_x86_64.whl
TensorRT-8.5.2.2/uffディレクトリで、ターミナルで以下のコマンドを実行してUFFをインストールします。tensorflowモデル変換をサポートします:
pip install uff-0.6.9-py2.py3-none-any.whl
TensorRT-8.5.2.2/graphsurgeonディレクトリで、ターミナルで以下のコマンドを実行してgraphsurgeonをインストールします。カスタム構造をサポートします:
pip install graphsurgeon-0.4.6-py2.py3-none-any.whl
上記のインストールで言及されたファイルはすべて、対応するファイルディレクトリにあります。インストールできない場合は、ディレクトリ内に対応するファイルがあるか確認してください。
3. インストールの検証
作成した仮想環境で、ターミナルで以下のコマンドを順番に入力します:
python
import tensorrt
tensorrt.__version__
エラーがなければ、インストール成功です。
以下のコマンドを実行して仮想環境を終了します:
exit() # pythonを終了
conda deactivate # 仮想環境を終了
YOLOv5で訓練した.ptファイルは、export.pyファイルを通じてengine形式でエクスポートする必要があり、GPUモードでのエクスポートを選択します。
エクスポートパラメータは以下の通りです:
後続の手順はコンパイルと実行を含み、二と同じです。walking_xyzデータセットを例にとると、以前はCPUを使用して平均追跡時間が68msだったのに対し、GPU torch加速後は平均追跡時間が37ms、GPU tensorrt加速後は平均追跡時間が22msになり、速度が大幅に向上しました。元のorbslam3の平均追跡時間14msに近く、肉眼では速度の違いはわかりません。
五、密集点群マップとオクトツリーマップ
以下の記事を参考に、PCl 1.12をインストールします:
https://blog.csdn.net/2302_80099075/article/details/144687189?spm=1011.2415.3001.5331
ターミナルで以下のコマンドを実行して、PCLツールをインストールし、点群マップを表示します:
sudo apt-get install pcl-tools
ターミナルで以下のコマンドを実行して、octomapツールをインストールし、オクトツリーマップを表示します:
sudo apt-get install octomap-tools
表示例:
マップファイルフォルダでターミナルを開き、ターミナルでpcl_viewer dense_map.pcdを実行します
pcl_viewer (点群マップファイル名)
マップファイルフォルダでターミナルを開き、ターミナルでoctovis map.otを実行します
octovis (オクトツリーマップファイル名)
六、ROSでの実行
主に以下のチュートリアルを参考にしてください:
ROSに同梱のopencvはCUDA、contribライブラリでコンパイルされていないため、プログラムがこれらを使用する場合、ROSに同梱のopencvは使用できません。したがって、カスタムopencvバージョンをROSとリンクするためのcv_bridgeをインストールする必要があります。常にこのエラーが表示されます:
/usr/bin/ld: /usr/local/lib/libopencv_cudafeatures2d.so.4.2.0: undefined reference to `cv::cuda::device::ThrustAllocator::getAllocator()'
/usr/bin/ld: /usr/local/lib/libopencv_cudafeatures2d.so.4.2.0: undefined reference to `cv::cuda::StreamAccessor::getStream(cv::cuda::Stream const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/RGBD.dir/build.make:238:../RGBD] エラー 1
make[1]: *** [CMakeFiles/Makefile2:815:CMakeFiles/RGBD.dir/all] エラー 2
make: *** [Makefile:130:all] エラー 2
cv_bridgeのインストール
以下のリンクから自分のrosバージョンと一致するものをダウンロードします。ここではopencv 4.2 ros noeticです:
https://github.com/ros-perception/vision_opencv/tree/noetic
ダウンロード後、vision_opencv/cv_bridgeの``CMakeLists.txtのopencvパスをインストールしたopencvパスに変更します。opencv 4.2.0を例にします:
set(_opencv_version 4)
set(OpenCV_DIR "/usr/local/opencv4")
find_package(OpenCV 4 QUIET)
if(NOT OpenCV_FOUND)
message(STATUS "Did not find OpenCV 4, trying OpenCV 3")
set(_opencv_version 3)
endif()
vision_opencvをcatkin_ws/srcディレクトリに配置するか、vision_opencvの`cv_bridgeフォルダのみをcatkin_ws/srcディレクトリに配置します。
catkin_wsディレクトリで、ターミナルで以下のコマンドを実行してコンパイルします:
catkin_make -DCMAKE_BUILD_TYPE=Release \
-DOpenCV_DIR=/usr/local/opencv4/lib/cmake/opencv4
Examples/ROS/ORB_SLAM3/CMakeLists.txtopencvパスをインストールしたopencvパスに変更します。
set(OpenCV_DIR "/usr/local/opencv4")
find_package(OpenCV 4.2 QUIET)
if(NOT OpenCV_FOUND)
find_package(OpenCV 2.4.3 QUIET)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
endif()
endif()
後続の再コンパイルが成功します。
コンパイルエラーの対処
error: 'struct cudaPointerAttributes' has no member named 'memoryType'
/usr/local/include/pangolin/imageのmemcpy.hファイルで、
#ifdef HAVE_CUDAを#ifdef HAVE_CUDA_PANGOLINに変更します
/usr/local/include/pangolin/imageでターミナルを開き、以下のコマンドを実行して変更します:
sudo gedit memcpy.h
変更して保存します。
再度コンパイルします。