/streaming_connected_component_discovery

This is the code that corresponds to the paper: J. Heinly, J.L. Schönberger, E. Dunn, and J.M. Frahm, "Reconstructing the World* in Six Days *(As Captured by the Yahoo 100 Million Image Dataset)", CVPR 2015.

Primary LanguageC++GNU General Public License v3.0GPL-3.0

streaming_connected_component_discovery

This is the code that corresponds to the paper: J. Heinly, J.L. Schönberger, E. Dunn, and J.M. Frahm, "Reconstructing the World* in Six Days *(As Captured by the Yahoo 100 Million Image Dataset)", CVPR 2015.

Website:
http://jaredheinly.com/reconstructing_the_world.html

Necessary Software

The following software is required in order to build and use this project.

Visual Studio

If using Windows, make sure that Visual Studio has been run at least once and is able to compile C++ code. If Visual Studio has not been run, CMake will have problems when attempting to identify and use the native Visual Studio compiler. The current version that has been used is VS2013, utilizing the 64-bit compiler.

CMake

CMake is a tool that manages the building of software on multiple different platforms. A developer need only to write a CMakeLists.txt file, and CMake can generate a Visual Studio solution for Windows, a Makefile for *nix, etc. The latest binaries can be obtained from:
http://www.cmake.org/download

CUDA

Several of the libraries in this project depend on CUDA. The latest version can be downloaded here:
https://developer.nvidia.com/cuda-downloads
The latest version that has been used is CUDA 6.5

OpenCV 2.4.x

Download the latest version of OpenCV that is 2.4.x from:
http://opencv.org/downloads.html
OR
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/
The latest version that has been used is OpenCV 2.4.9

Boost

Download the latest version of the Boost binaries from:
http://sourceforge.net/projects/boost/files/boost-binaries/
NOTE: make sure to download the 64-bit boost binaries that match the version of Visual Studio that you are using.
The latest version that has been used is Boost 1.56

COLMAP

This project can be combined with COLMAP (https://github.com/colmap/colmap) to generate 3D models from the discovered connected components. This project already includes a minimal subset of COLMAP to save the connected component results to disk.
NOTE: An old version of COLAMP is included. The latest version will be supported shortly.

Included Software

The following software packages have already been included in this project.

ANN

Approximate nearest neighbor library. Included with VocabTree2.
http://www.cs.umd.edu/~mount/ANN/

Eigen

Linear algebra library.
http://eigen.tuxfamily.org/

Google Breakpad

Crash handling system.
https://chromium.googlesource.com/breakpad/breakpad/

ImageLib

Library included with VocabTree2.

libjpeg-turbo

Fast JPEG library.
http://libjpeg-turbo.virtualgl.org/

msinttypes

Type definitions for Visual Studio compilers.

SiftGPU

GPU-enabled SIFT computation.
http://cs.unc.edu/~ccwu/siftgpu/

SQLite

Lightweight SQL database.
https://sqlite.org/

VocabTree2

Vocabulary tree library.
https://github.com/snavely/VocabTree2

Compilation Instructions

Use the following steps to compile the project.

CMakeLists

In order to compile the project, a CMakeLists.txt file has been provided in the root folder. Simply point CMake at this CMakeLists.txt file in order to start the process of building the project.

Find OpenCV

CMake will request the location of the OpenCV library. Set OpenCV_DIR in CMake to the OpenCV folder which contains OpenCVConfig.cmake, which is typically the opencv_root/build folder.

Find Boost

CMake will request the location of the Boost library. Set CMH_BOOST_ROOT_DIR in CMake to the root Boost path on your system. Then set CMH_BOOST_LIBRARY_DIR to the Boost folder that contains the compiled Boost binaries, for instance boost_root/lib64-msvc-12.0 for VS2013.

CUDA Compute Capability

In order to generate GPU code for a specific CUDA compute capability, check the CMH_CUDA_COMPUTE_CAPABILITY_*_ENABLED options in CMake that correspond to the compute capabilities that you want to compile for and enable.

CUDA 7.0

CUDA 7.0 allows the option to link to a static version of the CUDA runtime. However, this ability is not supported in the current build files, and so the CUDA_USE_STATIC_CUDA_RUNTIME option in CMake should be disabled.

Compile

At this point, the project should be able to be compiled. Make sure to compile in Release mode, as several libraries invoke executables out of the Release folder.

Execution Instructions

Use the following steps to run the project.

Connected Component Discovery

To begin configuring the project for use on a particular dataset, run the main executable, streaming_connected_component_discovery.exe, typically located in the build/bin/Release folder. An example for how to run the executable is found in scripts/examples/run_connected_component_discovery.bat. Assuming that a config.txt file does not already exist at the specified path within the script, this will create a default configuration file, config.txt, which is used to specify all of the settings for a particular dataset and computer configuration.

A typical dataset will contain the following folders and files, and will be reflected in the dataset's config file:

  • dataset/
    • backup/
    • log/
    • output_sfm/
    • visualization/
    • config.txt
    • pcdb.txt
    • image_lists.txt
    • run_connected_component_discovery.bat
    • run_densification.bat
    • run_all_mapper_tasks.bat

Typically, to prepare a dataset for processing, its images should be arranged in a hierarchical format, and optionally distributed across multiple hard drives. The folders of images on disk is described in the pcdb.txt file (a sample file is in the lib_v3d_support/examples folder). Then, depending on the number of threads that should be used to read images from disk, multiple files should be created where each file contains a list of the images to be read by a single thread. A file containing paths to these multiple files should then be created, and for instance, named image_lists.txt.

The config.txt file is the primary configuration file and contains most of the settings used to run the pipeline. For instance, paths to the above dataset folders (backup, log, visualization, etc.) will need to be specified, as well as the path to a pretrained vocabulary tree (a sample is provided here, as well as trees generated with VocabTree2), mapper project template (provided in the data folder), and sqlite database (which will be created by the executable and should not exist prior running the executable). Additionally, settings for the number of registration attempts per image (max_match_attempts_per_image), discard rate (cluster_discard_rate_in_images), number of CPU threads (num_main_cpu_threads), number of GPU threads (num_cuda_sift_threads, num_main_gpu_threads), GPU indices (sift_gpu_nums_list, main_gpu_nums_list), image dimension (max_image_dimension), and number of SIFT features (max_num_features).

After all necessary settings are changed in the config.txt file, run_connected_component_discovery.bat can be run again, which will process the dataset and discover its connected components of images.

As the code runs, it will print out statistics about its speed to the console, as well as a log file in dataset/log. Additionally, the program will track memory usage statistics, and write those to files in dataset/log. Periodically, an HTML visualization of the current image clusters and connected components will be saved to dataset/visualization. Also, a backup of the current cluster and component states will be saved to dataset/backup.

At the end of execution, the final state of the clusters and components will be saved to dataset/backup, and a final visualization will be saved in dataset/visualization.

Connected Component Densification

Once connected component discovery concludes, the densification of the connections within a component can begin. Here, update the densification_* settings in the config.txt file, and then run the scripts/examples/run_densification.bat script.

Structure-from-Motion

Once densification concludes, structure-from-motion can begin by running the scripts/examples/run_all_mapper_tasks.bat script.