Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
285 changes: 285 additions & 0 deletions Dockerfile.cuda
Original file line number Diff line number Diff line change
@@ -0,0 +1,285 @@
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
ENV DEBIAN_FRONTEND noninteractive

# install dependencies via apt
ENV DEBCONF_NOWARNINGS yes
RUN set -x && \
apt-get update -y -qq && \
apt-get upgrade -y -qq --no-install-recommends && \
: "basic dependencies" && \
apt-get install -y -qq \
build-essential \
pkg-config \
cmake \
git \
wget \
curl \
tar \
unzip && \
: "g2o dependencies" && \
apt-get install -y -qq \
libatlas-base-dev \
libsuitesparse-dev \
libglew-dev && \
: "OpenCV dependencies" && \
apt-get install -y -qq \
libgtk-3-dev \
libjpeg-dev \
libpng++-dev \
libtiff-dev \
libopenexr-dev \
libwebp-dev \
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
libswscale-dev \
libtbb-dev && \
: "backward-cpp dependencies" && \
apt install -y -qq binutils-dev && \
: "other dependencies" && \
apt-get install -y -qq \
libyaml-cpp-dev \
sqlite3 \
libsqlite3-dev && \
: "remove cache" && \
apt-get autoremove -y -qq && \
rm -rf /var/lib/apt/lists/*

ARG CMAKE_INSTALL_PREFIX=/usr/local
ARG NUM_THREADS=1

ENV CPATH=${CMAKE_INSTALL_PREFIX}/include:${CPATH}
ENV C_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${C_INCLUDE_PATH}
ENV CPLUS_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${CPLUS_INCLUDE_PATH}
ENV LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LIBRARY_PATH}
ENV LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LD_LIBRARY_PATH}

ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

# Eigen
ARG EIGEN3_VERSION=3.3.7
WORKDIR /tmp
RUN set -x && \
wget -q https://gitlab.com/libeigen/eigen/-/archive/${EIGEN3_VERSION}/eigen-${EIGEN3_VERSION}.tar.bz2 && \
tar xf eigen-${EIGEN3_VERSION}.tar.bz2 && \
rm -rf eigen-${EIGEN3_VERSION}.tar.bz2 && \
cd eigen-${EIGEN3_VERSION} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *
ENV Eigen3_DIR=${CMAKE_INSTALL_PREFIX}/share/eigen3/cmake

# g2o
ARG G2O_COMMIT=20230223_git
WORKDIR /tmp
RUN set -x && \
git clone https://github.com/RainerKuemmerle/g2o.git && \
cd g2o && \
git checkout ${G2O_COMMIT} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_UNITTESTS=OFF \
-DG2O_USE_CHOLMOD=OFF \
-DG2O_USE_CSPARSE=ON \
-DG2O_USE_OPENGL=OFF \
-DG2O_USE_OPENMP=OFF \
-DG2O_BUILD_APPS=OFF \
-DG2O_BUILD_EXAMPLES=OFF \
-DG2O_BUILD_LINKED_APPS=OFF \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *
ENV g2o_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/g2o

# OpenCV
ARG OPENCV_VERSION=4.7.0
WORKDIR /tmp
RUN set -x && \
wget -q https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
unzip -q ${OPENCV_VERSION}.zip && \
rm -rf ${OPENCV_VERSION}.zip && \
wget -q https://github.com/opencv/opencv_contrib/archive/refs/tags/${OPENCV_VERSION}.zip -O opencv_contrib-${OPENCV_VERSION}.zip && \
unzip -q opencv_contrib-${OPENCV_VERSION}.zip && \
rm -rf opencv_contrib-${OPENCV_VERSION}.zip && \
mkdir extra && \
mv opencv_contrib-${OPENCV_VERSION}/modules/cudev extra && \
mv opencv_contrib-${OPENCV_VERSION}/modules/cudafilters extra && \
mv opencv_contrib-${OPENCV_VERSION}/modules/cudaimgproc extra && \
mv opencv_contrib-${OPENCV_VERSION}/modules/cudawarping extra && \
mv opencv_contrib-${OPENCV_VERSION}/modules/cudaarithm extra && \
rm -rf opencv_contrib-${OPENCV_VERSION} && \
cd opencv-${OPENCV_VERSION} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_OPENEXR=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_PROTOBUF=OFF \
-DBUILD_opencv_apps=OFF \
-DBUILD_opencv_dnn=OFF \
-DBUILD_opencv_ml=OFF \
-DBUILD_opencv_python_bindings_generator=OFF \
-DENABLE_CXX11=ON \
-DENABLE_FAST_MATH=ON \
-DWITH_EIGEN=ON \
-DWITH_FFMPEG=ON \
-DWITH_TBB=ON \
-DWITH_OPENMP=ON \
-DWITH_CUDA=ON \
-DBUILD_opencv_cudev=ON \
-DBUILD_opencv_cudafilters=ON \
-DBUILD_opencv_cudaimgproc=ON \
-DBUILD_opencv_cudawarping=ON \
-DOPENCV_EXTRA_MODULES_PATH=/tmp/extra \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *
ENV OpenCV_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/opencv4

# Pangolin
ARG PANGOLIN_COMMIT=eab3d3449a33a042b1ee7225e1b8b593b1b21e3e
WORKDIR /tmp
RUN set -x && \
git clone https://github.com/stevenlovegrove/Pangolin.git && \
cd Pangolin && \
git checkout ${PANGOLIN_COMMIT} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
-DBUILD_EXAMPLES=OFF \
-DBUILD_PANGOLIN_DEPTHSENSE=OFF \
-DBUILD_PANGOLIN_FFMPEG=OFF \
-DBUILD_PANGOLIN_LIBDC1394=OFF \
-DBUILD_PANGOLIN_LIBJPEG=OFF \
-DBUILD_PANGOLIN_LIBOPENEXR=OFF \
-DBUILD_PANGOLIN_LIBPNG=OFF \
-DBUILD_PANGOLIN_LIBTIFF=OFF \
-DBUILD_PANGOLIN_LIBUVC=OFF \
-DBUILD_PANGOLIN_LZ4=OFF \
-DBUILD_PANGOLIN_OPENNI=OFF \
-DBUILD_PANGOLIN_OPENNI2=OFF \
-DBUILD_PANGOLIN_PLEORA=OFF \
-DBUILD_PANGOLIN_PYTHON=OFF \
-DBUILD_PANGOLIN_TELICAM=OFF \
-DBUILD_PANGOLIN_UVC_MEDIAFOUNDATION=OFF \
-DBUILD_PANGOLIN_V4L=OFF \
-DBUILD_PANGOLIN_ZSTD=OFF \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *
ENV Pangolin_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/Pangolin

# backward-cpp
ARG BACKWARD_CPP_COMMIT=5ffb2c879ebdbea3bdb8477c671e32b1c984beaa
WORKDIR /tmp
RUN set -x && \
git clone https://github.com/bombela/backward-cpp.git && \
cd backward-cpp && \
git checkout ${BACKWARD_CPP_COMMIT} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *

# cuda-efficient-features
ARG CUDA_EFFICIENT_FEATURES_COMMIT=8cf047a4bed6c1ee56fcde81d4a953b57744ed85
WORKDIR /tmp
RUN set -x && \
git clone https://github.com/fixstars/cuda-efficient-features.git && \
cd cuda-efficient-features && \
git checkout -q ${CUDA_EFFICIENT_FEATURES_COMMIT} && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *

# stella_vslam
COPY . /stella_vslam/
WORKDIR /stella_vslam/
RUN set -x && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
.. && \
make -j${NUM_THREADS} && \
make install && \
rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake example src && \
chmod -R 777 ./*

ARG PANGOLIN_VIEWER_COMMIT=f3564675d420bcdbe6380b29b5e2f2b623987dd0
WORKDIR /tmp
RUN set -x && \
git clone https://github.com/stella-cv/pangolin_viewer.git && \
cd pangolin_viewer && \
git checkout -q ${PANGOLIN_VIEWER_COMMIT} && \
git submodule update --init --recursive && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
.. && \
make -j${NUM_THREADS} && \
make install && \
cd /tmp && \
rm -rf *

ARG EXAMPLES_COMMIT=defc69eecc36e51cdda22885bb86954f08ad6887
WORKDIR /
RUN set -x && \
git clone https://github.com/stella-cv/stella_vslam_examples.git && \
cd stella_vslam_examples && \
git checkout -q ${EXAMPLES_COMMIT} && \
git submodule update --init --recursive && \
mkdir -p build && \
cd build && \
cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
-DUSE_STACK_TRACE_LOGGER=ON \
.. && \
make -j${NUM_THREADS}

WORKDIR /stella_vslam_examples/build/
ENTRYPOINT ["/bin/bash"]
23 changes: 22 additions & 1 deletion src/stella_vslam/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,18 @@ else()
message(FATAL_ERROR "Invalid BoW framework: ${BOW_FRAMEWORK}")
endif()

# cuda_efficient_features
set(USE_CUDA_EFFICIENT_DESCRIPTORS OFF CACHE BOOL "Enable cuda_efficient_features")
find_path(cuda_efficient_features_INCLUDE_DIR NAMES cuda_efficient_features.h)
find_library(cuda_efficient_features_LIBRARY NAMES cuda_efficient_features)
find_package_handle_standard_args(cuda_efficient_features DEFAULT_MSG cuda_efficient_features_LIBRARY cuda_efficient_features_INCLUDE_DIR)
if(USE_CUDA_EFFICIENT_DESCRIPTORS AND cuda_efficient_features_FOUND)
message(STATUS "cuda_efficient_features: enabled")
else()
message(STATUS "cuda_efficient_features: disabled")
set(USE_CUDA_EFFICIENT_DESCRIPTORS OFF)
endif()

# ----- Create stella_vslam library -----

add_library(${PROJECT_NAME}
Expand All @@ -92,6 +104,13 @@ set_target_properties(${PROJECT_NAME} PROPERTIES

# ----- Compile configuration -----

# cuda_efficient_features
if (USE_CUDA_EFFICIENT_DESCRIPTORS)
find_package(OpenCV REQUIRED core features2d cudev cudafilters cudaimgproc cudawarping)
find_package(CUDAToolkit REQUIRED)
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_CUDA_EFFICIENT_DESCRIPTORS)
endif ()

# gtsam
if (USE_GTSAM)
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_GTSAM)
Expand Down Expand Up @@ -222,8 +241,10 @@ target_link_libraries(${PROJECT_NAME}
${SUITESPARSE_LIBRARIES}
${BoW_LIBRARY}
"$<$<BOOL:${spdlog_FOUND}>:spdlog::spdlog>"
"$<$<BOOL:${USE_CUDA_EFFICIENT_DESCRIPTORS}>:${cuda_efficient_features_LIBRARY};opencv_cudafilters;opencv_cudawarping>"
PRIVATE
${LAPACK_LIBRARIES})
${LAPACK_LIBRARIES}
"$<$<BOOL:${USE_CUDA_EFFICIENT_DESCRIPTORS}>:CUDA::cudart;CUDA::cublas>")

# ----- Install configuration -----

Expand Down
22 changes: 19 additions & 3 deletions src/stella_vslam/feature/orb_extractor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,14 @@ namespace feature {

orb_extractor::orb_extractor(const orb_params* orb_params,
const unsigned int min_area,
const descriptor_type desc_type,
const std::vector<std::vector<float>>& mask_rects)
: orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)) {
: orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)), desc_type_(desc_type) {
// resize buffers according to the number of levels
image_pyramid_.resize(orb_params_->num_levels_);
#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS
hash_sift_ = cv::cuda::HashSIFT::create(1.0, cv::cuda::HashSIFT::SIZE_256_BITS);
#endif
}

void orb_extractor::extract(const cv::_InputArray& in_image, const cv::_InputArray& in_image_mask,
Expand Down Expand Up @@ -102,11 +106,23 @@ void orb_extractor::extract(const cv::_InputArray& in_image, const cv::_InputArr
descriptors_at_level = cv::Mat::zeros(num_keypts_at_level, 32, CV_8UC1);

// To enable parallelization, set the environment variable OMP_MAX_ACTIVE_LEVELS to 2.
if (desc_type_ == feature::descriptor_type::ORB) {
#ifdef USE_OPENMP
#pragma omp parallel for schedule(static)
#endif
for (unsigned int i = 0; i < keypts_at_level.size(); ++i) {
compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i));
for (unsigned int i = 0; i < keypts_at_level.size(); ++i) {
compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i));
}
}
else if (desc_type_ == feature::descriptor_type::HASH_SIFT) {
#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS
hash_sift_->compute(blurred_image, keypts_at_level, descriptors_at_level);
#else
throw std::runtime_error("cuda_efficient_features is not available");
#endif
}
else {
throw std::runtime_error("Invalid descriptor_type");
}

correct_keypoint_scale(keypts_at_level, level);
Expand Down
Loading
Loading