【opencv、機器學習】opencv中的SVM圖像分類(一)

1、圖像分類概述

本模塊是用在圖像內容識別的部分,圖像分類是利用計算機對圖像進行定量分析,把圖像中的每一個像元或區域劃歸爲若干個類別中的一種,以代替人工視覺判讀的技術。從目視角度來講,對圖像進行提升對比度、增長視覺維數、進行空間濾波或變換等處理的目的就是令人們可以憑藉知識和經驗,根據圖像亮度、色調、位置、紋理和結構等特徵,準確地對圖像景物類型或目標作出正確的判讀和解釋。 
特徵提取是計算機視覺和圖像處理中的一個概念。它指的是使用計算機提取圖像信息,決定每一個圖像的點是否屬於一個圖像特徵。特徵提取的結果是把圖像上的點分爲不一樣的子集,這些子集每每屬於孤立的點、連續的曲線或者連續的區域。根據各自在圖像信息中所反映的不一樣特徵,把不一樣類別的目標區分開來的圖像處理方法。它利用計算機對圖像進行定量分析,把圖像或圖像中的每一個像元或區域劃歸爲若干個類別中的某一種,以代替人的視覺判讀。html

2、本模塊完成的主要功能

該模塊做用是先對一些已經歸類好的圖片做爲輸入,再對一些未知類別的圖片進行預測分類。本模塊在該項目中能夠分出二維碼、logo、以及文字 。例如一給定圖像,檢測並讀取其中全部的條碼、logo、文字,即便他們處於任意的位置及角度,若是圖像中可能有任意數量及格式的條碼、logo和文字,輸出全部的條碼、logo和文字(1個或多個)。算法

3、svm圖像分類的基本流程

  1. 數據獲取 
    好比攝像機或視頻頭的輸出,經過採樣得到數據,也能夠是通常的統計數據集,其中的數據以向量或矩陣形式表示,或者是已經準備好的待檢測的圖片
  2. 訓練圖片特徵提取和選擇 
    特徵提取是指從對象自己獲取各類對於分類有用的度量或屬性。特徵選擇是指如何從描述對象的多種特徵中找出那些對於分類最有效的特徵。特徵提取咱們用到了surf算法。Surf具備比sift快的檢測速度。 
    對某一類模式的識別,其關鍵在於對模式特徵的描述以及如何去提取這些特徵。徵描述直接影響到特徵提取以及特徵向量庫的創建,並影響到最後分類識圖像的特徵提取和分類別精度的高低 從理論上講,個體的特徵是惟一的,這是由於不存在徹底相同的兩個個體。可是因爲客觀條件限制的存在,每每使得選取的特徵並非描述個體的特徵全集,而只是特徵的一個子集。所以,肯定物體的本質特徵是識別任務成功的關鍵。爲了提升特徵提取時計算的魯棒性,每每又要求用盡量少的特徵來描述物體,這使得在實際應用中特徵描述的不徹底性是不可避免的。
  3. 將這些feature聚成n類。這n類中的每一類就至關因而圖片的「單詞」,全部的n個類別構成「詞彙表」。個人實現中n取1000,若是訓練集很大,應增大取值。
  4. 對訓練集中的圖片構造bag of words,就是將全部訓練圖片中的feature歸到不一樣的類中,而後統計每一類的feature的頻率。這至關於統計一個文本中每個單詞出現的頻率。
  5. 分類器的設計(也就是訓練分類器) 
    利用樣本數據來肯定分類器的過程稱爲分類器設計。訓練一個多類分類器,將每張圖片的bag of words做爲feature vector,將該張圖片的類別做爲label。支持向量機(Support Vector Machines,SVM)應用發熱典型流程是首先提取圖形的局部特徵所造成的特徵單詞的直方圖來做爲特徵,最後被經過SVM進行訓練獲得模型。 
    在圖像分類中用到了一種模型叫作BOW (bag of words) 模型。Bag of words模型最初被用在文本分類中,將文檔表示成特徵矢量。它的基本思想是假定對於一個文本,忽略其詞序和語法、句法,僅僅將其看作是一些詞彙的集合,而文本中的每一個詞彙都是獨立的。簡單說就是講每篇文檔都當作一個袋子(由於裏面裝的都是詞彙,因此稱爲詞袋,Bag of words即所以而來),而後看這個袋子裏裝的都是些什麼詞彙,將其分類。若是文檔中豬、馬、牛、羊、山谷、土地、拖拉機這樣的詞彙多些,而銀行、大廈、汽車、公園這樣的詞彙少些,咱們就傾向於判斷它是一篇描繪鄉村的文檔,而不是描述城鎮的。 
    最後經過訓練好的模型,再次讀取未經分類的圖片,就能夠對其分類。 
    流程圖如圖所示: 
    這裏寫圖片描述

