色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用PyTorch實現NeRF代碼詳解

3D視覺工坊 ? 來源:3DCV ? 2023-10-21 09:46 ? 次閱讀

作者:大森林| 來源:3DCV

1. NeRF定義

神經輻射場(NeRF)是一種利用神經網絡來表示和渲染復雜的三維場景的方法。它可以從一組二維圖片中學習出一個連續的三維函數,這個函數可以給出空間中任意位置和方向上的顏色和密度。通過體積渲染的技術,NeRF可以從任意視角合成出逼真的圖像,包括透明和半透明物體,以及復雜的光線傳播效果。

2. NeRF優勢

NeRF模型相比于其他新的視圖合成和場景表示方法有以下幾個優勢:

1)NeRF不需要離散化的三維表示,如網格或體素,因此可以避免模型精度和細節程度受到限制。NeRF也可以自適應地處理不同形狀和大小的場景,而不需要人工調整參數

2)NeRF使用位置編碼的方式將位置和角度信息映射到高頻域,使得網絡能夠更好地捕捉場景的細微結構和變化。NeRF還使用視角相關的顏色預測,能夠生成不同視角下不同的光照效果。

3)NeRF使用分段隨機采樣的方式來近似體積渲染的積分,這樣可以保證采樣位置的連續性,同時避免網絡過擬合于離散點的信息。NeRF還使用多層級體素采樣的技巧,以提高渲染效率和質量。

3. NeRF實現步驟

1)定義一個全連接的神經網絡,它的輸入是空間位置和視角方向,輸出是顏色和密度。

2)使用位置編碼的方式將輸入映射到高頻域,以便網絡能夠捕捉細微的結構和變化。

3)使用分段隨機采樣的方式從每條光線上采樣一些點,然后用神經網絡預測這些點的顏色和密度。

4)使用體積渲染的公式計算每條光線上的顏色和透明度,作為最終的圖像輸出。

5)使用渲染損失函數來優化神經網絡的參數,使得渲染的圖像與輸入的圖像盡可能接近。

importtorch
importtorch.nnasnn
importtorch.nn.functionalasF

