自己動(dòng)手使用AI技術(shù)實(shí)現(xiàn)數(shù)字內(nèi)容生產(chǎn)
背景
今年以來(lái)以chatgpt為代表的大模型的驚艷表現(xiàn)徹底點(diǎn)燃了AICG這個(gè)領(lǐng)域的。各類gpt,各種AI作圖產(chǎn)品如雨后春筍般出現(xiàn)。每個(gè)成功產(chǎn)品的背后都是一個(gè)個(gè)精妙的算法,本篇文章給大家詳細(xì)介紹下如何使用一個(gè)手機(jī)拍攝若干張同一場(chǎng)景的照片,然后合成新視角,生成視頻的流程與代碼。本文使用的技術(shù)是NeRF(Neural Radiance Fields),它是2020年以來(lái)出現(xiàn)的一種基于深度學(xué)習(xí)的3D重建方法,它通過(guò)學(xué)習(xí)場(chǎng)景的光線傳輸和輻射傳遞,能夠生成高質(zhì)量的場(chǎng)景渲染圖像和3D模型。關(guān)于它的原理與文獻(xiàn),我在最后有一個(gè)參考列表供大家學(xué)習(xí)。本文主要從代碼使用以及環(huán)境搭建的新角度介紹它。
環(huán)境搭建
environment.yml修改
本文使用的硬件環(huán)境是 GPU RTX3090,操作系統(tǒng)是windows 10.采用的軟件是開(kāi)源的NeRF實(shí)現(xiàn)(https://github.com/cjw531/nerf_tf2)。由于RTX 3090需要CUDA 11.0及以上版本的支持,TensorFlow-gpu 需要2.4.0以及以上的支持,所以我們沒(méi)有選擇官方的https://github.com/bmild/nerf,因?yàn)閎mild這個(gè)的環(huán)境使用的tensorflow-gpu==1.15,版本太久了。跑起來(lái)會(huì)有下面的問(wèn)題https://github.com/bmild/nerf/issues/174#issue-1553410900,我在這個(gè)tt中也回復(fù)指出了需要升級(jí)到2.8。但是即便是使用https://github.com/cjw531/nerf_tf2,它的環(huán)境也是有點(diǎn)問(wèn)題。首先由于它連接的國(guó)外的conda的channel,所以速度很慢。其次它的環(huán)境使用的是tensorflow==2.8沒(méi)有指明tensorflow-gpu的版本。針對(duì)這兩個(gè)問(wèn)題。我們對(duì)environment.yml進(jìn)行了修改。
# To run: conda env create -f environment.yml
name: nerf_tf2
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
- conda-forge
dependencies:
- python=3.7
- pip
- cudatoolkit=11.0
- cudnn=8.0
- numpy
- matplotlib
- imageio
- imageio-ffmpeg
- configargparse
- ipywidgets
- tqdm
- pip:
- tensorflow==2.8
- tensorflow-gpu==2.8
- protobuf==3.19.0
- -i https://pypi.tuna.tsinghua.edu.cn/simple
啟動(dòng)conda環(huán)境
打開(kāi)cmd,然后輸入下面的命令。
conda env create -f environment.yml
將nerf_tf2加入到j(luò)upyter中,這樣使用jupyter能很方便的查看系統(tǒng)的運(yùn)行結(jié)果。
// 安裝ipykernel
conda install ipykernel
//是該conda環(huán)境在jupyter中顯示
python -m ipykernel install --user --name 環(huán)境名稱 --python -m ipykernel install --user --name 環(huán)境名稱 --display-name "jupyter中顯示名稱"display-name "jupyter中顯示名稱"
//切換到項(xiàng)目目錄
cd 到項(xiàng)目目錄
//激活conda環(huán)境
activate nerf_tf2
//在cmd啟動(dòng)jupyter
jupyter notebook
至此conda環(huán)境以及jupyter準(zhǔn)備就緒。
數(shù)據(jù)準(zhǔn)備
- 下載并安裝colmap,我的環(huán)境是windows(https://demuc.de/colmap/#download)
- 使用https://github.com/fyusion/llff提供的imgs2poses.py實(shí)現(xiàn)自己相機(jī)拍攝的圖片的相機(jī)內(nèi)外參數(shù)的獲取,比如我們的拍攝了10張圖片,它們放置的目錄位置很講究,D:/LanJing/AI/LLFF/data/images,也就是說(shuō)一定要放在images子目錄下面。而你傳入的參數(shù)是python imgs2poses.py D:/LanJing/AI/LLFF/data。因?yàn)樗拇a里面的images_path的寫法是這個(gè)樣子(https://github.com/Fyusion/LLFF/blob/master/llff/poses/colmap_wrapper.py#L28)
手機(jī)拍攝的圖片樣例
feature_extractor_args = [
'colmap', 'feature_extractor',
'--database_path', os.path.join(basedir, 'database.db'),
'--image_path', os.path.join(basedir, 'images'),
'--ImageReader.single_camera', '1',
# '--SiftExtraction.use_gpu', '0',
]
python imgs2poses.py <your_scenedir>
運(yùn)行完imgs2poses.py文件后,生成了sparse目錄、colmap_out.txt、database.db、poses_bounds.npy,然后我們?cè)趎erf_tf2項(xiàng)目下創(chuàng)建新目錄data/nerf_llff_data/ll,將上面的sparse目錄以及poses_bounds.npy復(fù)制到這個(gè)目錄下。最后我們?cè)倥渲脗€(gè)新文件config_ll.txt。至此我們的數(shù)據(jù)準(zhǔn)備工作完成了。
expname = ll_test
basedir = ./logs
datadir = ./data/nerf_llff_data/ll
dataset_type = llff
factor = 8
llffhold = 8
N_rand = 1024
N_samples = 64
N_importance = 64
use_viewdirs = True
raw_noise_std = 1e0
訓(xùn)練
將開(kāi)源軟件遷移到windows平臺(tái)上。
由于此開(kāi)源軟件主要是支持mac和linux,它無(wú)法在windows運(yùn)行,需要對(duì)load_llff.py的修改。
load_llff代碼遷移
運(yùn)行300000次批量訓(xùn)練。
activate nerf_tf2
python run_nerf.py --config config_ll.txt
測(cè)試
render_demo的運(yùn)行
效果
由于我們使用的輸入圖片有些少,只有10張,所以運(yùn)行出來(lái)的效果不是很好,但是整體的流程是一樣。tips:官方的代碼里面使用的一半都是30,甚至100張圖片。
我們的效果
一個(gè)新視角的渲染
官方效果
fern官方合成新視角效果
參考資料
https://zhuanlan.zhihu.com/p/554093703。
https://arxiv.org/pdf/2003.08934.pdf。
https://zhuanlan.zhihu.com/p/593204605。
https://inst.eecs.berkeley.edu/~cs194-26/fa22/Lectures/nerf_lecture1.pdf。