Skip to content

Commit 5c46d52

Browse files
committed
Use cuda-efficient-features (experimental)
1 parent b5f2e1f commit 5c46d52

File tree

7 files changed

+375
-20
lines changed

7 files changed

+375
-20
lines changed

Dockerfile.cuda

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
FROM nvidia/cuda:11.8.0-devel-ubuntu22.04
2+
ENV DEBIAN_FRONTEND noninteractive
3+
4+
# install dependencies via apt
5+
ENV DEBCONF_NOWARNINGS yes
6+
RUN set -x && \
7+
apt-get update -y -qq && \
8+
apt-get upgrade -y -qq --no-install-recommends && \
9+
: "basic dependencies" && \
10+
apt-get install -y -qq \
11+
build-essential \
12+
pkg-config \
13+
cmake \
14+
git \
15+
wget \
16+
curl \
17+
tar \
18+
unzip && \
19+
: "g2o dependencies" && \
20+
apt-get install -y -qq \
21+
libatlas-base-dev \
22+
libsuitesparse-dev \
23+
libglew-dev && \
24+
: "OpenCV dependencies" && \
25+
apt-get install -y -qq \
26+
libgtk-3-dev \
27+
libjpeg-dev \
28+
libpng++-dev \
29+
libtiff-dev \
30+
libopenexr-dev \
31+
libwebp-dev \
32+
ffmpeg \
33+
libavcodec-dev \
34+
libavformat-dev \
35+
libavutil-dev \
36+
libswscale-dev \
37+
libtbb-dev && \
38+
: "backward-cpp dependencies" && \
39+
apt install -y -qq binutils-dev && \
40+
: "other dependencies" && \
41+
apt-get install -y -qq \
42+
libyaml-cpp-dev \
43+
sqlite3 \
44+
libsqlite3-dev && \
45+
: "remove cache" && \
46+
apt-get autoremove -y -qq && \
47+
rm -rf /var/lib/apt/lists/*
48+
49+
ARG CMAKE_INSTALL_PREFIX=/usr/local
50+
ARG NUM_THREADS=1
51+
52+
ENV CPATH=${CMAKE_INSTALL_PREFIX}/include:${CPATH}
53+
ENV C_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${C_INCLUDE_PATH}
54+
ENV CPLUS_INCLUDE_PATH=${CMAKE_INSTALL_PREFIX}/include:${CPLUS_INCLUDE_PATH}
55+
ENV LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LIBRARY_PATH}
56+
ENV LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${LD_LIBRARY_PATH}
57+
58+
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
59+
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
60+
61+
# Eigen
62+
ARG EIGEN3_VERSION=3.3.7
63+
WORKDIR /tmp
64+
RUN set -x && \
65+
wget -q https://gitlab.com/libeigen/eigen/-/archive/${EIGEN3_VERSION}/eigen-${EIGEN3_VERSION}.tar.bz2 && \
66+
tar xf eigen-${EIGEN3_VERSION}.tar.bz2 && \
67+
rm -rf eigen-${EIGEN3_VERSION}.tar.bz2 && \
68+
cd eigen-${EIGEN3_VERSION} && \
69+
mkdir -p build && \
70+
cd build && \
71+
cmake \
72+
-DCMAKE_BUILD_TYPE=Release \
73+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
74+
.. && \
75+
make -j${NUM_THREADS} && \
76+
make install && \
77+
cd /tmp && \
78+
rm -rf *
79+
ENV Eigen3_DIR=${CMAKE_INSTALL_PREFIX}/share/eigen3/cmake
80+
81+
# g2o
82+
ARG G2O_COMMIT=20230223_git
83+
WORKDIR /tmp
84+
RUN set -x && \
85+
git clone https://github.com/RainerKuemmerle/g2o.git && \
86+
cd g2o && \
87+
git checkout ${G2O_COMMIT} && \
88+
mkdir -p build && \
89+
cd build && \
90+
cmake \
91+
-DCMAKE_BUILD_TYPE=Release \
92+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
93+
-DBUILD_SHARED_LIBS=ON \
94+
-DBUILD_UNITTESTS=OFF \
95+
-DG2O_USE_CHOLMOD=OFF \
96+
-DG2O_USE_CSPARSE=ON \
97+
-DG2O_USE_OPENGL=OFF \
98+
-DG2O_USE_OPENMP=OFF \
99+
-DG2O_BUILD_APPS=OFF \
100+
-DG2O_BUILD_EXAMPLES=OFF \
101+
-DG2O_BUILD_LINKED_APPS=OFF \
102+
.. && \
103+
make -j${NUM_THREADS} && \
104+
make install && \
105+
cd /tmp && \
106+
rm -rf *
107+
ENV g2o_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/g2o
108+
109+
# OpenCV
110+
ARG OPENCV_VERSION=4.7.0
111+
WORKDIR /tmp
112+
RUN set -x && \
113+
wget -q https://github.com/opencv/opencv/archive/${OPENCV_VERSION}.zip && \
114+
unzip -q ${OPENCV_VERSION}.zip && \
115+
rm -rf ${OPENCV_VERSION}.zip && \
116+
wget -q https://github.com/opencv/opencv_contrib/archive/refs/tags/${OPENCV_VERSION}.zip -O opencv_contrib-${OPENCV_VERSION}.zip && \
117+
unzip -q opencv_contrib-${OPENCV_VERSION}.zip && \
118+
rm -rf opencv_contrib-${OPENCV_VERSION}.zip && \
119+
mkdir extra && \
120+
mv opencv_contrib-${OPENCV_VERSION}/modules/cudev extra && \
121+
mv opencv_contrib-${OPENCV_VERSION}/modules/cudafilters extra && \
122+
mv opencv_contrib-${OPENCV_VERSION}/modules/cudaimgproc extra && \
123+
mv opencv_contrib-${OPENCV_VERSION}/modules/cudawarping extra && \
124+
mv opencv_contrib-${OPENCV_VERSION}/modules/cudaarithm extra && \
125+
rm -rf opencv_contrib-${OPENCV_VERSION} && \
126+
cd opencv-${OPENCV_VERSION} && \
127+
mkdir -p build && \
128+
cd build && \
129+
cmake \
130+
-DCMAKE_BUILD_TYPE=Release \
131+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
132+
-DBUILD_DOCS=OFF \
133+
-DBUILD_EXAMPLES=OFF \
134+
-DBUILD_JASPER=OFF \
135+
-DBUILD_OPENEXR=OFF \
136+
-DBUILD_PERF_TESTS=OFF \
137+
-DBUILD_TESTS=OFF \
138+
-DBUILD_PROTOBUF=OFF \
139+
-DBUILD_opencv_apps=OFF \
140+
-DBUILD_opencv_dnn=OFF \
141+
-DBUILD_opencv_ml=OFF \
142+
-DBUILD_opencv_python_bindings_generator=OFF \
143+
-DENABLE_CXX11=ON \
144+
-DENABLE_FAST_MATH=ON \
145+
-DWITH_EIGEN=ON \
146+
-DWITH_FFMPEG=ON \
147+
-DWITH_TBB=ON \
148+
-DWITH_OPENMP=ON \
149+
-DWITH_CUDA=ON \
150+
-DBUILD_opencv_cudev=ON \
151+
-DBUILD_opencv_cudafilters=ON \
152+
-DBUILD_opencv_cudaimgproc=ON \
153+
-DBUILD_opencv_cudawarping=ON \
154+
-DOPENCV_EXTRA_MODULES_PATH=/tmp/extra \
155+
.. && \
156+
make -j${NUM_THREADS} && \
157+
make install && \
158+
cd /tmp && \
159+
rm -rf *
160+
ENV OpenCV_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/opencv4
161+
162+
# Pangolin
163+
ARG PANGOLIN_COMMIT=eab3d3449a33a042b1ee7225e1b8b593b1b21e3e
164+
WORKDIR /tmp
165+
RUN set -x && \
166+
git clone https://github.com/stevenlovegrove/Pangolin.git && \
167+
cd Pangolin && \
168+
git checkout ${PANGOLIN_COMMIT} && \
169+
mkdir -p build && \
170+
cd build && \
171+
cmake \
172+
-DCMAKE_BUILD_TYPE=Release \
173+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
174+
-DBUILD_EXAMPLES=OFF \
175+
-DBUILD_PANGOLIN_DEPTHSENSE=OFF \
176+
-DBUILD_PANGOLIN_FFMPEG=OFF \
177+
-DBUILD_PANGOLIN_LIBDC1394=OFF \
178+
-DBUILD_PANGOLIN_LIBJPEG=OFF \
179+
-DBUILD_PANGOLIN_LIBOPENEXR=OFF \
180+
-DBUILD_PANGOLIN_LIBPNG=OFF \
181+
-DBUILD_PANGOLIN_LIBTIFF=OFF \
182+
-DBUILD_PANGOLIN_LIBUVC=OFF \
183+
-DBUILD_PANGOLIN_LZ4=OFF \
184+
-DBUILD_PANGOLIN_OPENNI=OFF \
185+
-DBUILD_PANGOLIN_OPENNI2=OFF \
186+
-DBUILD_PANGOLIN_PLEORA=OFF \
187+
-DBUILD_PANGOLIN_PYTHON=OFF \
188+
-DBUILD_PANGOLIN_TELICAM=OFF \
189+
-DBUILD_PANGOLIN_UVC_MEDIAFOUNDATION=OFF \
190+
-DBUILD_PANGOLIN_V4L=OFF \
191+
-DBUILD_PANGOLIN_ZSTD=OFF \
192+
.. && \
193+
make -j${NUM_THREADS} && \
194+
make install && \
195+
cd /tmp && \
196+
rm -rf *
197+
ENV Pangolin_DIR=${CMAKE_INSTALL_PREFIX}/lib/cmake/Pangolin
198+
199+
# backward-cpp
200+
ARG BACKWARD_CPP_COMMIT=5ffb2c879ebdbea3bdb8477c671e32b1c984beaa
201+
WORKDIR /tmp
202+
RUN set -x && \
203+
git clone https://github.com/bombela/backward-cpp.git && \
204+
cd backward-cpp && \
205+
git checkout ${BACKWARD_CPP_COMMIT} && \
206+
mkdir -p build && \
207+
cd build && \
208+
cmake \
209+
-DCMAKE_BUILD_TYPE=Release \
210+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
211+
.. && \
212+
make -j${NUM_THREADS} && \
213+
make install && \
214+
cd /tmp && \
215+
rm -rf *
216+
217+
# cuda-efficient-features
218+
ARG CUDA_EFFICIENT_FEATURES_COMMIT=8cf047a4bed6c1ee56fcde81d4a953b57744ed85
219+
WORKDIR /tmp
220+
RUN set -x && \
221+
git clone https://github.com/fixstars/cuda-efficient-features.git && \
222+
cd cuda-efficient-features && \
223+
git checkout -q ${CUDA_EFFICIENT_FEATURES_COMMIT} && \
224+
mkdir -p build && \
225+
cd build && \
226+
cmake \
227+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
228+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
229+
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
230+
.. && \
231+
make -j${NUM_THREADS} && \
232+
make install && \
233+
cd /tmp && \
234+
rm -rf *
235+
236+
# stella_vslam
237+
COPY . /stella_vslam/
238+
WORKDIR /stella_vslam/
239+
RUN set -x && \
240+
mkdir -p build && \
241+
cd build && \
242+
cmake \
243+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
244+
.. && \
245+
make -j${NUM_THREADS} && \
246+
make install && \
247+
rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake example src && \
248+
chmod -R 777 ./*
249+
250+
ARG PANGOLIN_VIEWER_COMMIT=f3564675d420bcdbe6380b29b5e2f2b623987dd0
251+
WORKDIR /tmp
252+
RUN set -x && \
253+
git clone https://github.com/stella-cv/pangolin_viewer.git && \
254+
cd pangolin_viewer && \
255+
git checkout -q ${PANGOLIN_VIEWER_COMMIT} && \
256+
git submodule update --init --recursive && \
257+
mkdir -p build && \
258+
cd build && \
259+
cmake \
260+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
261+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
262+
.. && \
263+
make -j${NUM_THREADS} && \
264+
make install && \
265+
cd /tmp && \
266+
rm -rf *
267+
268+
ARG EXAMPLES_COMMIT=defc69eecc36e51cdda22885bb86954f08ad6887
269+
WORKDIR /
270+
RUN set -x && \
271+
git clone https://github.com/stella-cv/stella_vslam_examples.git && \
272+
cd stella_vslam_examples && \
273+
git checkout -q ${EXAMPLES_COMMIT} && \
274+
git submodule update --init --recursive && \
275+
mkdir -p build && \
276+
cd build && \
277+
cmake \
278+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
279+
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} \
280+
-DUSE_STACK_TRACE_LOGGER=ON \
281+
.. && \
282+
make -j${NUM_THREADS}
283+
284+
WORKDIR /stella_vslam_examples/build/
285+
ENTRYPOINT ["/bin/bash"]

src/stella_vslam/CMakeLists.txt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ else()
6969
message(FATAL_ERROR "Invalid BoW framework: ${BOW_FRAMEWORK}")
7070
endif()
7171

72+
find_path(cuda_efficient_features_INCLUDE_DIR NAMES cuda_efficient_features.h)
73+
find_library(cuda_efficient_features_LIBRARY NAMES cuda_efficient_features)
74+
find_package_handle_standard_args(cuda_efficient_features DEFAULT_MSG cuda_efficient_features_LIBRARY cuda_efficient_features_INCLUDE_DIR)
75+
if (cuda_efficient_features_FOUND)
76+
find_package(OpenCV REQUIRED core features2d cudev cudafilters cudaimgproc cudawarping)
77+
find_package(CUDAToolkit REQUIRED)
78+
target_compile_definitions(${PROJECT_NAME} PUBLIC USE_CUDA_EFFICIENT_DESCRIPTORS)
79+
message(STATUS "cuda_efficient_features: ENABLED")
80+
endif ()
81+
7282
# ----- Create stella_vslam library -----
7383

7484
add_library(${PROJECT_NAME}
@@ -222,8 +232,10 @@ target_link_libraries(${PROJECT_NAME}
222232
${SUITESPARSE_LIBRARIES}
223233
${BoW_LIBRARY}
224234
"$<$<BOOL:${spdlog_FOUND}>:spdlog::spdlog>"
235+
"$<$<BOOL:${cuda_efficient_features_FOUND}>:${cuda_efficient_features_LIBRARY};opencv_cudafilters;opencv_cudawarping>"
225236
PRIVATE
226-
${LAPACK_LIBRARIES})
237+
${LAPACK_LIBRARIES}
238+
"$<$<BOOL:${cuda_efficient_features_FOUND}>:CUDA::cudart;CUDA::cublas>")
227239

228240
# ----- Install configuration -----
229241

src/stella_vslam/feature/orb_extractor.cc

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,14 @@ namespace feature {
1515

1616
orb_extractor::orb_extractor(const orb_params* orb_params,
1717
const unsigned int min_area,
18+
const descriptor_type desc_type,
1819
const std::vector<std::vector<float>>& mask_rects)
19-
: orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)) {
20+
: orb_params_(orb_params), mask_rects_(mask_rects), min_area_sqrt_(std::sqrt(min_area)), desc_type_(desc_type) {
2021
// resize buffers according to the number of levels
2122
image_pyramid_.resize(orb_params_->num_levels_);
23+
#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS
24+
hash_sift_ = cv::cuda::HashSIFT::create(1.0, cv::cuda::HashSIFT::SIZE_256_BITS);
25+
#endif
2226
}
2327

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

104108
// To enable parallelization, set the environment variable OMP_MAX_ACTIVE_LEVELS to 2.
109+
if (desc_type_ == feature::descriptor_type::ORB) {
105110
#ifdef USE_OPENMP
106111
#pragma omp parallel for schedule(static)
107112
#endif
108-
for (unsigned int i = 0; i < keypts_at_level.size(); ++i) {
109-
compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i));
113+
for (unsigned int i = 0; i < keypts_at_level.size(); ++i) {
114+
compute_orb_descriptor(keypts_at_level[i], blurred_image, descriptors_at_level.ptr(i));
115+
}
116+
}
117+
else if (desc_type_ == feature::descriptor_type::HASH_SIFT) {
118+
#ifdef USE_CUDA_EFFICIENT_DESCRIPTORS
119+
hash_sift_->compute(blurred_image, keypts_at_level, descriptors_at_level);
120+
#else
121+
throw std::runtime_error("cuda_efficient_features is not available");
122+
#endif
123+
}
124+
else {
125+
throw std::runtime_error("Invalid descriptor_type");
110126
}
111127

112128
correct_keypoint_scale(keypts_at_level, level);

0 commit comments

Comments
 (0)