NVIDIA 圖靈架構(gòu)引入了一種新的硬件功能,用于以非常高的性能計(jì)算一對(duì)圖像之間的光流。 NVIDIA 光流 SDK 公開了使用這種光流硬件(也稱為 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)程序開銷。 DirectX 12 為開發(fā)人員提供了更大的靈活性和細(xì)粒度的控制。開發(fā)人員現(xiàn)在可以利用 DirectX 12 中的低級(jí)編程 API 并優(yōu)化其應(yīng)用程序,以提供比早期 DirectX 版本更好的性能—同時(shí),客戶端應(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 ++包裝類和文檔。用于訪問(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ì)和銷毀三個(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);
初始化和銷毀 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è)方向上的流,客戶機(jī)必須調(diào)用 Execute API 兩次:一次調(diào)用輸入和引用圖像,第二次調(diào)用在反轉(zhuǎn)輸入和引用圖像之后。像這樣兩次調(diào)用 Optical Flow Execute API 可能會(huì)由于上下文切換、線程切換等開銷而導(dǎo)致性能不佳。 Optical Flow sdk3 。 0 公開了一個(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 。 中提供接收反向流和/或開銷所需的緩沖區(qū)來(lái)啟用此功能
一旦在兩個(gè)方向上生成流,客戶端應(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ù)專業(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文章
8447瀏覽量
150724 -
NVIDIA
+關(guān)注
關(guān)注
14文章
4855瀏覽量
102711 -
SDK
+關(guān)注
關(guān)注
3文章
1020瀏覽量
45696
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論