オープンソースによるフォトグラメトリを実行するための環境構築

### はじめに
この記事は，Ubuntu系の計算機にオープンソースの
フォトグラメトリを行う環境を構築する手順の記載となります．

### フォトグラメトリとは
立体復元対象が写っている複数の写真から，
立体復元対象の3Dモデルを生成する手法のことです．

### 計算機スペック
+ OSはUbuntu20.04で環境構築を行います
（Ubuntu22.04ではこの方法だとインストールできません．原因はまだ未解決．）
  - Linux Mint 20 や Ubuntu Mate 20.04でも同じ方法で環境構築可能です． 
+ CPUとGPUは高スペックであることが望ましい（計算時間がかかります．）
+ CPUはAMD64プロセッサ（arm64はインストールできません．）
+ CUDAが必須（Nvidia系のGPUが必要になります．）
+ make -j32を使っています．（CPUのコア数で適宜変更してください．）

### インストールするフォトグラメトリオープンソース
+ [OpenSfM (https://opensfm.org/)](https://opensfm.org/)
+ [openMVS (https://github.com/cdcseacave/openMVS)](https://github.com/cdcseacave/openMVS)
+ [COLMAP (https://colmap.github.io/)](https://colmap.github.io/)

###  クリーンインストールした状態からの環境構築手順
- 必要に応じて適宜変更して行ってください．
#### 1. 初期設定およびnvidiaドライバのインストール
 ```BASH:ユーザディレクトリの英語化
 $ LANG=C xdg-user-dirs-gtk-update
 ```
 ```BASH:パッケージの更新
 $ sudo apt update
 $ sudo apt upgrade
 ```
 ```BASH:vimをインストール（著者はvimを使うので）
 $ sudo apt install vim
 ```
 ```BASH:nouveauの確認
 $ lsmod | grep nouveau
 # このコマンドを実行後，何か表示されたら，次の内容を行うこと
 # 表示されない場合，nvidiaドライバの確認へ
 ```
 ```BASH:nouveauの無効化の準備
 $ sudo vim /etc/modprobe.d/blacklist-nouveau.conf # 次の内容を書き込んでください
 ```
 ```blacklist-nouveau.confに書き込む内容
 blacklist nouveau
 options nouveau modeset=0 
 ```
 ```BASH:nouveauの無効化，再起動
 $ sudo update-initramfs -u 
 $ sudo reboot 
 ```
 ```BASH:nouveauの無効化の確認および，nvidiaドライバの確認
 $ lsmod | grep nouveau # 何も表示しないことを確認する
 $ ubuntu-drivers devices # Recommendされている nvidia-driver-○○-open の "○○"をメモする
 ```
 ```BASH:nvidiaドライバのインストール
 $ sudo add-apt-repository ppa:graphics-drivers/ppa
 $ sudo apt update
 $ sudo apt install nvidia-driver-525 # メモした"○○"をインストール（今回の場合は525をインストール）
 $ sudo reboot # 再起動すれば，nvidiaドライバが機能します．
 ```
#### 2. CUDAのインストール（cuda11.6をインストールします）
 - [CUDA Toolkit 11.6 Update 2 Downloads](https://developer.nvidia.com/cuda-11-6-2-download-archive)を参考にインストールします．
 - Select Target Platformは以下を選択
   - Architecture: x86_64
   - Distribution: Ubuntu
   - Version: 20.04
   - Installer Type: deb(local)
 - ただし，cuda-toolkitをインストールします．
 ```BASH:CUDAをインストール（最後だけ注意）
 $ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
 $ sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
 $ wget https://developer.download.nvidia.com/compute/cuda/11.6.2/local_installers/cuda-repo-ubuntu2004-11-6-local_11.6.2-510.47.03-1_amd64.deb
 $ sudo dpkg -i cuda-repo-ubuntu2004-11-6-local_11.6.2-510.47.03-1_amd64.deb
 $ sudo apt-key add /var/cuda-repo-ubuntu2004-11-6-local/7fa2af80.pub
 $ sudo apt update
 $ sudo apt install cuda-toolkit-11-6
 ```
 ```BASH:CUDAのパスを通す
 $ vim .bashrc
 ```
 ```.bashrcの最後に以下を記載する
 export PATH="/usr/local/cuda/bin:$PATH"
 export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
 ```
 ```BASH:設定を反映させる
 $ source .bashrc
 $ nvcc -V # このコマンドが実行できればOK
 ```
#### 3. OpenSfMのインストール
 ```BASH:pyenvのインストール（OpenSfMのbuildでPython3.7系を使用するため）
 $ sudo apt install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git
 $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
 ```
 ```BASH:pyenvのパスを通す
 $ vim .bashrc
 ```
 ```.bashrcの最後に以下を記載する
 export PYENV_ROOT="$HOME/.pyenv"
 command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
 eval "$(pyenv init -)"
 ```
 ```BASH:設定を反映させる
 $ source .bashrc
 $ pyenv -v # このコマンドが実行できればOK
 ```
 ```BASH:python3.7系のインストール
 $ pyenv install --list # どのバージョンがインストールできるか確認する
 $ pyenv install 3.7.16
 ```
 ```BASH:作業ディレクトリを作成する
 # 作業ディレクトリ(3d)を作成し，そのディレクトリ以下はpython3.7.16で動作するようにする
 $ mkdir 3d
 $ cd 3d
 $ pyenv local 3.7.16 # ディレクトリ(3d)以下はpython3.7.16でpythonを動かす
 $ pyenv versions # python3.7.16が使用されているかどうかを確認する
 ```
 ```BASH:OpenSfMに必要なパッケージをインストールする
 $ sudo apt install cmake libatlas-base-dev libeigen3-dev libgoogle-glog-dev libopencv-dev libsuitesparse-dev python3-dev python3-numpy python3-opencv python3-pip python3-pyproj python3-scipy python3-yaml meshlab
 ```
 ```BASH:ceres-solverをインストールする（3dディレクトリで行うこと）
 $ curl -L http://ceres-solver.org/ceres-solver-1.14.0.tar.gz | tar xz && cd ceres-solver-1.14.0 && mkdir -p build && cd build
 $ cmake .. -DCMAKE_C_FLAGS=-fPIC -DCMAKE_CXX_FLAGS=-fPIC -DBUILD_EXAMPLES=OFF -DBUILD_TESTING=OFF
 $ make -j32
 $ sudo make install
 $ cd ../../
 ```
 ```BASH:opengvをインストールする（3dディレクトリで行うこと）
 $ git clone https://github.com/paulinus/opengv.git && cd opengv && git submodule update --init --recursive && mkdir -p build && cd build
 $ cmake .. -DBUILD_TESTS=OFF -DBUILD_PYTHON=ON -DPYBIND11_PYTHON_VERSION=3.7 -DPYTHON_INSTALL_DIR=~/.pyenv/versions/3.7.16/lib/python3.7/site-packages/
 $ make -j32
 $ sudo make install
 $ cd ../../
 ```
 ```BASH:OpenSfM(v0.5.1)をインストール（3dディレクトリで行うこと）
 $ git clone --recursive https://github.com/mapillary/OpenSfM -b v0.5.1
 $ cd OpenSfM
 $ pip3 install -U pip setuptools
 $ pip3 install opencv-python opencv-contrib-python wheel
 $ pip3 install -r requirements.txt
 $ python3 setup.py build # エラーが出なければOK
 $ cd ../
 ```
#### 4. OpenMVSのインストール
 ```BASH:OpenSfMに必要なパッケージをインストールする
 $ sudo apt install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev
 ```
 ```BASH:Eigen(3.2)をインストールする（3dディレクトリで行うこと）
 $ git clone https://gitlab.com/libeigen/eigen.git --branch 3.2
 $ cd eigen
 $ mkdir build && cd build
 $ cmake . ..
 $ make -j32
 $ sudo make install
 $ cd ../../
 ```
 ```BASH:必要なパッケージをインストールする
 # Boostのインストール
 $ sudo apt install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
 # OpenCVのインストール
 $ sudo apt install libopencv-dev
 # CGALのインストール
 $ sudo apt install libcgal-dev libcgal-qt5-dev
 # VCGLibのインストール（3dディレクトリで行うこと）
 $ git clone -b master https://github.com/cdcseacave/VCG.git vcglib
 $ cd vcglib
 $ git checkout 88f12f212a1645d1fa6416592a434c29e63b57f0
 $ cd ../
 # GLFW3のインストール
 $ sudo apt install freeglut3-dev libglew-dev libglfw3-dev
 ```
 ```BASH:OpenMVSのインストール
 $ git clone -b v1.1.1 https://github.com/cdcseacave/openMVS.git
 $ cd openMVS
 $ mkdir openMVS_build && cd openMVS_build
 $ cmake . .. -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="~/3d/vcglib"
 $ make -j32 # エラーが出なければOK
 $ sudo make install
 $ cd # COLMAPインストールのため，ホームディレクトリに移動する
 ```
#### 5. COLMAPのインストール
- ホームディレクトリで行っています．
 ```BASH:必要なパッケージをインストールする
 $ sudo apt install git cmake build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libboost-test-dev libeigen3-dev libsuitesparse-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgflags-dev libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-dev libcgal-qt5-dev libatlas-base-dev libsuitesparse-dev
 ```
 ```BASH:cmakeをアップデートする
 $ sudo apt purge cmake 
 $ sudo apt autoremove
 $ wget https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1.tar.gz
 $ tar xvf cmake-3.25.1.tar.gz
 $ cd cmake-3.25.1/
 $ ./bootstrap && make -j32 && sudo make install
 $ hash -r # bashの場合，このコマンドを行う
 $ cmake --version # 3.25.1かどうかを確認する
 $ cd
 ```
 ```BASH:最新版のceres-solverをインストールする（OpenSfMを先にインストールしておくこと）
 $ git clone https://ceres-solver.googlesource.com/ceres-solver
 $ cd ceres-solver
 $ git checkout $(git describe --tags)
 $ mkdir build && cd build
 $ cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
 $ make -j32
 $ sudo make install
 $ cd
 ```
 ```BASH:Eigen(3.3.7)をインストールする（OpenMVSを先にインストールしておくこと）
 $ git clone https://gitlab.com/libeigen/eigen.git --branch 3.3.7
 $ cd eigen
 $ mkdir build && cd build
 $ cmake . ..
 $ make -j32
 $ sudo make install
 $ cd
 ```
 ```BASH:COLMAPをインストールする
 $ git clone https://github.com/colmap/colmap.git --branch 3.7
 $ cd colmap
 $ git checkout 079518040b4437c1d1b8067f0167be3fd1a4157b
 $ mkdir build && cd build
 $ cmake ..
 $ make -j32 # エラーが出なければOK
 $ sudo make install
 $ cd
 ```

ここまでエラーが出なければ，環境構築成功となります．
このオープンソースの使用方法に関しては，
次ページ（[オープンソースによるフォトグラメトリの実行方法](https://qiita.com/keita-n-ac/items/b1f0d36c489d30b52979)）に記載しました．