본문 바로가기
AI/3D reconstruction & generation

[Code Build][Ubuntu] 3D Gaussian splatting

by SolaKim 2025. 1. 8.

 

결과물

 

 

저는 dataset 구축과 train 은 vessl server (ubuntu) 환경에서 진행 했고,
viewer 는 exe 로 실행해야되기 때문에 window 환경에서 진행 했습니다.

gaussian splatting 의 환경사항은 다음과 같습니다.

name: gaussian_splatting
channels:
  - pytorch
  - conda-forge
  - defaults
dependencies:
  - cudatoolkit=11.6
  - plyfile
  - python=3.7.13
  - pip=22.3.1
  - pytorch=1.12.1
  - torchaudio=0.12.1
  - torchvision=0.13.1
  - tqdm
  - pip:
    - submodules/diff-gaussian-rasterization
    - submodules/simple-knn
    - submodules/fused-ssim
    - opencv-python
    - joblib

 

[Ubuntu Environment]
Ubuntu 20.04
Cuda 11.4
GPU: NVIDIA RTX 3090 (RAM 24GB)

 

[Window Environment]
Window 10
cuda 11.8
GPU: NVIDIA GeForce RTX 3090  (RAM 24GB)

 

 

일단 ubuntu vessl 서버에서부터 작업을 시작했습니다.

git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive

위 명령어 입력해서 git clone 했습니다.

conda env create --file environment.yml
conda activate gaussian_splatting

 

 

gaussian splatting 모델에 input 으로 넣어야하는 데이터는 다음 두개입니다.

1. 다각도에서 수집한 데이터 (images)

2. 이미지별 공간 정보 (sparse, aka pointscloud.ply)

사용자가 mp4 영상을 집어넣으면 ffmpeg, colmap 을 사용하여 images/sparse 형태로 convert 할 수 있습니다.

"mp4 to images to sparse"

 

✔ ffmpeg: 동영상 mp4 를 이미지 프레임 시퀀스로 변환
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
다음과 같은 명령어를 사용하여 동영상의 각 프레임을 개별 이미지 파일로 추출할 수 있습니다.

✔ colmap: structure-from-motion (SfM) 및 multi-view stero (MVS) 알고리즘을 사용하여 이미지 간의 특징을 매치하여 카메라의 위치와 3d 점군을 계산합니다. 
이는 이미지에서 sparse point cloud (희소점군)을 생성하는 역할을 합니다.

 

1. FFmpeg

첫 번째 input 데이터를 생성하기 위해 FFmpeg 를 사용할 수 있습니다.

FFmpeg 의 경우 ubuntu 환경에서는 apt-get 을 사용하여 install 할 수 있습니다.

설치된 모든 ffmpeg 를 제거하고 reinstall 해주지 않으면 다음과 같은 에러가 발생합니다.

"ffmpeg error while loading shared libraries libopenh264.so.5 cannot open shared object file"

1. 설치된 모든 ffmpeg 를 제거

apt-get remove ffmpeg
sudo apt-get purge ffmpeg

2. anaconda 에서 ffmpeg 모듈을 삭제

conda remove ffmpeg

3. 재설치

apt-get install ffmpeg

4. version 확인

ffmpeg -version

ffmpeg version check

더보기
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100

 

2. COLMAP

apt-get update
apt-get install colmap

colmap -h 명령어를 통해서 version 을 check 할 수 있습니다.

저의 경우는 "COLMAP 3.6 -- Structure-from-Motion and Multi-View Stereo" 버전이었습니다.

 

3. Imagemagick

convert -version
apt install imagemagick

Version: ImageMagick 6.9.10-23 Q16 x86_64 20190101 

 

 

자 이제 다운받을 software 는 다 다운 받은 것 같습니다.

gaussian-splatting 을 root 폴더라고 하고 gaussian splatting 을 만들어봅시다.

1. 개인 영상 파일을 준비해봅시다.

gaussian-splatting/data/my_video 폴더에 my_video_input.mp4 를 넣습니다.

그리고 gaussian-splatting/data/my_video/input 폴더를 만들어줍니다.

 

2. ffmpeg 사용하여 영상을 다각도의 이미지 형태로 만듭니다.

cd gaussian-splatting/data/my_video/input
ffmpeg -i gaussian-splatting/data/my_video/my_video_input.mp4 -qscale:v 1 -qmin 1 -vf fps=10 %04d.jpg

실행해보면 data/my_video 에 images 라는 폴더가 생기고, 거기에 다각도의 이미지가 frame 별로 저장되어있습니다.

저는 약 160 장 정도 저장되어있네요.

 

3. colmap 을 사용하여 sparse 정보를 만듭니다.

cd gaussian-splatting
python convert.py -s data/my_video

이렇게 하면 보통의 window 에서는 될텐데요, 저는 dataset 구축을 vessl ubuntu sever 환경에서 진행하고 있기 때문에 따로 gui 가 없다고 에러가 뜹니다....

