๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ˜ŽAI/3D Reconstruction

[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 ์ด ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค.