1. 程式人生 > >INDEMIND帶你玩轉OpenCV4.0(一):DIS光流演算法解析

INDEMIND帶你玩轉OpenCV4.0(一):DIS光流演算法解析

文章目錄

在OpenCV 3.0釋出至今三年半的時間中,經過 Alpha、Beta、RC等版本的打磨,OpenCV 4.0終於正式來襲,為我們帶來很多新特性。這些新特性具體會為OpenCV帶來怎樣的提升?在實際使用情況下表現如何?INDEMIND在接下來的一段時間中將帶大家一一解析,如有不實之處,敬請指正。

一.OpencCV 4.0 新特性介紹

首先是OpenCV完全支援了C++ 11

由於OpenCV 最開始開發時的語言是 C,導致許多模組無法利用 C++ 11 的良好特性,OpenCV 4.0 版本的一個重要使命就是去除 C 語言風格的介面,使其完全支援 C++ 11。

  1. 大量從 OpenCV 1.x 遺留的 C 語言風格的 API 介面被刪掉,主要影響的模組是 objdetect, photo, video, videoio, imgcodecs, calib3d。

  2. 在 core 模組中的持久化(在 XML,YAML 或 JSON 中儲存和載入結構化資料)已完全用 C ++ 重新實現,並去除了相應的 C 風格的介面。 目前,base64 支援尚未完成(僅支援載入 base64 編碼的 XML 和 YAML,還未支援編碼)。 現在,儲存在 FileNode 中的序列的隨機訪問是 O(N) 操作; 使用 cv :: FileNodeIterator 能夠更快地進行順序訪問, 速度上,FileStorage 的載入比以前的實現少了 3-6 倍的記憶體!

DNN(深度神經網路)模組是目前OpenCV更新最重要的模組
  1. 增加 Mask-RCNN 模型支援。

  2. 整合 ONNX 解析器。 支援多個流行的分類網路。 部分支援 YOLO 物件檢測網路(YOLO 的 ONNX 版本缺少一些提供矩形列表的最終圖層)。

  3. 通過引入 Intel DLDT 改進 DNN 模組速度。

  4. API 更改:預設情況下,blobFromImage 方法不會交換 R 和 B 通道,也不會對輸入影象進行裁剪。 而且,此 API 更改也已新增到 OpenCV 3.4 分支。

  5. 為不支援 OpenCL 而支援 Vulkan 的硬體平臺添加了實驗性質的 Vulkan 後端(還在開發中!不建議大家使用)。

  6. 為 OpenCV 支援的最流行的深度學習網路添加了快捷方式。 可以通過指定模型的別名,跳過預處理引數甚至模型的路徑!

  7. 修復了 AMD 和 NVIDIA GPU 上的 OpenCL 加速。 現在,可以為模型啟用 DNN_TARGET_OPENCL,開啟 OpenCL 支援。 請注意,DNN_TARGET_OPENCL_FP16 僅在英特爾 GPU 上進行測試,因此仍需要額外的 flags。

G-API 為演算法的硬體優化加速提供計算圖支援

opencv_gapi 是全新新增的模組,它是非常有效的影象處理引擎。開發者可以在程式中定義多個影象處理步驟組成的圖,執行的時候進行優化,使得 fast and portable。

Objdetect新增 QR 碼的檢測和解碼

這個功能在移動端幾乎成為 APP 的標配了

實現了流行的 Kinect Fusion 演算法

並針對 CPU 和 GPU(OpenCL)進行了優化,整合到 opencv_contrib / rgbd 模組中。
為了使實時採集處理更高效,在 opencv / videoio 模組中更新了 Kinect 2 支援。 在 4.0 beta
版本中,iGPU 的程式碼已經加速,在高解析度的情況下(512x512x512 integration volume),效能提升了 3 倍。

非常高效且高質量的 DIS 密集光流演算法已經從 opencv_contrib 轉移到 opencv/video 模組

本次光流模組的更新是個亮點,畢竟之前OpenCV的光流模組相比學術界的最新成果實在顯得太弱了。[1]

新版OpenCV 4.0更加聚焦影象處理基礎功能和深度學習模組,尤其是DIS光流演算法的更新,算是補足了光流演算法落後的短板,然而DIS演算法表現怎麼樣,我們不妨讓事實說話。

注:本次DIS光流演算法分析基於OpenCV測試集以及INDEMIND雙目視覺慣性模組執行DIS演算法實測。

二.Opencv 4.0 安裝

首先,我們要安裝OpenCV 4.0,具體操作如下:https://opencv.org/releases.html

  1. 下載最新的opencv 4.0.0地址如下:
    如圖所示,選擇Sources

  2. 解壓下載的壓縮包。從原始碼安裝opencv4.0.0

a)安裝openv依賴性。

 sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

b) Cmake 配置opencv,執行命令如下:

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

初次安裝opencv可以選擇/usr/local,對於電腦中已經有opencv的,可以選擇其他安裝目錄。

c) 執行Make 和 Make install

三.DIS 光流

1.DIS光流介紹

光流是空間運動物體在觀測成像平面上的畫素運動的“瞬時速度”。光流的研究是利用影象序列中的畫素強度資料的時域變化和相關性來確定各自畫素位置的“運動”。研究光流場的目的就是為了從圖片序列中近似得到不能直接得到的運動場。

