條件
已有場(chǎng)景數(shù)據(jù):
videos中含34個(gè)不同視角拍攝的同一動(dòng)作視頻
cams中為34個(gè)不同視角對(duì)應(yīng)的相機(jī)參數(shù):內(nèi)外參+焦距
思考
如何利用動(dòng)態(tài)視頻 完成用于處理靜態(tài)場(chǎng)景的3D gaussian?
-
每個(gè)視角的對(duì)應(yīng)幀 -> 合成一個(gè)文件夾 即34張圖片 34個(gè)視角
-
暴力做法:?jiǎn)文恳曨l
看上去第一種比較靠譜一點(diǎn),試試就逝世(bu)
視頻轉(zhuǎn)幀
設(shè)定30fps
import cv2
import os
def extract_frames(video_path, output_folder):
# 打開(kāi)視頻文件
video = cv2.VideoCapture(video_path)
# 獲取視頻的幀率
fps = video.get(cv2.CAP_PROP_FPS)
# 計(jì)算幀間隔
frame_interval = round(fps / 30) # 每秒 30 幀
# 初始化幀計(jì)數(shù)器
frame_count = 0
# 逐幀讀取視頻并保存幀序列
while True:
ret, frame = video.read()
# 如果無(wú)法讀取到幀,則退出循環(huán)
if not ret:
break
# 按幀間隔保存幀
if frame_count % frame_interval == 0:
frame_filename = f"{output_folder}/{frame_count:05d}.jpg"
cv2.imwrite(frame_filename, frame)
frame_count += 1
# 釋放資源
video.release()
def process_videos(input_folder, output_folder):
# 遍歷輸入文件夾中的所有文件
for filename in os.listdir(input_folder):
# 檢查文件是否為視頻文件
if filename.endswith(".mp4"):
video_path = os.path.join(input_folder, filename)
video_name = os.path.splitext(filename)[0]
video_output_folder = os.path.join(output_folder, video_name)
# 創(chuàng)建視頻的輸出文件夾
os.makedirs(video_output_folder, exist_ok=True)
# 提取幀序列
extract_frames(video_path, video_output_folder)
幀處理
將不同視頻文件夾下相同命名的圖像放到一個(gè)新文件夾下。
結(jié)果:每個(gè)文件夾34張不同視角的同一時(shí)刻圖像。
import os
import shutil
def move_files_to_unique_folders(source_folder, destination_folder):
# 創(chuàng)建目標(biāo)文件夾
os.makedirs(destination_folder, exist_ok=True)
# 獲取源文件夾列表
source_folders = [f for f in os.listdir(source_folder) if os.path.isdir(os.path.join(source_folder, f))]
# 創(chuàng)建字典來(lái)存儲(chǔ)相同文件名(不帶后綴)和對(duì)應(yīng)的文件夾路徑
file_to_folder = {}
# 遍歷源文件夾列表
for folder_name in source_folders:
# 獲取源文件夾路徑
folder_path = os.path.join(source_folder, folder_name)
# 獲取源文件夾中的所有文件
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
# 遍歷文件列表
for filename in files:
# 分割文件名和文件擴(kuò)展名
file_name, file_ext = os.path.splitext(filename)
# 檢查文件名(不帶后綴)是否已經(jīng)在字典中存在
if file_name in file_to_folder:
# 如果文件名已經(jīng)存在,將文件移動(dòng)到對(duì)應(yīng)的文件夾中
destination_path = os.path.join(file_to_folder[file_name], f'{int(folder_name):05d}.jpg')
else:
# 如果文件名不存在,創(chuàng)建新的文件夾,并將文件移動(dòng)到該文件夾中
new_folder = os.path.join(destination_folder, file_name)
os.makedirs(new_folder, exist_ok=True)
file_to_folder[file_name] = new_folder
destination_path = os.path.join(new_folder, f'{int(folder_name):05d}.jpg')
source_path = os.path.join(folder_path, filename)
shutil.move(source_path, destination_path)
colmap生成位姿
點(diǎn)云生成過(guò)程參考:colmap簡(jiǎn)介及入門(mén)級(jí)使用
用meshlab打開(kāi)欣賞一下重建效果:
這不就有了嗎:
整理一下:
因?yàn)檫@里相機(jī)的格式不同于源碼,所以接下來(lái)去調(diào)整一下3D gaussian讀取數(shù)據(jù)的代碼
調(diào)整
因?yàn)橐呀?jīng)具備sparse和images,淺淺運(yùn)行看能不能直接跑,
然后,報(bào)錯(cuò):
if intr.model=="SIMPLE_PINHOLE":
focal_length_x = intr.params[0]
FovY = focal2fov(focal_length_x, height)
FovX = focal2fov(focal_length_x, width)
elif intr.model=="PINHOLE":
focal_length_x = intr.params[0]
focal_length_y = intr.params[1]
FovY = focal2fov(focal_length_y, height)
FovX = focal2fov(focal_length_x, width)
else:
assert False, "Colmap camera model not handled: only undistorted datasets (PINHOLE or SIMPLE_PINHOLE cameras) supported!"
看看intr.model到底是何方神圣:
原因:
在相機(jī)模型中,“Pinhole”(針孔)指的是一種理想化的相機(jī)模型,它假設(shè)光線通過(guò)一個(gè)小孔進(jìn)入相機(jī)并形成圖像。這種模型沒(méi)有考慮相機(jī)鏡頭的畸變效應(yīng)。
然而,實(shí)際的相機(jī)鏡頭會(huì)引入畸變,因此在實(shí)際應(yīng)用中,常常會(huì)采用更復(fù)雜的相機(jī)模型來(lái)考慮畸變效應(yīng)。其中一種常見(jiàn)的相機(jī)模型是"SIMPLE_RADIAL"(簡(jiǎn)單徑向畸變模型),它是一種簡(jiǎn)化的徑向畸變模型。
COLMAP 是一個(gè)開(kāi)源的三維重建軟件,它使用相機(jī)內(nèi)參和畸變參數(shù)進(jìn)行相機(jī)建模和三維重建。在 COLMAP 中,“SIMPLE_RADIAL” 可能是對(duì)針孔相機(jī)模型加入畸變模型的一種表示方式。
因此,盡管您的相機(jī)模型是針孔模型,但在 COLMAP 中,它可能以 “SIMPLE_RADIAL” 的形式進(jìn)行表示,以考慮徑向畸變效應(yīng)。請(qǐng)注意,具體的相機(jī)模型表示方式可能因軟件和工具的不同而有所差異。在使用 COLMAP 進(jìn)行相機(jī)標(biāo)定和三維重建時(shí),建議參考相關(guān)文檔以了解具體的相機(jī)模型表示方式和參數(shù)含義。
不管怎么說(shuō),先忽略徑向畸變,看看訓(xùn)練結(jié)果吧。
(發(fā)現(xiàn)可以在colmap時(shí)指定相機(jī)模型為PINHOLE,下一節(jié)進(jìn)行介紹)
在某些情況下,可以忽略徑向畸變效應(yīng)。特別是對(duì)于小焦距和高質(zhì)量的相機(jī)鏡頭,徑向畸變可能非常小,對(duì)圖像質(zhì)量的影響可以忽略不計(jì)。在這種情況下,可以使用簡(jiǎn)化的針孔相機(jī)模型,忽略徑向畸變效應(yīng)。
然而,在其他情況下,特別是對(duì)于大焦距鏡頭或低質(zhì)量的相機(jī)鏡頭,徑向畸變可能會(huì)較大地影響圖像質(zhì)量。在這種情況下,為了獲得更準(zhǔn)確的結(jié)果,應(yīng)該考慮徑向畸變效應(yīng)并使用適當(dāng)?shù)幕兡P汀?br> 在進(jìn)行相機(jī)標(biāo)定和計(jì)算機(jī)視覺(jué)應(yīng)用時(shí),通常建議考慮相機(jī)的畸變效應(yīng),以提高精確度和準(zhǔn)確性。通過(guò)進(jìn)行相機(jī)標(biāo)定,可以獲取相機(jī)的內(nèi)參矩陣和畸變參數(shù),進(jìn)而考慮徑向畸變效應(yīng)。
總之,是否可以忽略徑向畸變效應(yīng)取決于相機(jī)鏡頭的質(zhì)量和所需的精度。對(duì)于一些特定的應(yīng)用場(chǎng)景,可以根據(jù)實(shí)際情況決定是否忽略徑向畸變,但一般建議在相機(jī)模型中考慮徑向畸變效應(yīng),以獲得更準(zhǔn)確的結(jié)果。
于是手動(dòng)指定一下:
def read_intrinsics_binary(path_to_model_file):
"""
see: src/base/reconstruction.cc
void Reconstruction::WriteCamerasBinary(const std::string& path)
void Reconstruction::ReadCamerasBinary(const std::string& path)
"""
cameras = {}
with open(path_to_model_file, "rb") as fid:
num_cameras = read_next_bytes(fid, 8, "Q")[0]
for _ in range(num_cameras):
camera_properties = read_next_bytes(
fid, num_bytes=24, format_char_sequence="iiQQ")
camera_id = camera_properties[0]
model_id = camera_properties[1]
model_name = CAMERA_MODEL_IDS[1].model_name # 指定PINHOLE
# model_name = CAMERA_MODEL_IDS[camera_properties[1]].model_name
【colmap】已知相機(jī)位姿情況下進(jìn)行三維重建
PINHOLE
如上所述,在colmap生成相機(jī)位姿時(shí)輸入相機(jī)模型參數(shù)
COLMAP命令行
因?yàn)槭莣indows系統(tǒng),所以需要對(duì)其中的指令稍作調(diào)整:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-840739.html
D:\COLMAP-3.9.1-windows-cuda\COLMAP.bat automatic_reconstructor --workspace_path . --image_path ./images --sparse 1 --dense 0 --camera_model SIMPLE_PINHOLE
開(kāi)始訓(xùn)練
python train.py -s <path to COLMAP or NeRF Synthetic dataset> --eval # Train with train/test split
python render.py -m <path to trained model> # Generate renderings
python metrics.py -m <path to trained model> # Compute error metrics on renderings
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840739.html
到了這里,關(guān)于【pytorch】如何用自有數(shù)據(jù)集訓(xùn)練3D gaussian的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!