그래서 저는 가상 디스플레이를 생성하여 진행하였습니다.

apt update
apt install xvfb

xvfb-run -a python convert.py -s data/my_video

xvfb-run 은 가상 디스플레이 환경을 자동으로 생성하여 프로그램을 실행합니다.

 

그 다음 에러:
에러 메시지를 보면 COLMAP의 Mapper 단계에서 옵션 --Mapper.ba_global_function_tolerance를 인식하지 못했다는 오류가 발생했습니다. 이는 사용 중인 COLMAP 버전이 해당 옵션을 지원하지 않기 때문입니다.

--Mapper.ba_global_function_tolerance는 특정 최적화 조건과 관련된 옵션입니다. COLMAP의 기본 설정으로도 충분히 좋은 결과를 얻을 수 있으므로 필요하지 않다고 판단했기 때문에 제거 후 진행 하였습니다.

convert.py 를 아래와 같이 수정하였습니다. 

    ### Bundle adjustment
    # The default Mapper tolerance is unnecessarily large,
    # decreasing it speeds up bundle adjustment steps.
    mapper_cmd = (colmap_command + " mapper \
        --database_path " + args.source_path + "/distorted/database.db \
        --image_path "  + args.source_path + "/input \
        --output_path "  + args.source_path )
        # + "/distorted/sparse \
        # --Mapper.ba_global_function_tolerance=0.000001")
    exit_code = os.system(mapper_cmd)
    if exit_code != 0:
        logging.error(f"Mapper failed with code {exit_code}. Exiting.")
        exit(exit_code)
        # + "/distorted/sparse \
        # --Mapper.ba_global_function_tolerance=0.000001")

위의 부분을 주석처리 했습니다.

 

자 이제 여기서 저는 또 다른 에러가 나타났는데요. 

오류 메시지는 data/my_video/distorted/sparse/0 경로에 필요한 3D 재구성 데이터 파일이 없다고 보고 있었습니다.

하지만 data/my_video/0/에는 cameras.bin, images.bin, points3D.bin, project.ini 등이 존재했습니다.

이 문제는 경로 설정 문제인것 같았습니다.

convert.py 를 보면 

files = os.listdir(args.source_path + "/sparse")
os.makedirs(args.source_path + "/sparse/0", exist_ok=True)
# Copy each file from the source directory to the destination directory
for file in files:
    if file == '0':
        continue
    source_file = os.path.join(args.source_path, "sparse", file)
    destination_file = os.path.join(args.source_path, "sparse", "0", file)
    shutil.move(source_file, destination_file)

if(args.resize):
    print("Copying and resizing...")

이 부분에서 해결 방법

1. convert.py에 입력 경로 확인
convert.py 코드에서 프로그램이 실제로 어떤 경로를 사용하고 있는지 확인해 보세요. distorted/sparse/0가 자동 생성된 경로일 수 있습니다.

2. convert.py에서 distorted/sparse/0 경로 대신 data/my_video/0를 참조하도록 설정합니다:

python convert.py -s data/my_video/0

 

저의 경우에는 data/my_video/distorted/0 폴더를 data/my_video/distorted/sparse/0으로 옮겼습니다.

사실 convert.py 에서 경로를 바꿔줘야하는데, 건들이기 무서워서요...

 

xvfb-run -a python convert.py -s data/my_video

 

그렇게 되면 data/my_video 경로에 distorted, sparse 폴더와 colmap 의 sh 파일 등등이 저장된것을 확인할 수 있습니다.

 

학습을 진행합시다.

cd gaussian-splatting
python train.py -s data/my-video

위의 명령어를 다시 실행해주면 gaussian-splatting 폴더에 숫자와 영어가 섞인 제목의 폴더가 만들어집니다.

해당 폴더를 저는 my_video 로 이름을 변경해주었습니다.

 

자 이제 viewer 로 gaussian-splatting 이 잘 구현되었는지 확인해봅시다.

viewer 는 exe 파일이기 때문에 ubuntu 환경에서 실행할 수 없습니다.

따라서, 해당 output 폴더를 window 컴퓨터로 옮긴 후 viewer 를 실행해서 보도록 하겠습니다.

 

scp -P (포트번호) -r (사용자 id)@(ssh ip):/(경로)/gaussian-splatting/output/my_video .

 

그리고 나서 window 에 환경설정을 동일하게 해준 뒤,  window 컴퓨터에 viewer 를 다운받아야합니다.

- link 에 들어가서, Pre-built Windows Binaries 탭의 here를 눌러 다운받습니다.
- zip 해제한 후, (root 폴더)/viewer 폴더로 이동합니다.

cd (root 폴더)/viewers/bin
SIBR_gaussianViewer_app.exe -m (root 폴더)/output/my_video

이후 위와 같이 명령어를 입력하면, gaussian_splatting 이 잘 보입니다.