光流法的前提假設:

(1)相鄰幀之間的亮度恆定;

(2)相鄰視訊幀的取幀時間連續,或者,相鄰幀之間物體的運動比較“微小”;

(3)保持空間一致性;即,同一子影象的畫素點具有相同的運動 [2]

DIS 光流演算法是Dense Inverse Search-basedmethod的簡稱,於2016年由Till Kroeger等人提出的一種在光流質量和計算時間中取得平衡的演算法。

主要包含3個方面:

(1)基於塊對應關係的逆搜尋
(2)沿著多尺度做影象塊的聚合從而獲得稠密的光流場
(3)精細化搜尋。精細化搜尋。

DIS演算法最大的優點在於運算速度的提升,在單核cpu上,1024*436解析度可以達到300Hz-600Hz執行速率;包含影象預處理,例如平滑,縮放,梯度計算等執行速度能達到42/46 Hz,完全滿足實時的需求。

執行時間及效果對比圖如下:

圖片摘自《Fast Optical Flow Using Dense InverseSearch》
Figure 1: Our DIS method runs at 10Hz up to 600Hz on a single coreCPUforanaverageend-pointpixelerrorsmallerorsimilarto top opticalflow methods at comparable speed. This plot excludes preprocessing time for all methods. Details in§3.1,3.3.
在這裡插入圖片描述
[4] Figure 18: Exemplary results on Sintel (training) and error maps. In each block of 2 × 6 images. Top row, left to right: Our method for operating points (1)-(4), Ground Truth. Bottom row: Error heat maps scaled from blue (no error) to red (maximum ground truth flow magnitude), Original Image.[3]

具體詳細資訊,請檢視《Fast Optical Flow Using Dense Inverse Search》原論文。

2.DIS光流呼叫流程

Dis光流演算法在OpenCV 4.0中被整合到video模組中。

呼叫

Ptr<DenseOpticalFlow> algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_MEDIUM);
algorithm->calc(prevgray, gray, flow);

流程圖如下:


在這裡插入圖片描述

3.Dis光流結果

說明:將光流場轉換到HSV空間中顯示,光流的數值用不同顏色來區分,色斑顏色深淺代表運動速率,白色代表物體無運動。

影象說明:左側彩圖為原始影象,白色背景影象為HSV空間顯示,藍色背景影象為HSV空間顯示疊加原始影象。

為了充分測試DIS光流演算法,我們對比了Farneback 光流演算法在不同的紋理和光照下的結果。

本次的demo所用的測試集為:opencv 中的samples/data/vtest.avi。這個demo前景和背景的紋理都較為豐富。

在這裡插入圖片描述
如上圖所示,Dis光流演算法背景純白無光斑,說明演算法對紋理豐富的背景區域或無運動區域處理的更好。

在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在光流演算法中,影象中的同一移動物體的速度應該一致,對應的色斑應是一致或平滑漸變,而Farneback 光流演算法光斑卻出現了突變,證明DIS光流演算法對影象運動物體處理更精確。
在這裡插入圖片描述
如圖,影象中行人路過路燈時,Farneback 光流演算法將路燈識別成了移動物體,DIS光流演算法並未出現類似錯誤,證明DIS光流演算法對移動物體於固定物體疊加狀態處理更精準迅速。

總結:

在紋理豐富場景,OpenCV 4.0中DIS光流演算法對運動物體檢測精準流暢,行人色斑一致順暢,複雜場景(運動與固定物體重疊)無明顯錯誤,達到了實用標準,比Farneback 光流演算法表現更好。

INDEMIND雙目視覺慣性模組執行DIS光流演算法

說明:本Demo演示Dis光流演算法與Farneback 光流演算法在前景和背景紋理都較弱(天空部分無紋理),效果如下:

在這裡插入圖片描述
從Demo中可以看出, DIS光流演算法對天空無文理、地面弱文理等場景支援不足,出現了大量混亂光斑,實用效果不及Farneback 光流演算法。建議各位在使用OpenCV 4.0應對弱紋理場景時,使用Farneback 光流演算法。

關於DIS光流演算法的介紹到這裡先告一段落,接下來INDEMIND將為大家帶來更多OpenCV 4.0的新特性解析驗證,敬請關注。

四.關於INDEMIND

INDEMIND是一家專注於計算機視覺技術研發與嵌入式計算平臺研發的人工智慧公司,行業領先的計算機視覺方案提供商。研發團隊結合自身在計算機視覺技術上的優勢,研發了包含空間感知、環境語義、多感測器融合等演算法的軟硬體全棧技術方案,推出了雙目視覺慣性模組、環境感知視覺前端計算平臺,以滿足智慧攝像頭、機器人及穿戴計算等行業的感知計算需求。

參考資料:
[1] 周強.千呼萬喚始出來!OpenCV 4.0正式釋出!.2018-11-22
[2] jobbofhe.光流法簡單介紹.2018-5-25
[3]Kroeger,T&R.Timofte&D.X.Dai&L.V. Gool. Fast Optical Flow Using Dense Inverse Search [J] .2016-09-17
[4]Kroeger,T&R.Timofte&D.X.Dai&L.V. Gool. Fast Optical Flow Using Dense Inverse Search [J] .2016-09-17