光流介紹以及FlowNet學習筆記
光流(Optical Flow)介紹
1. 光流原理
光流分為稀疏光流和稠密光流,稀疏光流就是隻計算圖片中特定點的光流,而稠密光流則是每個畫素都要計算光流。
簡單地說就是在連續圖片序列中,從第t幀到第t+1幀,每個畫素的運動速度和運動方向。
比如第t幀的時候A點的位置是(x1, y1),那麼我們在第t+1幀的時候再找到A點,假如它的位置是(x2,y2),即, 那麼我們t->t+1的光流即為:。所以給定一對圖片(t -> t-1),就可以計算出這對圖片之間的光流圖,大小和兩幀的圖片相同。
有了t->t+1的光流,我們可以利用t+1幀的圖片和這個光流將t+1幀warp到t幀,得到t幀的圖片。怎麼計算呢?對於第t幀上的每個畫素點
想通過光流推測某一幀圖片,只要計算該幀到已知幀的光流即可通過warp得到
比如我們想通過光流增強特徵,已知t-1,t-3的特徵,想用它們增強當前幀t的特徵,只需要計算t->t-1和t->t-3的光流,然後利用這兩個光流就可以把t-1,t-3的特徵warp到t了。更多應用可檢視我另一篇部落格利用光流提升視訊識別的速度和精度
2. 光流視覺化
光流場是圖片中每個畫素都有一個x方向和y方向的位移,所以在上面那些光流計算結束後得到的光流flow是個和原來影象大小相等的雙通道影象。
不同顏色表示不同的運動方向,深淺表示運動的速度。
講x和y轉為極座標,夾角(actan2(y,x))代表方向,極徑(x和y的平方和開根號)代表位移大小,剛好用一下hsv的影象表示。上圖的光流可以看到,紅色的人在往右邊動,那個藍色的東西在往左上動
def viz_flow(flow):
# 色調H:用角度度量,取值範圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°
# 飽和度S:取值範圍為0.0~1.0
# 亮度V:取值範圍為0.0(黑色)~1.0(白色)
h, w = flow.shape[:2]
hsv = np.zeros((h, w, 3), np.uint8)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
hsv[...,0] = ang*180/np.pi/2
hsv[...,1] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
# flownet是將V賦值為255, 此函式遵循flownet,飽和度S代表畫素位移的大小,亮度都為最大,便於觀看
# 也有的光流視覺化講s賦值為255,亮度代表畫素位移的大小,整個圖片會很暗,很少這樣用
hsv[...,2] = 255
bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
return bgr
論文主要貢獻
- 首次將CNN運用到光流預測上,設計了兩種網路結構
- 提出了一個Flying chairs的資料集,並利用這個虛擬合成的資料集訓練網路,得到的模型能很好的泛化到實際圖片中,而且效果達到了state of art
網路結構
由於卷積神經網路中一層有一層pooling後特徵圖越來越小,而最終預測的光流是要和原圖大小相同,所以還需要放大(unconv),所以網路整體上分為兩個部分,一個縮小還有一個放大
縮小(卷積)部分
FlowNetSimple
第一種縮小(卷積)方案是最樸素的方法的,就是將這一對圖片的通道concat起來,網路結構圖中可以看到輸入的data層的channel是6.
FlowNetCorr
第二中方案是這一對圖片分開處理,分別進入卷積網路,得到各自的特徵圖,然後再找到它們特徵圖之間的聯絡。
兩個特徵圖分別為f1,f2: w * h * c, 然後corr層比較這兩個特徵圖各個塊。比如以x1為中心的一塊和以x2為中心的一塊,它們之間的聯絡用以下公式計算,塊長為K:= 2k+1,大小為 K*K。
該公式和卷積的操作是一樣的,以x1為中心的patch和以x2為中心的patch,對應位置相乘然後相加,這就是卷積核在圖片上的操作啊,只是卷積網路裡是和filter之間進行卷積,且它的weight是不需訓練或不可訓練。計算這兩塊之間的聯絡計算複雜度是 c * K * K,而f1上每個塊都要與f2上所有塊計算聯絡,f1上有w * h個塊(每個畫素點都可以做一個塊的中心點),f2上也有w * h個塊,所有整個計算複雜度是c * K * K * ( w * h) * ( w * h),這裡是假設每個塊在下一張圖上時,可以移動任何位置。但是這樣計算複雜度太高了,所以我們可以約束位移範圍為d(上下左右移動d),就是每個塊只和它附近D: 2d+1的位置塊計算聯絡,而且以x1為中心的塊去和它附近D範圍計算聯絡時,還可以加上步長,就是不必和D範圍的每個點都進行計算,可以跳著。
我們先假設沒有步長,這樣每次和D範圍內一個點計算聯絡就得到一個 w * h * 1的 特徵圖,然後和D內的所有點即D * D個點,得到 w * h * D^2個特徵圖
看圖中有個441+32=473地方,論文實驗就是這是位移最大值為d=10,所以D=21, 21*21=441,然後32個channel是1x1卷積後得到,這裡的原因可能是用1x1減少了一下channel(256->32),這裡還有個不明白的地是為什麼只把第t幀的32個channel附到441後面,而t+1幀則沒有。還有就是這裡的sqrt是什麼沒有看到解釋,是直接對得到的441個channel的數值開根號嗎。
放大部分
這裡的放大和fcn十分類似,一邊向後unconv,一邊直接在小的特徵圖上預測,然後把結果雙線性插值然後concat在unconv後的特徵圖上,然後接著往後傳,重複四次後,得到的預測光流解析度依然是輸入的1/4,再重複之前的操作已沒有太多提升,所以可以直接雙線性插值得到和輸入相同解析度的光流預測圖。
在最後的雙線性插值放大上還有個可選方案就是variational approach參考:Large displacement optical flow: de-
scriptor matching in variational motion estimation
FlowNetS和FlowNetC的對比
其中:EPE是一種對光流預測錯誤率的一種評估方式。
指所有畫素點的gound truth和預測出來的光流之間差別距離(歐氏距離)的平均值,越低越好。
論文上說FlowNetS能和FlowNetC媲美,甚至有些資料集要好於FlowNetC,但是在實際資料集上FlowNetC應該更好,因為FlowNetC在flyingchair和sintel clean資料集的表現要好於FlowNetS,注意到sintel clean是沒有運動blur和fog特效等的,和flyingchair資料集比較類似,這意味著FlowNetC網路能更好的學習訓練資料集,更加過擬合over-fitting
所以如果使用更好的訓練資料集,FlowNetC網路會更有優勢。
參考和引用了以下部落格,特別感謝!
相關推薦
光流介紹以及FlowNet學習筆記
光流(Optical Flow)介紹 1. 光流原理 光流分為稀疏光流和稠密光流,稀疏光流就是隻計算圖片中特定點的光流,而稠密光流則是每個畫素都要計算光流。 簡單地說就是在連續圖片序列中,從第t幀到第t+1幀,每個畫素的運動速度和運動方向。
基於結構光的三維測量學習筆記
1.幾種比較成熟的方法 1.1飛行時間發 原理:通過直接測量光傳播的時間,確定物體的面型。發射脈衝訊號,接受發射回的光,計算距離。 精度:毫米級 優點:原理簡單,可避免陰影和遮擋等問題,且儀器便攜化。 缺點:精度相對較低 1.2莫爾條紋法 原理:採用兩組光
2017.11.19以及22Python 學習筆記
迴圈語句 for i in range(執行的次數) 比如 for i in range (10)#迴圈十次 簡單的溫度轉換程式: #TempConvert.py val = input("請輸入帶溫度表示符號的溫度值(例如:32C):") if val[-1] in ['C','
《瘋狂Workflow講義——基於Activiti的工作流應用開發》學習筆記之一·環境搭建之編碼問題
在對activiti有了一定了解之後,開始按《瘋狂Workflow講義——基於Activiti的工作流應用開發》中的步驟搭建環境,新建專案,建立resource資料夾,使用第2張的First.bpmn,activiti.cfg.xml,First.java,
wowoto的Ubuntu和Archlinux以及FreeBSD學習筆記
慶幸,這是一個寧靜的夜。 能在如此喧囂的商業街拾得一個安靜的角落,翻開久違的《讀者》,從頭至尾,靜靜聆聽,一字,一句,仿若跳動的音符,時而深遠悠長溫婉嫵媚,時而鏗鏘堅毅擲地有聲......多麼令人欣喜。別緻的感受,流淌於心間。輕輕翻開扉頁,抖
Java學習筆記43(打印流、IO流工具類簡單介紹)
println comm 學習筆記 dir puts str lose tof line 打印流: 有兩個類:PrintStream,PrintWriter類,兩個類的方法一致,區別在於構造器 PrintStream:構造方法:接收File類型,接收字符串文件名,接收字節輸
opencv學習筆記四十二:稠密光流跟蹤
利用Gunnar Farneback演算法計算全域性性的稠密光流演算法(即影象上所有畫素點的光流都計算出來),由於要計算影象上所有點的光流,故計算耗時,速度慢 稠密光流需要使用某種插值方法在比較容易跟蹤的畫素之間進行插值以解決那些運動不明確的畫素 calcOpticalF
Java學習筆記--異常處理、File類、IO流介紹
異常處理 格式: try { 可能出現問題的程式碼; }catch(異常類名 變數名) {//catch語句可以有多個,子類異常放前面,父類異常放後面 針對問題的處理; }finally { 釋放資源; } jdk7新特性 t
MySql學習筆記-介紹以及基本操作
Mysql資料型別 1: Text 型別: CHAR(size) 儲存固定長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的長度。最多 255 個字元。 VARCHAR(size) 儲存可變長度的字串(可包含字母、數字以及特殊字元)。在括號中指定字串的最大長度。
Java學習筆記13-- web伺服器介紹及Tomcat的使用;jdk,eclipse,tomcat關係以及安裝順序;http協議
web伺服器介紹及Tomcat的使用 jdk,eclipse,tomcat關係以及安裝順序 1、eclipse安裝前必須要先裝jdk 1、沒有JDK的話,無法安裝或者執行eclipse。 2、JDK 是整個Java的核心,包括了Java執行環境,Java
Node.js學習筆記 (一) Node介紹以及環境安裝
Node介紹以及環境安裝 文章目錄 Node介紹以及環境安裝 1.什麼是Node 1.1 Node簡介 2.Node能做什麼 3. Node的安裝與環境搭建 3.1 怎麼安裝Node 3.2 No
OpenCV學習筆記(二十六)——小試SVM演算法ml OpenCV學習筆記(二十七)——基於級聯分類器的目標檢測objdect OpenCV學習筆記(二十八)——光流法對運動目標跟蹤Video Ope
OpenCV學習筆記(二十六)——小試SVM演算法ml 總感覺自己停留在碼農的初級階段,要想更上一層,就得靜下心來,好好研究一下演算法的東西。OpenCV作為一個計算機視覺的開源庫,肯定不會只停留在數字影象處理的初級階段,我也得加油,深入研究它的演算法庫。就從ml入手
高斯混合模型(GMM)介紹以及學習筆記
1.高斯混合模型概述 高斯密度函式估計是一種引數化模型。高斯混合模型(Gaussian Mixture Model, GMM)是單一高斯概率密度函式的延伸,GMM能夠平滑地近似任意形狀的密度分佈。高斯混合模型種類有單高斯模型(Single Gaussian Model, S
kotlin學習筆記:object關鍵字介紹與java中的靜態變數與靜態方法的實現以及@JvmField和@JvmStatic的使用
在java中,靜態變數和靜態方法是我們經常需要用到的東西,但是我們在kotlin中,並不能找到static關鍵字。其實目前在kotlin中,也的確是static概念的,那麼我們該如何在kotlin中實現靜態變數和靜態方法呢?這時就要用到kotlin中的obje
C++學習筆記(11) 過載流插入運算子和流提取運算子,以及自動型別轉換
1. 過載<< 和>>運算子 <<和<<運算子可以被過載用於輸入輸出操作,在上一節中,我們對Rational物件進行輸出時定義了toString()類成員函式。如何通過cout << r 直接輸出Rational物件: 對於: r1
Opencv學習筆記(九)光流法
原創文章,轉貼請註明:http://blog.csdn.net/crzy_sparrow/article/details/7407604 本文目錄: 一.基於特徵點的目標跟蹤的一般方法 二.光流法 三.opencv中的光流法函式
指針與一維數組和二維數組以及字符串指針數組的學習筆記
個人 alt sizeof mage .com size 關系 指向 應該 廢話不多少,直接上代碼,關鍵的東西已經註釋了,看註釋信息理解即可。 說明:本程序討論了一維數組和指針的關系,談論了二維數組和指針之間的關系,討論了字符串數組指針數組和指針之間的關系,代碼中以給出定義
23種設計模式介紹以及單例模式的學習
單例模式 餓漢式 23種設計模式 gof23 1、GOF23 設計模式總共分成創建型模式、結構型模式和行為型模式三種: a、創建型模式: - 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式 b、構建型模式: - 適配器模式、橋接模式、裝配模式、組合模式、建造者模
Git學習筆記3——工作區與暫存區,以及版本變更
暫存區 所有 cto tag clas 內容 blank 文件 set 工作區(Working Directory) 就是你在電腦裏能看到的目錄,比如我的Git_Learning文件夾就是一個工作區。 版本庫(Repository) 工作區有一個隱藏目錄.git,這個不
Nginx學習筆記01Nginx簡要介紹與目錄說明
server 簡單 adt 服務器 網站目錄 interface simple 內核 優化 1.1. Nginx簡要介紹 (1)Nginx是Web服務器。 Apache、IIS:經典的通用Web服務器。 Lighttpd、Nginx:輕量級Web服務器。 Tomcat、