動態

詳情 返回 返回

3D Gaussian splatting 03: 用户數據訓練和結果查看 - 動態 詳情

目錄

  • 3D Gaussian splatting 01: 環境搭建
  • 3D Gaussian splatting 02: 快速評估
  • 3D Gaussian splatting 03: 用户數據訓練和結果查看
  • 3D Gaussian splatting 04: 代碼閲讀-提取相機位姿和稀疏點雲
  • 3D Gaussian splatting 05: 代碼閲讀-訓練整體流程
  • 3D Gaussian splatting 06: 代碼閲讀-訓練參數
  • 3D Gaussian splatting 07: 代碼閲讀-訓練載入數據和保存結果
  • 3D Gaussian splatting 08: 自建模型展示網頁

準備圖片集

採集方式

用於訓練的圖片集採集有兩種方式, 一種是使用相機從不同角度拍照, 另一種是拍視頻後逐幀提取. 兩種方式各有利弊, 拍照分辨率更高, 方便控制光圈,快門和白平衡, 但是拍照時較難控制好角度可能會造成部分交疊區域過小, 視頻比較容易實現連續的畫面移動, 保證交疊區域, 但是大多數手機沒法手動控制視頻錄製過程的光圈和白平衡, 並且視頻的分辨率大多數是通過插值填充的, 拍攝1080p視頻時, 實際有效像素並沒有1080p.

我自己的使用經驗是, 用視頻方式提取的幀訓練結果更穩定.

圖片數量

另外一方面是圖片集的數量, 為了保證幀之間特徵點的交疊, 一般按角度每 3 - 4 度一幀比較合適, 也就是從水平視角恢復一個3D對象需要約 90 - 120 張圖, 低於90張圖可能會影響訓練效果. 另外如果訓練時加--eval參數做評估, 需要再增加 15% 的圖片, 因為默認會將 1/8 的圖片劃分作為測試集, 訓練集只有 7/8.

圖片分辨率

圖片分辨率跟你的顯卡顯存有關. 16G的顯存訓練 1920x1080分辨率大概率是不夠的, 在 train.py 那一步會報torch.OutOfMemoryError: CUDA out of memory.錯誤. 如果出現這種錯誤,

  1. 把分辨率適當降一點. 實際測試訓練1366x768的分辨率只需要8GB的顯存, 如果用1024x576分辨率訓練速度較快且細節保留還不錯.
  2. 在訓練時使用--data_device cpu參數, 可以將圖片數據加在到系統內存避免佔用顯存, 會稍微影響訓練速度.

環境特徵點數量

在轉換時, 要成功提取稀疏點雲需要有足夠多和密集的特徵點, 否則構建點雲會失敗, 現象就是 convert 這一步之後僅僅保留了十個以內的圖片, 剩下的都因為無法匹配而丟棄了.

避免以下情況可以提高特徵點的數量和密度

  • 場景中存在大片的純色或者毫無紋路的色塊, 例如四周的白牆
  • 場景中存在光滑反光的物體, 因為反光物體會導致從各個角度看到的色彩是不一致的, 會導致特徵匹配失敗
  • 場景中物品很少, 例如一個純色或者紋路很淺的大桌面, 上面沒什麼物品
  • 視頻拍攝過程中失去焦點, 當焦點未對準要拍攝的對象時, 圖片中色彩是模糊的, 會造成特徵點提取困難, 對後續的迭代對比也會有影響.
  • 視頻拍攝中抖動和快速移動鏡頭造成的模糊, 也會造成特徵點提取困難.

從視頻提取幀序列

方式一: 使用 python 代碼

from pathlib import Path
import cv2

work_path = '/home/milton/temp/input'
target_height = 720

imgpath = Path(work_path)
imgpath.mkdir(exist_ok = True)

cap = cv2.VideoCapture('/home/milton/temp/557 Marksbury Road Pickering Open House Video Tour.mp4')

