天天看點

OpenCV4+OpenVINO實作圖像的超像素

傳統方式的圖像超像素常見的方式就是基于立方插值跟金字塔重建。OpenCV中對這兩種方式均有實作,低像素圖像在紋理細節方面很難恢複,從低像素圖像到高像素圖像是典型的一對多映射,如果找到一種好的映射關系可以盡可能多的恢複或者保留圖像紋理細節是圖像超像素重建的難點之一,傳統方式多數都是基于可推導的模型實作。而基于深度學習的超像素重新方式過程未知但是結果優于傳統方式。在深度學習方式的超像素重建中,對低像素圖像采樣大感受野來擷取更多的紋理特征資訊。OpenVINO中提供的單張圖像超像素網絡參考了下面這篇文章

https://arxiv.org/pdf/1807.06779.pdf

該網絡模型主要分為兩個部分

特征重建網絡,實作從低分辨率到高分辨率的像素重建

注意力生成網絡,主要實作圖像中高頻資訊的修複

通過兩個網絡的的輸出相乘,還可以得到高分辨率圖像的殘差。特征重建網絡主要包括三個部分。卷積層實作特征提取,卷積層采樣大感受野來得到更多紋理細節;多個DenseRes 疊加子產品,級聯DenseRes可以讓網絡更深,效果更好;一個亞像素卷積層作為上采樣子產品。注意力生成網絡部分,用來恢複小的紋理細節,如圖像的邊緣與形狀,網絡可以準确定位到細節特征,然後進行相對提升,注意力特征網絡設計受到UNet網絡架構的啟發。完整的模型結構如下:

OpenCV4+OpenVINO實作圖像的超像素

一個更簡介的網絡結構如下:

OpenCV4+OpenVINO實作圖像的超像素

其中LR表示低分辨率圖像、HR表示高分辨率圖像,Bicubic表示雙立方插值上采樣。

OpenVINO提供的模型是在這個模型基礎上進行簡化,計算量更低,速度更快。從上面的模型結構知道,模型有兩個輸入部分,分别是輸入的低分辨率圖像與雙立方上采樣的圖像

LR的輸入:[1x3x270x480] 雙立方采樣:[1x3x1080x1920] 三通道順序是:BGR

模型的輸出

輸出層是一個blob對象,格式為[1x3x1080x1920]

首先需要加載網絡模型,擷取可執行網絡,然後設定輸入與輸出的資料格式與資料精度,這部分的代碼如下:

代碼示範步驟中有兩個輸入,對輸入的設定可以使用下面的代碼

最後執行推理,完成對輸出的解析,在解析輸出的時候其實輸的是[NCHW] = [1x3x1080x1920]的浮點數矩陣,需要轉換為Mat類型為[HWC] =[1080x1920x3],采用的是循環方式,是不是有更好的資料處理方法可以轉換這個,值得研究。解析部分的代碼如下

測試結果分别如下:(原圖)

OpenCV4+OpenVINO實作圖像的超像素

超分辨輸出:(1920x1080)

OpenCV4+OpenVINO實作圖像的超像素

總結一下:也許模型被簡化的太厲害了,速度是很快了,單身效果感覺比雙立方好那麼一點點而已!所謂魚跟熊掌不可兼得!

學習O'pen'VINO請看這裡:

OpenVINO計算機視覺模型加速

繼續閱讀