#定義一個全連接的神經網絡,它的輸入是空間位置和視角方向,輸出是顏色和密度。
classNeRF(nn.Module):
def__init__(self,D=8,W=256,input_ch=3,input_ch_views=3,output_ch=4,skips=[4]):
super().__init__()
#定義位置編碼后的位置信息的線性層,如果層數在skips列表中,則將原始位置信息與隱藏層拼接
self.pts_linears=nn.ModuleList(
[nn.Linear(input_ch,W)]+[nn.Linear(W,W)ifinotinskipselsenn.Linear(W+input_ch,W)foriinrange(D-1)])
#定義位置編碼后的視角方向信息的線性層
self.views_linears=nn.ModuleList([nn.Linear(W+input_ch_views,W//2)]+[nn.Linear(W//2,W//2)foriinrange(1)])
#定義特征向量的線性層
self.feature_linear=nn.Linear(W//2,W)
#定義透明度(alpha)值的線性層
self.alpha_linear=nn.Linear(W,1)
#定義RGB顏色的線性層
self.rgb_linear=nn.Linear(W+input_ch_views,3)

defforward(self,x):
#x:(B,input_ch+input_ch_views)
#提取位置和視角方向信息
p=x[:,:3]#(B,3)
d=x[:,3:]#(B,3)

#對輸入進行位置編碼,將低頻信號映射到高頻域
p=positional_encoding(p)#(B,input_ch)
d=positional_encoding(d)#(B,input_ch_views)

#將位置信息輸入網絡
h=p
fori,linenumerate(self.pts_linears):
h=l(h)
h=F.relu(h)
ifiinskips:
h=torch.cat([h,p],-1)#如果層數在skips列表中,則將原始位置信息與隱藏層拼接

#將視角方向信息與隱藏層拼接,并輸入網絡
h=torch.cat([h,d],-1)
fori,linenumerate(self.views_linears):
h=l(h)
h=F.relu(h)

#預測特征向量和透明度(alpha)值
feature=self.feature_linear(h)#(B,W)
alpha=self.alpha_linear(feature)#(B,1)

#使用特征向量和視角方向信息預測RGB顏色
rgb=torch.cat([feature,d],-1)
rgb=self.rgb_linear(rgb)#(B,3)

returntorch.cat([rgb,alpha],-1)#(B,4)

#定義位置編碼函數
defpositional_encoding(x):
#x:(B,C)
B,C=x.shape
L=int(C//2)#計算位置編碼的長度
freqs=torch.logspace(0.,L-1,steps=L).to(x.device)*math.pi#計算頻率系數,呈指數增長
freqs=freqs[None].repeat(B,1)#(B,L)
x_pos_enc_low=torch.sin(x[:,:L]*freqs)#對前一半的輸入進行正弦變換,得到低頻部分(B,L)
x_pos_enc_high=torch.cos(x[:,:L]*freqs)#對前一半的輸入進行余弦變換,得到高頻部分(B,L)
x_pos_enc=torch.cat([x_pos_enc_low,x_pos_enc_high],dim=-1)#將低頻和高頻部分拼接,得到位置編碼后的輸入(B,C)
returnx_pos_enc

#定義體積渲染函數
defvolume_rendering(rays_o,rays_d,model):
#rays_o:(B,3),每條光線的起點
#rays_d:(B,3),每條光線的方向
B=rays_o.shape[0]

#在每條光線上采樣一些點
near,far=0.,1.#近平面和遠平面
N_samples=64#每條光線的采樣數
t_vals=torch.linspace(near,far,N_samples).to(rays_o.device)#(N_samples,)
t_vals=t_vals.expand(B,N_samples)#(B,N_samples)
z_vals=near*(1.-t_vals)+far*t_vals#計算每個采樣點的深度值(B,N_samples)
z_vals=z_vals.unsqueeze(-1)#(B,N_samples,1)
pts=rays_o.unsqueeze(1)+rays_d.unsqueeze(1)*z_vals#計算每個采樣點的空間位置(B,N_samples,3)

#將采樣點和視角方向輸入網絡
pts_flat=pts.reshape(-1,3)#(B*N_samples,3)
rays_d_flat=rays_d.unsqueeze(1).expand(-1,N_samples,-1).reshape(-1,3)#(B*N_samples,3)
x_flat=torch.cat([pts_flat,rays_d_flat],-1)#(B*N_samples,6)
y_flat=model(x_flat)#(B*N_samples,4)
y=y_flat.reshape(B,N_samples,4)#(B,N_samples,4)

#提取RGB顏色和透明度(alpha)值
rgb=y[...,:3]#(B,N_samples,3)
alpha=y[...,3]#(B,N_samples)

#計算每個采樣點的權重
dists=torch.cat([z_vals[...,1:]-z_vals[...,:-1],torch.tensor([1e10]).to(z_vals.device).expand(B,1)],-1)#計算相鄰采樣點之間的距離,最后一個距離設為很大的值(B,N_samples)
alpha=1.-torch.exp(-alpha*dists)#計算每個采樣點的不透明度,即1減去透明度的指數衰減(B,N_samples)
weights=alpha*torch.cumprod(torch.cat([torch.ones((B,1)).to(alpha.device),1.-alpha+1e-10],-1),-1)[:,:-1]#計算每個采樣點的權重,即不透明度乘以之前所有采樣點的透明度累積積,最后一個權重設為0(B,N_samples)

#計算每條光線的最終顏色和透明度
rgb_map=torch.sum(weights.unsqueeze(-1)*rgb,-2)#加權平均每個采樣點的RGB顏色,得到每條光線的顏色(B,3)
depth_map=torch.sum(weights*z_vals.squeeze(-1),-1)#加權平均每個采樣點的深度值,得到每條光線的深度(B,)
acc_map=torch.sum(weights,-1)#累加每個采樣點的權重,得到每條光線的不透明度(B,)

returnrgb_map,depth_map,acc_map

#定義渲染損失函數
defrendering_loss(rgb_map_pred,rgb_map_gt):
return((rgb_map_pred-rgb_map_gt)**2).mean()#計算預測的顏色與真實顏色之間的均方誤差

綜上所述,本代碼實現了NeRF的核心結構,具體實現內容包括以下四個部分。

1)定義了NeRF網絡結構,包含位置編碼和多層全連接網絡,輸入是位置和視角,輸出是顏色和密度。

2)實現了位置編碼函數,通過正弦和余弦變換引入高頻信息。

3)實現了體積渲染函數,在光線上采樣點,查詢NeRF網絡預測顏色和密度,然后通過加權平均實現整體渲染。

4)定義了渲染損失函數,計算預測顏色和真實顏色的均方誤差。

當然,本方案只是實現NeRF的一個基礎方案,更多的細節還需要進行優化。

當然,為了方便下載,我們已經將上述兩個源代碼打包好了。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 神經網絡
    +關注

    關注

    42

    文章

    4779

    瀏覽量

    101030
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62867
  • 代碼
    +關注

    關注

    30

    文章

    4821

    瀏覽量

    68890
  • pytorch
    +關注

    關注

    2

    文章

    808

    瀏覽量

    13322

原文標題:一文帶你入門NeRF:利用PyTorch實現NeRF代碼詳解(附代碼)

文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Image Style Transfer pytorch方式實現的主要思路

    深度學總結:Image Style Transfer pytorch方式實現,這個是非基于autoencoder和domain adversrial方式
    發表于 06-20 10:58

    PyTorch如何入門

    PyTorch 入門實戰(一)——Tensor
    發表于 06-01 09:58

    Pytorch代碼移植嵌入式開發筆記,錯過絕對后悔

    @[TOC]Pytorch 代碼移植嵌入式開發筆記目前在做開發完成后的AI模型移植到前端的工作。 由于硬件設施簡陋,需要把代碼和算法翻譯成基礎加乘算法并輸出每個環節參數。記錄幾點實用技巧以及項目
    發表于 11-08 08:24

    PyTorch官網教程PyTorch深度學習:60分鐘快速入門中文翻譯版

    PyTorch 深度學習:60分鐘快速入門”為 PyTorch 官網教程,網上已經有部分翻譯作品,隨著PyTorch1.0 版本的公布,這個教程有較大的代碼改動,本人對教程進行重新翻
    的頭像 發表于 01-13 11:53 ?1w次閱讀

    Pytorch 1.1.0,來了!

    許多用戶已經轉向使用標準PyTorch運算符編寫自定義實現,但是這樣的代碼遭受高開銷:大多數PyTorch操作在GPU上啟動至少一個內核,并且RNN由于其重復性質通常運行許多操作。但是
    的頭像 發表于 05-05 10:02 ?5946次閱讀
    <b class='flag-5'>Pytorch</b> 1.1.0,來了!

    詳解Tutorial代碼的學習過程與準備

    導讀:本文主要解析Pytorch Tutorial中BiLSTM_CRF代碼,幾乎注釋了每行代碼,希望本文能夠幫助大家理解這個tutorial,除此之外借助代碼和圖解也對理解條件隨機場
    的頭像 發表于 04-03 16:50 ?1891次閱讀
    <b class='flag-5'>詳解</b>Tutorial<b class='flag-5'>代碼</b>的學習過程與準備

    Pytorch實現MNIST手寫數字識別

    Pytorch 實現MNIST手寫數字識別
    發表于 06-16 14:47 ?7次下載

    pytorch實現斷電繼續訓練時需要注意的要點

    本文整理了pytorch實現斷電繼續訓練時需要注意的要點,附有代碼詳解
    的頭像 發表于 08-22 09:50 ?1449次閱讀

    PyTorch教程3.2之面向對象的設計實現

    電子發燒友網站提供《PyTorch教程3.2之面向對象的設計實現.pdf》資料免費下載
    發表于 06-05 15:48 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.2之面向對象的設計<b class='flag-5'>實現</b>

    PyTorch教程3.5之線性回歸的簡潔實現

    電子發燒友網站提供《PyTorch教程3.5之線性回歸的簡潔實現.pdf》資料免費下載
    發表于 06-05 11:28 ?0次下載
    <b class='flag-5'>PyTorch</b>教程3.5之線性回歸的簡潔<b class='flag-5'>實現</b>

    PyTorch教程13.6之多個GPU的簡潔實現

    電子發燒友網站提供《PyTorch教程13.6之多個GPU的簡潔實現.pdf》資料免費下載
    發表于 06-05 14:21 ?0次下載
    <b class='flag-5'>PyTorch</b>教程13.6之多個GPU的簡潔<b class='flag-5'>實現</b>

    [源代碼]Python算法詳解

    [源代碼]Python算法詳解[源代碼]Python算法詳解
    發表于 06-06 17:50 ?0次下載

    TorchFix:基于PyTorch代碼靜態分析

    TorchFix是我們最近開發的一個新工具,旨在幫助PyTorch用戶維護健康的代碼庫并遵循PyTorch的最佳實踐。首先,我想要展示一些我們努力解決的問題的示例。
    的頭像 發表于 12-18 15:20 ?1102次閱讀

    全面總結動態NeRF

    1. 摘要 神經輻射場(NeRF)是一種新穎的隱式方法,可以實現高分辨率的三維重建和表示。在首次提出NeRF的研究之后,NeRF獲得了強大的發展力量,并在三維建模、表示和重建領域蓬勃發
    的頭像 發表于 11-14 16:48 ?457次閱讀
    全面總結動態<b class='flag-5'>NeRF</b>

    利用Arm Kleidi技術實現PyTorch優化

    PyTorch 是一個廣泛應用的開源機器學習 (ML) 庫。近年來,Arm 與合作伙伴通力協作,持續改進 PyTorch 的推理性能。本文將詳細介紹如何利用 Arm Kleidi 技術提升 Arm
    的頭像 發表于 12-23 09:19 ?267次閱讀
    <b class='flag-5'>利用</b>Arm Kleidi技術<b class='flag-5'>實現</b><b class='flag-5'>PyTorch</b>優化
    主站蜘蛛池模板: 九色PORNY真实丨国产免费| 好男人在线观看免费视频WWW| 国产午夜一区二区三区免费视频| 男女亲吻摸下面吃奶视频| 国产精品一区二区激情| 日本特交大片免费观看| www.伊人网| 久久国产视频网站| 亚洲看片网站| 后式大肥臀国产在线| 亚洲免费在线观看视频| 精品国产乱码久久久久乱码 | 芳草地社区在线视频| 日本撒尿特写| 国产对白精品刺激一区二区| 污污内射久久一区二区欧美日韩| 国产成人综合在线观看网站| 我的年轻漂亮继坶三级| 国产三级影院| 永久免费精品影视网站| 男人就爱吃这套下载| 亚洲熟女丰满多毛XXXXX| 出轨的妻子在线观看| 老司机深夜福利ae 入口网站| 337p欧洲亚大胆精品| 亲女乱h文小兰第一次| 囯产少妇BBBBBB高潮喷水一| 午夜视频体内射.COM.COM| 哺乳溢出羽月希中文字幕| 色欲人妻AAAAAAA无码| 国产精品无码亚洲精品| 亚洲一区国产| 女人被弄到高潮叫床免 | 久久偷拍国2017| 99在线视频免费观看视频| 失禁 调教 刺激 哭喊男男| 国内精品久久人妻无码HD浪潮| 中文字幕无码亚洲视频| 日本边添边摸边做边爱边| 国产午夜精品不卡观看| 52av我爱|