frame_no = 0
while cap.isOpened():
    ret, frame = cap.read()

    if ret:
        # 視頻是 60fps, 每秒取3幀, 因此每20幀取一幀
        if frame_no % 20 == 0:
            original_height, original_width = frame.shape[:2]
            scaling_factor = target_height / original_height
            target_width = int(original_width * scaling_factor)

            resized_frame = cv2.resize(
                frame, 
                (target_width, target_height), 
                interpolation=cv2.INTER_AREA)
            # {:0>5}是固定5位, 左邊填充0
            target = work_path + '/{:0>5}.jpg'.format((int)(frame_no / 20))
            print(target)
            cv2.imwrite(target, resized_frame)
        frame_no += 1
    else:
        cap.release()
        break

print('done')

方式二: 使用 ffmpeg 提取

使用 ffmpeg 將視頻幀按固定間隔抽取為圖片, 下面的命令將視頻幀以較小的壓縮率轉換為jpg文件, FRAMES_PER_SEC是每秒抽取的幀數.

ffmpeg -i <PATH_VIDEO> -qscale:v 1 -qmin 1 -vf fps=<FRAMES_PER_SEC> <PATH_OUTPUT>/%05d.jpg

這樣序號是從00001開始的, 如果要從00000開始, 要加上參數-start_number 0

ffmpeg -i <PATH_VIDEO> -qscale:v 1 -qmin 1 -vf fps=<FRAMES_PER_SEC> -start_number 0 <PATH_OUTPUT>/%05d.jpg

如果需要縮小圖片(按比例縮小), 需要加上-vf scale=1366:-1參數, 這個意思是將寬度變為 1366,高度按比例調整, 如果按固定高度調整, 則是-vf scale=-1:768, 例如

ffmpeg -i 557VideoTour.mp4 -vf fps=2,scale=1366:-1 -start_number 0 input/%05d.png

Convert 提取特徵和點雲

創建一個目錄, 例如 source_data, 在下面創建一個子目錄 input, 這個 input 目錄名稱是固定的, 不能改. 將圖片序列放到這個input目錄下, 執行提取命令

python ./convert.py -s ~/work/source_data/

這一步執行是通過 colmap 實現的, 依次執行 feature extraction, exhaustive feature matching, reconstruction, 如果使用cpu處理, 需要加上--no_gpu參數, 例如

python ./convert.py --no_gpu -s ~/work/source_data/

可以打開 convert.py 查看其它的選項. 在 matching 階段會使顯卡滿負荷, 這一階段如果使用CPU, 比使用支持CUDA的顯卡速度上慢一個數量級, 使用 RTX2080 TI 匹配一個block 6秒, 對應的在 E5 2673 V3 上需要差不多 60秒.

這一步結束後會在input同一級目錄下, 產生 distored, images, sparse, stereo 等目錄, 其中訓練要用到的是 images 和 sparse 這兩個目錄.

Train 訓練

訓練和之前快速評估時的方式是一樣的, 用上一步提取的數據進行訓練

python train.py -s [素材路徑]
# e.g.
python train.py -s ~/work/source_data/
  • 如果打算訓練後做評估, 需要加上--eval參數, 會自動提取1/8的圖片作為測試集
  • 參考上一節, 可以用--optimizer_type sparse_adam加速訓練過程
  • 如果圖片較多分辨率比較高, 可以用--data_device cpu參數減小顯存佔用

View 查看

poly.cam 網頁工具

快速查看可以用第三方的網頁工具, 例如 https://poly.cam/tools/gaussian-splatting

自採集數據效果演示

訪問下面的鏈接會下載幾十MB的文件, 如果帶寬較小需要耐心等待. 有時候頁面資源在牆內會被攔截, 需要梯子上網.

  • 美團單車(正常光線) https://poly.cam/capture/53684645-e0d4-413d-b979-834579f5e793
  • 美團單車(強陽光) https://poly.cam/capture/01a401a3-945a-4b8e-9181-068683b25b0f

SIBR Viewer

網頁工具比較方便, 但是預覽效果不如項目自帶的工具 SIBR Viewer. SIBR Viewer 需要編譯安裝, 編譯過程需要nvcc, 如果是不支持CUDA的顯卡, 這部分就不用嘗試了. 代碼對顯卡CUDA架構版本也有要求, 要 CUDA_ARCHITECTURE >= 7.x, 所以在 RTX10xx, P104-100, P106 上不能正常運行, 需要的顯卡型號最低為 GTX16xx, RTX20xx, 低於這些型號的也不用嘗試了.