4、所用到的技術方法

  1. 特徵提取算法surf 
    有關surf算法的介紹網上有不少,在這裏我就不一一介紹,你們也能夠參考下面的文章:http://blog.csdn.net/yujiflying/article/details/8203511函數

  2. 聚類算法:Kmeans算法 
    k-means 算法接受參數 k ;而後將事先輸入的n個數據對象劃分爲 k個聚類以便使得所得到的聚類知足:同一聚類中的對象類似度較高;而不一樣聚類中的對象類似度較小。聚類類似度是利用各聚類中對象的均值所得到一個「中心對象」(引力中心)來進行計算的。 
    K-means算法是最爲經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一。K-means算法的基本思想是:以空間中k個點爲中心進行聚類,對最靠近他們的對象歸類。經過迭代的方法,逐次更新各聚類中心的值,直至獲得最好的聚類結果。 
    假設要把樣本集分爲c個類別,算法描述以下: 
    (1)適當選擇c個類的初始中心; 
    (2)在第k次迭代中,對任意一個樣本,求其到c各中心的距離,將該樣本歸到距離最短的中心所在的類; 
    (3)利用均值等方法更新該類的中心值; 
    (4)對於全部的c個聚類中心,若是利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,不然繼續迭代。 
    該算法的最大優點在於簡潔和快速。算法的關鍵在於初始中心的選擇和距離公式。 
    該算法流程首先從n個數據對象任意選擇 k 個對象做爲初始聚類中心;而對於所剩下其它對象,則根據它們與這些聚類中心的類似度(距離),分別將它們分配給與其最類似的(聚類中心所表明的)聚類;而後再計算每一個所獲新聚類的聚類中心(該聚類中全部對象的均值);不斷重複這一過程直到標準測度函數開始收斂爲止。通常都採用均方差做爲標準測度函數. k個聚類具備如下特色:各聚類自己儘量的緊湊,而各聚類之間儘量的分開。學習

  3. Bag of words(BOW)模型 
    最初的Bag of words,也叫作「詞袋」,在信息檢索中,Bag of words model假定對於一個文本,忽略其詞序和語法,句法,將其僅僅看作是一個詞集合,或者說是詞的一個組合,文本中每一個詞的出現都是獨立的,不依賴於其餘詞 是否出現,或者說當這篇文章的做者在任意一個位置選擇一個詞彙都不受前面句子的影響而獨立選擇的。 
    如今Computer Vision中的Bag of words來表示圖像的特徵描述也是很流行的。大致思想是這樣的,假設有5類圖像,每一類中有10幅圖像,這樣首先對每一幅圖像劃分紅patch(能夠是剛性分割也能夠是像Surf基於關鍵點檢測的),這樣,每個圖像就由不少個patch表示,每個patch用一個特徵向量來表示,咱就假設用SURF表示的,一幅圖像可能會有成百上千個patch,每個patch特徵向量的維數128。 
    接下來就要進行構建Bag of words模型了,假設Dictionary詞典的Size爲1000,即有1000個詞。那麼我們能夠用K-means算法對全部的patch進行聚類,k=1000,咱們知道,等k-means收斂時,咱們也獲得了每個cluster最後的質心,那麼這1000個質心(維數128)就是詞典裏的1000個詞了,詞典構建完畢。 
    對於bag of words 和K-means算法這一篇文章也挺容易理解的http://www.cnblogs.com/v-July-v/archive/2011/06/20/2091170.html優化

  4. svm分類器 
    支持向量機 (SVM) 是一個類分類器,正式的定義是一個可以將不一樣類樣本在樣本空間分隔的超平面。 換句話說,給定一些標記(label)好的訓練樣本 (監督式學習), SVM算法輸出一個最優化的分隔超平面(分類面)。具體能夠參考文章:http://blog.csdn.net/sunanger_wang/article/details/7887218搜索引擎

5、算法的分析

SURT採用henssian矩陣獲取圖像局部最值仍是十分穩定的,可是在求主方向階段太過於依賴局部區域像素的梯度方向,有可能使得找到的主方向不許確,後面的特徵向量提取以及匹配都嚴重依賴於主方向,即便不大誤差角度也能夠形成後面特徵匹配的放大偏差,從而匹配不成功;另外圖像金字塔的層取得不足夠緊密也會使得尺度有偏差,後面的特徵向量提取一樣依賴相應的尺度,發明者在這個問題上的折中解決方法是取適量的層而後進行插值。 
Bag of words方法沒有考慮特徵點的相對位置,而每類物體大都有本身特定的結構,這方面的信息沒有利用起來。用上面一向的類比,就好像搜索引擎只使用了單詞頻率,而沒有考慮句子同樣,沒有結構的分析。 
SVM有兩個不足: 
(1) SVM算法對大規模訓練樣本難以實施 
因爲SVM是藉助二次規劃來求解支持向量,而求解二次規劃將涉及m階矩陣的計算(m爲樣本的個數),當m數目很大時該矩陣的存儲和計算將耗費大量的機器內存和運算時間。針對以上問題的主要改進有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、張學工的CSVM以及O.L.Mangasarian等的SOR算法 
(2) 用SVM解決多分類問題存在困難 
經典的支持向量機算法只給出了二類分類的算法,而在數據挖掘的實際應用中,通常要解決多類的分類問題。能夠經過多個二類支持向量機的組合來解決。主要有一對多組合模式、一對一組合模式和SVM決策樹;再就是經過構造多個分類器的組合來解決。主要原理是克服SVM固有的缺點,結合其餘算法的優點,解決多類問題的分類精度。如:與粗集理論結合,造成一種優點互補的多類問題的組合分類器。spa

圖像分類的理論就講解到這裏,對於這個圖像分類的代碼的講解請參考下一篇文章。.net