저는 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)
위의 부분을 주석처리 했습니다.
자 이제 여기서 저는 또 다른 에러가 나타났는데요.
오류 메시지는 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 이 잘 보입니다.