編譯安裝

先安裝依賴

sudo apt install libglew-dev libassimp-dev libboost-all-dev libgtk-3-dev libopencv-dev libglfw3-dev libavdevice-dev libavcodec-dev libeigen3-dev libxxf86vm-dev libembree-dev

預編譯, 這一步如果有錯誤, 檢查上面的依賴是否已經安裝

cmake -Bbuild . -DCMAKE_BUILD_TYPE=Release

編譯並安裝到項目路徑下, -j24對應24核CPU, 設成和當前環境CPU核數一致

cmake --build build -j24 --target install

安裝後, 可執行文件會安裝到 SIBR_viewers/install/bin/ 目錄下,

使用

通過命令行啓動 SIBR Viewer 查看訓練結果

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m [訓練結果目錄]

例如

./SIBR_viewers/install/bin/SIBR_gaussianViewer_app -m ./output/0dbedfba-8/

界面需要雙手操作, 左手 W, E, F, A, S, D 控制左右前後上下平移, 右手 U, I, O, J, K, L 控制左右上下順時逆時旋轉. 如果覺得平移速度慢, 可以在 Camera Point VIew 中, 勾選 Acceleration

splatviz

對於架構低於7.x的舊Nvidia顯卡, 可以使用 splatviz 這個工具本地查看訓練結果.

倉庫地址 https://github.com/Florian-Barthel/splatviz

這是一個主體代碼為 python 的項目, 可以喚起GUI界面在本地快速查看ply文件, 可以查看, 可以掛載到3d gaussian的訓練過程, 可以設定位置距離拍攝自動306度旋轉的視頻, 還可以設置gaussian參數debug, 功能比較豐富.

安裝

檢出倉庫

git clone https://github.com/Florian-Barthel/splatviz.git --recursive

倉庫首頁的安裝提示是不能用的, 因為裏面基於的是 CUDA 11.8, 和我係統的CUDA版本(12.6)不一致, 用conda創建環境會報不兼容, 所以後來轉手動安裝了

因為和 gaussian-splatting 一樣要使用 CUDA Toolkit 和 pytorch, 都是上G的大塊頭, 所以直接使用了 gaussian-splatting 的 conda 環境, 在這個基礎上安裝其它模塊.

基礎環境是

NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4

python=3.10.12
torch                       2.7.0
torchaudio                  2.7.0
torchvision                 0.22.0
opencv-contrib-python       4.11.0.86
opencv-python               4.11.0.86
cuda-toolkit                12.4

過程中安裝的模塊, 未指定的默認安裝最新版

pip install click
pip install imgui-bundle==1.5.2 (安裝默認的1.6.2會報錯)
pip install imgui==2.0.0
pip install imageio
pip install pyyaml
pip install pandas
pip install imagecodecs
pip install scipy
pip install requests
pip install gputil
pip install pynvml  如果不使用 performance widget, 可以不裝
pip install imageio-ffmpeg 如果不使用 ideo widget, 可以不裝

安裝項目內的子模塊

  • gaussian-splatting/submodules/diff-gaussian-rasterization
pip install gaussian-splatting/submodules/diff-gaussian-rasterization
  • gaussian-splatting/submodules/simple-knn
    因為在 gaussian-splatting 中已經安裝了 simple-knn 模塊, 所以這裏沒再安裝

使用

--data_path指定路徑, 注意這裏只需要給目錄, 如果直接指定文件會報錯

python run_main.py --data_path=../gaussian-splatting/output/7f1a841f-4/point_cloud/iteration_7000/

在 Camera Widget裏面可以設置兩種視角,

  • Orbit視角是位置固定的, 只能左右上下(pitch and yaw, no roll)查看,
  • WASD視角的位置可以調整, 操作按鍵為 A左平移, D右平移, W前進, D後退, Q上平移,E下平移, 用鼠標按住左鍵移動旋轉視角.

評估

同上一節, 略.

user avatar ENchantedN 頭像
點贊 1 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.