1. 程式人生 > >OpenCV系統學習(基本瞭解完)

OpenCV系統學習(基本瞭解完)

視訊壓縮編碼 CV_FOURCC('M','J','P','G')

預定義型別 CV_<位深>(S|U|F)C<通道數>,例如CV_8UC3

8.線性濾波http://blog.csdn.net/poem_qianmo/article/details/22745559

跟蹤與運動

理解物體的運動,包含識別和建模

識別:

經典的跟蹤不明物體的方法,是跟蹤關鍵點。這樣就可以給出物體實際位置的初步計算,第二部分就是建模。

角點,獨一無二,兩個正交方向都有明顯變化,例如Harris角點。

我們使用每個點周圍小視窗的二階導數影象的自相關矩陣有兩個最大特徵值的地方,即本質上,表示此點為中心周圍存在至少兩個不同方向的紋理(或者邊緣)。這樣的點,對移動和旋轉有不變性。還有SIFT縮放,旋轉不變。

光流,連續兩幀之間的位移關聯。

幾種不同的跟蹤方法

稀疏光流:Lucas-Kanade方法,不足之處在於不能跟蹤運動過快的物體,較大的運動會移出設定的視窗,金字塔LK,則可以解決該問題。

稠密光流:Horn-Schunck,塊匹配,比LK慢很多,不支援影象金字塔匹配,不能跟蹤大幅度運動

Horn-Schunck,基於亮度恆定假設,用速度的平滑約束,求解方程組,其效果是懲罰光流變化的劇烈區域。

塊匹配,將影象劃分成小塊,計算這些小塊的運動,因此返回的速度影象解析度較低,

mean-shift:,常用於計算機視覺,即選擇一個視窗(設定視窗型別,大小,形狀),計算其重心,將視窗中心設定在重心出,重複計算,最後收斂。

camshift會自動調整視窗大小,

運動模板,在姿態識別中應用廣泛,需要知道物體輪廓或者輪廓的一部分。其實就是根據輸入的輪廓,建立運動歷史模板,然後計算出該模板的梯度,獲取區域性運動和全域性運動方向,其中區域性運動做刪除,同時要消除特別大的梯度。

最後一種,就是預估器,首先根據之前的資訊,預測出當前的位置,然後根據測量值進行矯正。常用的有卡爾曼濾波器,以及condensation演算法。兩者的區別在於狀態概率密度如何描述。

攝像機模型與標定

投影與三維視覺

雙目測距

機器學習

OpenCV實際上主要介紹的機器學習是統計性機器學習,傾向於鑑別演算法,即通過給定的資料來判斷類別,而不傾向產生式演算法,即通過給定類別來生成資料的分包,鑑別式演算法在根據給定的資料做出預測上有優勢,後者在是在為你提供更強大的資料表達或者有條件的生成新資料上有優勢。

OpenCV中的學習演算法有:

馬氏距離,多維空間中兩點相似性的度量,本身不是聚類或者分類演算法

K均值,嘗試找到自然分類,最常用聚類技術,與高斯混合中的EM很相似,

樸素貝葉斯分類器,最簡單的監督學習分類器,也叫正態貝葉斯分類器,簡單是因為假設所有特徵之間相互獨立,雖然這在現實很少,但它有時能獲得驚人的效果,也是貝葉斯網路的最簡單情況。

決策樹,執行簡單,容易解釋結果,適應不同的資料型別,能夠處理資料丟失,通過分裂的順序能夠給資料特徵賦予重要性,是Boosting,隨即森林的基礎。

Boosting,內部使用了決策樹,通常是ML庫中最好的監督演算法。從弱分類器中加權賦值生成強分類器。有discret/real/logit/gentle AdaBoost。OpenCV執行時一個兩類分類器。

隨即森林,通過收集很多數的子節點對各個類別的投票,選擇投票最多的類別作為判別結果。

Haar分類器

EM,聚類演算法,OpenCV僅僅支援高斯混合模型的EM,通過迭代先找到給定模型時的最大可能性的猜想,然後調整模型使得猜想正確率最大。

K近鄰,只儲存所有訓練樣本資料,如果需要分類一個新的資料樣本,只需要找到她的K個最相鄰的點,然後統計哪個類在這K近鄰點中頻率最高,然後標記為出現頻率最高的類,佔用記憶體大,速度慢,使用這個演算法前把訓練集聚類來降低資料的大小。

神經網路,MLP,也叫反向傳播,效能最好的分類器之一,尤其在文字識別方面,訓練很慢,使用梯度下降來調整網路節點之間的連線權來最小化誤差。測試模式時,速度很快

支援向量機,當資料集比較小時,SVM效果很好,它首先把資料集對映到高緯空間,然後再高維空間找到類別間最優的線性分類器,而這種線性分類器在原始資料空間中可能是非線性的,因此使用基於最大類間隔的線性分類技術,得到某種意義上較優的區分類別的非線性分類器。

如何在視覺中使用機器學習

1.怎樣採集資料,採集資料,給資料標籤,需要提取那些特徵,資料分類(訓練集,驗證集,測試集)。

2.選擇分類器,需要考慮計算速度,資料形式,記憶體。

需要快速訓練,則最鄰近演算法,樸素貝葉斯分類器,決策樹。

需要考慮記憶體,決策樹和神經網路

不需要快速訓練,需要快速判斷,則神經網路,樸素貝葉斯,SVM

不需要訓練很快,但精度要高,則可選擇boosting,隨即森林

如果選取特徵較好,僅僅需要一個簡單的特徵就可以分類,就選擇決策樹和最鄰近演算法

同時,我們需要評估每個變數的重要性,即對分類器的貢獻,二進位制決策樹可以解決該問題,即在每個節點選擇最能夠分裂出資料的變數。知道了變數重要性,可以減少特徵個數。提高訓練和測試速度、Breiman有個變數重要性演算法,理論上該技術適用於任何分類器,但OpenCV只在決策樹和隨即森林中實現了。

機器學習的效能診斷有兩種,一種是過擬合,一種是欠擬合。前者受噪聲影響,後者模型假設太嚴格。

通常資料量越大越好,好的特徵比好的演算法更重要。同時要注意是否正在解決自己想要解決的問題。也可能出現模型無法學習資料,這時你要考慮特徵是否選對。

評估機器學習的工具有,交叉驗證(將資料分為K,取K-1訓練,餘下的測試,做K次,結果平均),自抽樣(與交叉驗證類似,但驗證集從訓練集隨機選擇,選擇的點僅用於測試,不用於訓練,做N次,最後的結果平均,一般好於交叉驗證),還有就是畫ROC曲線,填充混淆矩陣

另外,我們常常對錯誤識別賦予更大的權值,例如每個錯誤識別的權值設為錯誤拒絕權值的10倍,這在SVM和決策樹中,通過指定類別的先驗概率,自動平衡擊中率和誤報率。

還要注意,對於特徵向量,如果特徵的方差不一致,某些演算法會對個數較小的特徵進行忽略,因此,需要預處理特徵向量,使得他們的方差一致。如果特徵不相關,這步非常重要。如果相關,則可用協方差或者平方差歸一化。決策樹等一類演算法不受方差不一致影響,如馬氏距離,K均值演算法等需要注意這一點。