NVIDIA 圖靈架構(gòu)引入了一種新的硬件功能,用于以非常高的性能計(jì)算一對(duì)圖像之間的光流。 NVIDIA 光流 SDK 公開(kāi)了使用這種光流硬件(也稱(chēng)為 NVOFA )加速應(yīng)用程序的 API 。我們很高興地宣布光流 SDK 3.0 的可用性具有以下新功能:
DirectX 12 光流 API
通過(guò)單個(gè) API 的前后向光流
全球流動(dòng)矢量
DirectX 12 光流 API
DirectX 12 是一個(gè)來(lái)自 Microsoft 的低級(jí)編程 API ,與它的前身 DirectX 11 相比,它減少了驅(qū)動(dòng)程序開(kāi)銷(xiāo)。 DirectX 12 為開(kāi)發(fā)人員提供了更大的靈活性和細(xì)粒度的控制。開(kāi)發(fā)人員現(xiàn)在可以利用 DirectX 12 中的低級(jí)編程 API 并優(yōu)化其應(yīng)用程序,以提供比早期 DirectX 版本更好的性能—同時(shí),客戶(hù)端應(yīng)用程序本身必須負(fù)責(zé)資源管理、同步, DirectX 12 在游戲和其他圖形應(yīng)用程序中迅速發(fā)展。
光流 SDK 3.0 支持 DirectX 12 應(yīng)用程序使用 NVIDIA 光流引擎。計(jì)算出的光流可用于提高游戲和視頻中的幀速率,以獲得更平滑的體驗(yàn)或用于目標(biāo)跟蹤。為了提高幀速率, F rame R ate U p C onversion ( FRUC )技術(shù)通過(guò)在原始幀之間插入插值幀來(lái)使用。插值算法使用幀對(duì)之間的流來(lái)生成中間幀。
光流硬件的所有代支持 DirectX 12 光流接口。光流 SDK 包包含頭( S )、演示使用的示例應(yīng)用程序、可根據(jù)需要重新使用或修改的 C ++包裝類(lèi)和文檔。用于訪問(wèn)光流硬件的所有其他組件都包含在 NVIDIA 顯示驅(qū)動(dòng)程序中。 Windows 20H1 或更高版本的操作系統(tǒng)支持 DirectX 12 光流 API 。
除了顯式同步之外, directx12 光流 API 的設(shè)計(jì)與 SDK 中已有的其他接口( CUDA 和 DirectX 11 )非常接近, DirectX 12 光流 API 由初始化、流量估計(jì)和銷(xiāo)毀三個(gè)核心功能組成。
ypedef NV_OF_STATUS(NVOFAPI* PFNNVOFINIT) (NvOFHandle hOf, const NV_OF_INIT_PARAMS* initParams); typedef NV_OF_STATUS(NVOFAPI* PFNNVOFEXECUTED3D12) (NvOFHandle hOf, const NV_OF_EXECUTE_INPUT_PARAMS_D3D12* executeInParams, NV_OF_EXECUTE_OUTPUT_PARAMS_D3D12* executeOutParams); typedef NV_OF_STATUS(NVOFAPI* PFNNVOFDESTROY) (NvOFHandle hOf);
初始化和銷(xiāo)毀 API 在所有接口上都是相同的,但在 DirectX 12 和其他接口(即 DirectX 11 和 CUDA )之間執(zhí)行 API 是不同的。盡管在 DirectX 12 中傳遞給 executeapi 的大多數(shù)參數(shù)與其他兩個(gè)接口中的參數(shù)相同,但在功能上還是存在一些差異。 DirectX 11 和 CUDA 接口中的同步由操作系統(tǒng)運(yùn)行時(shí)和驅(qū)動(dòng)程序自動(dòng)處理。但是,在 DirectX 12 中,需要有關(guān)圍欄和圍欄值的附加信息作為執(zhí)行 API 的輸入?yún)?shù)。這些圍欄對(duì)象將用于同步 CPU ? GPU 和 GPU ? GPU 操作。有關(guān)詳細(xì)信息,請(qǐng)參閱光流 SDK 附帶的編程指南。
DirectX 12 中的緩沖區(qū)管理 API 接口也需要 fence 對(duì)象來(lái)進(jìn)行同步。
所有接口的光流輸出質(zhì)量相同。與其他兩個(gè)接口相比, DirectX 12 的性能應(yīng)該非常接近。
正反向光流
沒(méi)有一種光流算法能給出 100% 的準(zhǔn)確流量。在閉塞區(qū)域,流動(dòng)通常是扭曲的。有時(shí), NVOA 提供的成本也可能不代表流動(dòng)的真實(shí)可信度。通常采用的一個(gè)簡(jiǎn)單檢查是比較向前和向后流動(dòng)。如果正向流和反向流之間的歐氏距離超過(guò)閾值,則該流可以標(biāo)記為無(wú)效。
為了估計(jì)兩個(gè)方向上的流,客戶(hù)機(jī)必須調(diào)用 Execute API 兩次:一次調(diào)用輸入和引用圖像,第二次調(diào)用在反轉(zhuǎn)輸入和引用圖像之后。像這樣兩次調(diào)用 Optical Flow Execute API 可能會(huì)由于上下文切換、線程切換等開(kāi)銷(xiāo)而導(dǎo)致性能不佳。 Optical Flow sdk3 。 0 公開(kāi)了一個(gè)新的 API ,以便在單個(gè) Execute 調(diào)用中生成雙向流??梢酝ㄟ^(guò)在初始化中設(shè)置 NV_OF_INIT_PARAMS::predDirection to NV_OF_PRED_DIRECTION_BOTH 并在 NV_OF_EXECUTE_OUTPUT_PARAMS/NV_OF_EXECUTE_OUTPUT_PARAMS_D3D12::bwdOutputBuffer, NV_OF_EXECUTE_OUTPUT_PARAMS/NV_OF_EXECUTE_OUTPUT_PARAMS_D3D12::bwdOutputCostBuffer 。 中提供接收反向流和/或開(kāi)銷(xiāo)所需的緩沖區(qū)來(lái)啟用此功能
一旦在兩個(gè)方向上生成流,客戶(hù)端應(yīng)用程序就可以比較兩個(gè)方向的流向量,根據(jù)適當(dāng)?shù)臉?biāo)準(zhǔn)(例如,向前和向后流向量之間的歐幾里德距離)丟棄不準(zhǔn)確的流向量,并使用孔填充算法來(lái)填充這些丟棄的流向量。
注意,由于一些優(yōu)化, FB 流的輸出質(zhì)量可能不同于單向流。
演示 FB flow API 編程和一致性檢查的示例代碼:
// Initialization of API
NV_OF_INIT_PARAMS initParams = { 0 };
...
initParams.predDirection = NV_OF_PRED_DIRECTION_BOTH;
...
NvOFAPI->nvOFInit(hNvOF, &initParams);
// Estimation of forward and backward flow
NV_OF_EXECUTE_INPUT_PARAMS executeInParams = { 0 };
...
NV_OF_EXECUTE_OUTPUT_PARAMS executeOutParams = { 0 };
...
executeOutParams.outputBuffer = forwardFlowBuffer;
executeOutParams.outputCostBuffer = forwardFlowCostBuffer;
executeOutParams.bwdOutputBuffer = backwardFlowBuffer;
executeOutParams.bwdOutputCostBuffer = backwardFlowCostBuffer;
NvOFAPI->nvOFExecute(hNvOF, &executeInparams, &executeOutParams)
// Invalidating flow vectors
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
// read forward flow vector
float mvx = GetFlowX(forwardFlowBuffer, x, y);
float mvy = GetFlowY(forwardFlowBuffer, x, y);
// derive the corresponding position in the backward flow (assuming 1x1 grid size)
// and read the backward flow vector
int x2 = x + mvx;
int y2 = y + mvy;
if (x2 < 0 || x2 > width - 1 || y2 < 0 || y2 < height - 1)
{
SetFlowInvalid(forwardFlowBuffer, x, y);
continue;
}
float mvx2 = -1 * GetFlowX(backwardFlowBuffer, x2, y2);
float mvy2 = -1 * GetFlowY(backwardFlowBuffer, x2, y2);
// mark flow vector as invalid if the distance is greater than a threshold
if (((mvx - mvx2) * (mvx - mvx2) + (mvy - mvy2) * (mvy - mvy2)) > thresh) {
SetFlowInvalid(forwardFlowBuffer, x, y);
}
}
}
全球流量估算
視頻序列或游戲中的全局流是由攝影機(jī)平移運(yùn)動(dòng)引起的。全局流估計(jì)是一個(gè)重要的工具,廣泛應(yīng)用于圖像分割、視頻拼接或基于運(yùn)動(dòng)的視頻分析應(yīng)用中。
全局流矢量也可以啟發(fā)式地用于計(jì)算背景運(yùn)動(dòng)。一旦估計(jì)出背景運(yùn)動(dòng),它就可以用來(lái)填充遮擋區(qū)域中的流矢量,也可以用來(lái)處理插值幀中扭曲像素的碰撞。
全局流量是基于發(fā)生頻率和其他一些啟發(fā)式算法,在前向流矢量上計(jì)算的。
為了能夠生成全局流,初始化 API 需要設(shè)置標(biāo)志 初始化參數(shù)的 NV \ u :: enableGlobalFlow ,并在 executeapi 中提供額外的緩沖區(qū) NV _ OF _ EXECUTE _ OUTPUT _ PARAMS / NV _ OF _ EXECUTE _ OUTPUT _ PARAMS _ D3D12 ::全局流緩沖區(qū) 。
關(guān)于作者
Konda Raju 是 NVIDIA 多媒體驅(qū)動(dòng)團(tuán)隊(duì)的高級(jí)系統(tǒng)軟件工程師。他從事 NVIDIA 光流驅(qū)動(dòng)器和應(yīng)用程序編程接口設(shè)計(jì)。此前,他致力于 NVIDIA 視頻驅(qū)動(dòng)程序和固件設(shè)計(jì)。他有技術(shù)碩士學(xué)位。印度理工學(xué)院坎普爾分校信息技術(shù)專(zhuān)業(yè)學(xué)位。
Sampurnananda Mishra 是 NVIDIA 負(fù)責(zé)多媒體驅(qū)動(dòng)程序的高級(jí)經(jīng)理。他研究過(guò) NVIDIA GPU s 上支持的各種多媒體用例。他的興趣包括視頻編碼、計(jì)算機(jī)視覺(jué)、視頻安全、深度學(xué)習(xí)和系統(tǒng)軟件。他擁有印度 IIT 坎普爾電子工程碩士學(xué)位,主攻數(shù)字信號(hào)處理。
審核編輯:郭婷
-
接口
+關(guān)注
關(guān)注
33文章
9603瀏覽量
157677 -
NVIDIA
+關(guān)注
關(guān)注
14文章
5696瀏覽量
110142 -
SDK
+關(guān)注
關(guān)注
3文章
1112瀏覽量
52072
發(fā)布評(píng)論請(qǐng)先 登錄
研華科技受邀亮相NVIDIA GTC 2026
超擎數(shù)智為您深度解析NVIDIA Quantum-X800 InfiniBand平臺(tái)
NVIDIA推出Omniverse DSX Blueprint
Nordic無(wú)線開(kāi)發(fā)---nRF Connect SDK 3.0更新版的安裝入門(mén)介紹
NVIDIA開(kāi)源Audio2Face模型及SDK
NVIDIA RAPIDS 25.06版本新增多項(xiàng)功能
NVIDIA Omniverse Extension開(kāi)發(fā)秘籍
nRF Connect SDK Basic
Nordic nRF5 SDK和softdevice介紹
NVIDIA Jetson + Isaac SDK 人形機(jī)器人方案全面解析
NVIDIA Jetson + Isaac SDK 在人形機(jī)器人領(lǐng)域的方案詳解
NVIDIA DOCA 3.0版本的亮點(diǎn)解析
NVIDIA Isaac Sim與NVIDIA Isaac Lab的更新
如何在Ubuntu上安裝NVIDIA顯卡驅(qū)動(dòng)?
NVIDIA SDK 3.0新硬件功能介紹
評(píng)論