オープンソースフォトグラメトリを実行するための環境構築（2024年3月版）

### はじめに
この記事は，Ubuntu系の計算機にオープンソースの
フォトグラメトリを行う環境を構築する手順の記載となります．
各オープンソースの最新版で環境構築できたので，備忘録として残しておきます．
昨年記事: [オープンソースによるフォトグラメトリを実行するための環境構築](https://qiita.com/keita-n-ac/items/06f4214c7ae3292c5e44)

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

### 計算機スペック
+ OS: LinuxMint21.3（Ubuntu22.04相当）で環境構築を行います
+ フォトグラメトリに使用する計算機のCPUとGPUは高スペックであることが望ましい（計算時間がかかります．）
+ CPUはamd64プロセッサ(intelやryzenで大丈夫かと，arm64系は多分インストールできません．）
+ GPUはGeForce RTX 3080 Tiを使用
+ CUDAが必須（NVIDIA系のGPUが必要になります．）
+ make -j32を使っています．（著者環境なので，CPUのコア数で適宜変更してください．）


### インストールするオープンソースフォトグラメトリライブラリ
+ [openMVS (https://github.com/cdcseacave/openMVS)](https://github.com/cdcseacave/openMVS)
+ [COLMAP (https://colmap.github.io/)](https://colmap.github.io/)
（OpenSfMは更新されていないようなので･･･）

###  クリーンインストールした状態からの環境構築手順
- 必要に応じて適宜変更して行ってください．
#### 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 # recommended表示の nvidia-driver-○○ の "○○"をメモする
 ```
 ```BASH:nvidiaドライバのインストール
 $ sudo add-apt-repository ppa:graphics-drivers/ppa
 $ sudo apt update
 $ sudo apt install nvidia-driver-535 # メモした"○○"をインストール（今回の場合は535をインストール）
 $ sudo reboot # 再起動すれば，nvidiaドライバが機能します．
 ```

#### 2. CUDAのインストール（cuda12.1をインストールします，別件で著者はPyTorchを使うため）
 - [CUDA Toolkit 12.1 Update 1 Downloads](https://developer.nvidia.com/cuda-12-1-1-download-archive)を参考にインストールします．
 - Select Target Platformは以下を選択
   - Operating System: Linux
   - Architecture: x86_64
   - Distribution: Ubuntu
   - Version: 22.04
   - Installer Type: deb(local)
 - ただし，cuda-toolkitをインストールします．
 ```BASH:CUDAをインストール（最後だけ注意）
 $ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
 $ sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
 $ wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda-repo-ubuntu2204-12-1-local_12.1.1-530.30.02-1_amd64.deb
 $ sudo dpkg -i cuda-repo-ubuntu2204-12-1-local_12.1.1-530.30.02-1_amd64.deb
 $ sudo cp /var/cuda-repo-ubuntu2204-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
 $ sudo apt update
 $ sudo apt install cuda-toolkit-12-1
 ```
 ```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. OpenMVSのインストール（[参考サイト](https://www.kkaneko.jp/ai/ubuntu/ubuntu_openmvs.html)）
```BASH:必要パッケージのインストール(Ceres Solver)
$ sudo apt install git cmake cmake-curses-gui cmake-gui build-essential gcc g++ make libtool texinfo dpkg-dev pkg-config libeigen3-dev libatlas-base-dev libsuitesparse-dev libgoogle-glog-dev libgflags-dev libsuitesparse-dev
```

```BASH:Ceres Solverのインストール（最新安定版を選択: 今回は2.2.0）
$ git clone https://ceres-solver.googlesource.com/ceres-solver -b 2.2.0
$ cd ceres-solver
$ mkdir build
$ cd build
$ cmake .. -DEIGENSPARSE=ON -DSUITESPARSE=ON -DSuiteSparse_AMD_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_CAMD_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_COLAMD_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_CCOLAMD_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_CHOLMOD_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_SPQR_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_Config_INCLUDE_DIR=/usr/include/suitesparse -DSuiteSparse_Config_LIBRARY=/usr/lib/x86_64-linux-gnu/libsuitesparseconfig.a
$ make -j32
$ sudo make install
$ cd
```
参考URL: [Ceres Solver](https://github.com/ceres-solver/ceres-solver/tags)


```BASH:必要パッケージのインストール(OpenMVS)
# Prepare and empty machine for building:
$ sudo apt install libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev

# Boost (Required)
$ sudo apt install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev

# OpenCV (Required)
$ sudo apt install libopencv-dev

# CGAL (Required)
$ sudo apt install libcgal-dev libcgal-qt5-dev

# VCGLib (Required)
$ cd /usr/local/
$ sudo git clone https://github.com/cdcseacave/VCG.git vcglib
$ sudo chown -R $USER vcglib
$ cd

# GLFW3 (Optional)
$ sudo apt install freeglut3-dev libglew-dev libglfw3-dev

# OpenMVS
$ sudo apt install python3-dev
$ git clone https://github.com/cdcseacave/openMVS.git -b v2.3.0
$ mkdir openMVS_build 
$ cd openMVS_build
$ cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="/usr/local/vcglib"
$ make -j32 
$ sudo make install
$ cd
```
参考URL: [OpenMVS Building](https://github.com/cdcseacave/openMVS/wiki/Building/09f3611b6b013036fddd342f26484681570d5c27)

 ```BASH:OpenMVSのパスを通す
 $ vim .bashrc
 ```
 ```.bashrcのPATHを以下の内容に変更する
 export PATH="/usr/local/cuda/bin:/usr/local/bin/OpenMVS:$PATH"
 ```
 ```BASH:設定を反映させる
 $ source .bashrc
 ```

#### 4. COLMAPのインストール
```BASH:必要パッケージのインストール
$ sudo apt install git cmake ninja-build build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libeigen3-dev libflann-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgtest-dev libsqlite3-dev libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-dev libceres-dev
```
```BASH:コンパイラのインストール
$ sudo apt install gcc-10 g++-10
```
```BASH:コンパイラのパスを通す
$ vim .bashrc
```
```.bashrcの最後に以下の内容を追記する
export CC=/usr/bin/gcc-10
export CXX=/usr/bin/g++-10
export CUDAHOSTCXX=/usr/bin/g++-10
```
```BASH:設定を反映させる
$ source .bashrc
```
```BASH:必要パッケージのインストール
$ sudo apt install nvidia-cuda-toolkit nvidia-cuda-toolkit-gcc libcgal-qt5-dev
```

```BASH:COLMAPのインストール
$ git clone https://github.com/colmap/colmap.git -b 3.9
$ cd colmap
$ vim CMakeLists.txt
```

```BASH:CMakeLists.txtの最初の1行目に以下を追記する
set(CMAKE_CUDA_COMPILER "/usr/local/cuda/bin/nvcc")
```
```BASH:COLMAPのインストール（続き）
$ mkdir build
$ cd build
```

使用するGPUのCompute Capabilityを調べておく
- 参考URL: [https://www.hpc.co.jp/library/commentary/gpu-compute-capability-summary/](https://www.hpc.co.jp/library/commentary/gpu-compute-capability-summary/) 
- 著者の場合: GeForce RTX 3080 Tiなので8.6 

```BASH:COLMAPのインストール（続き）
$ cmake .. -GNinja -DCMAKE_CUDA_ARCHITECTURES=86
# GeForce RTX 3080 TiのCompute Capability 8.6の小数点を除去した値を指定
# GeForce RTX 4090使用の場合，-DCMAKE_CUDA_ARCHITECTURES=89 となる
$ ninja
$ sudo ninja install
$ cd
```
#### 5. COLMAP，OpenMVSの実行例
```BASH:OpenMVSのサンプル画像をダウンロードするしてフォトグラメトリを実行
$ git clone https://github.com/cdcseacave/openMVS_sample.git
$ cd openMVS_sample
$ rm -rf !(images) # imagesフォルダ以外すべて削除する
# COLMAPの処理
$ colmap feature_extractor --database_path database.db --image_path ./images
$ colmap exhaustive_matcher --database_path database.db
$ mkdir sparse
$ mkdir dense
$ colmap mapper --database_path database.db --image_path ./images --output_path ./sparse
$ colmap image_undistorter --image_path ./images --input_path ./sparse/0 --output_path ./dense
# OpenMVSの処理
$ InterfaceCOLMAP -i ./dense -o scene.mvs
$ DensifyPointCloud ./scene.mvs
$ ReconstructMesh ./scene_dense.mvs
$ TextureMesh -i scene_dense.mvs --mesh-file scene_dense_mesh.ply
$ Viewer -i scene_dense_texture.ply
# Ctrl-CでViewerを止める
```