【CS231n_2017】2-Image Classification

圖像分類

  圖像分類是計算機視覺的核心問題之一,可以理解爲從一組固定的類別中爲輸入圖像貼上對應標籤,說明該圖像屬於哪一類。雖然圖像分類問題比較簡單,但它有着很多的實際應用,像目標檢測、圖像分割這些看似不同的計算機視覺任務,都能簡化成圖像分類問題。

  在CS231n課程中,需要用到Python和Numpy,附上基礎知識教程:Python簡單入門Numpy簡單入門

  舉個簡單的例子,如下圖所示。我們的任務是識別圖像中的物體,可能是貓、狗、帽子、馬克杯中的一種,這對機器來說是一個難題。圖像是有很多像素點組成的,每個像素對應着RGB三個通道的值,如果圖像大小爲800×600,那麼它的數據量則有800×600×3。通過圖像分類算法的計算,我們得出該物體是貓的可能性最高,這樣容易推導出,圖像中的識別對象是一隻貓。


挑戰

  當我們去檢測識別對象時,會遇到一些問題與挑戰。一個好的圖像分類模型要求能適應性地處理多種問題,保持對類間變化的靈敏度。

  • 視角變化(Viewpoint variation):對同一識別對象,觀察位置不同,看到的樣子也就不同。
    這裏寫圖片描述
  • 光照影響(Illumination):光照的影響在像素級上是非常明顯的。
    這裏寫圖片描述
  • 形狀變化(Deformation):很多識別對象都不是剛體,比如一隻貓,它的姿態可以千奇百怪。
    這裏寫圖片描述
  • 遮掩(Occlusion):如果識別對象被部分遮擋,該如何檢測?比如,如何僅僅通過貓的頭部或是貓的尾巴就能辯認出這是一隻貓。
    這裏寫圖片描述
  • 背景干擾(Background clutter):識別對象可能會融入到它們所處的環境中,使得難以識別。
    這裏寫圖片描述
  • 類間差異(Intraclass variation):相同的一類對象可能有很多不同的類型,即“一豬生九仔,連母十個樣”。
    這裏寫圖片描述

數據驅動方法

  在圖像分類中,首先要收集大量數據,每一個類別都應有大量的圖像樣例,稱之爲訓練數據集,然後纔是不斷改進算法。

  具體方法步驟是:

  • 大量收集圖像及對應標籤的數據集。數據集,也稱訓練集,應包含足夠多的圖像,每個標籤都有多個不同的類。
  • 使用機器學習訓練分類器。我們的任務是讓分類器通過訓練集辨識不同類別的樣子。
  • 在新的圖像上評估分類器的分類效果。將分類器的預測結果與真實標籤進行對比,從而對分類器進行評估。理想的效果是預測標籤與實際標籤相同。

最近鄰分類器

  最近鄰分類器(Nearest Neighbor Classifier)與CNN卷積神經網絡無關,在實際工作中也很少用到,但它能讓我們對圖像分類問題的基本方法有個大概瞭解。

  這裏我們介紹一個數據集,名爲 CIFAR-10。CIFAR-10是一個有名的圖像分類數據集,包含了60000張圖像(32×32),對應十個標籤。其中,50000張是訓練集,10000是測試集。下圖是CIFAR-10數據集的部分圖像,劃分爲10類。右邊第一列是測試圖像,其餘列是通過最近鄰分類方法在訓練集中搜尋的最相似的十張圖像。(從這裏,我們可以知道,Nearest Neighbor Classifier爲什麼很少應用於實際)

  如何實現最近鄰分類器呢?最簡單的方法就是比較兩張圖像像素間的差異,然後把所有的差異相加。給定兩張圖像I1和I2,可以通過 ‘L1 distance ’ 來定義。

d1(I1,I2)=p|Ip1Ip2|


  一般來說,如果在 CIFAR-10 數據集上進行分類測試,準確率只能達到38.6%,雖然比隨機預測的10%要高,但無法與CNN高達95的準確率對比。

  計算兩個圖像向量的距離的方法還有很多種,比如 ‘L2 distance’ ,即計算兩個向量間的歐式距離。

d2(I1,I2)=p(Ip1Ip2)2

  在實際運算中,我們可以忽略根號,因爲它是單調函數,雖然改變了距離大小的絕對值,但是不會造成影響。在 CIFAR-10 數據集上進行測試,只能得到35.4%的準確率,低於L1 distance。當兩張圖像差異較大時,L2 distance的值會明顯大於L1 distance。L1 distance 和 L2 distance 都是最常用的 p-範數的特例。

  最近鄰分類器的一個優點是容易理解與實現,另外,該分類器不需要訓練時間,因爲它只是存儲訓練數據,也可能需要爲訓練數據編索引。然而,它需要大量時間進行測試,當對一張圖像進行分類時,需要遍歷地去對比所有圖像樣本。在實際工作中,我們更關心測試時間而非訓練時間。以深度神經網絡爲例,雖然訓練成本很高,但是一旦訓練工作完成,測試新樣本的成本就非常低了。

  最近鄰分類器的計算複雜度是一個活躍的研究領域,有很多的近似最近鄰(ANN:Approximate Nearest Neighbor)算法和庫,能夠加速數據集如FLANN中的最近鄰檢索。 這些算法允許在檢索期間利用其空間複雜度或是時間複雜度來權衡最近鄰檢索的正確性,並且通常依賴於涉及構建kdtree或運行k均值算法的預處理階段或索引階段。


k最近鄰分類器

  k最近鄰分類器(k - Nearest Neighbor Classifier)要比最近鄰分類器實現效果更好。不同於在訓練集中尋找單個最相似的圖像,k最近鄰分類器所採用的方法是尋找k個最相似的圖像,根據這k個圖像爲測試圖像貼上對應標籤。

  很明顯,當k的值爲1時,就是最近鄰分類器。k值越大,實現的效果越平滑,異常值造成的干擾越小。


  其中,NN classifier使用的是L2 distance方法,5-NN classifier中白色部分是指分類不明確的區域。對於異常值,NN classifier圖中生成了錯誤預測的孤立區域,而在5-NN classifier圖中,則是以平滑的方式進行處理。

  K最近鄰分類器在實際工作中幾乎不會用到。首先,它在測試階段非常緩慢,需要耗費大量時間。其次,圖像間的距離信息意義不大,當對圖像中同一識別對象進行遮掩、平移、變色後,很難辨識出這是相同的對象。最後,它會造成維數災難。一維中需要4個點,二維圖像需要42 即16個點,三維圖像需要43 即64個點,以此類推。



超參數調整的驗證集

  在k最近鄰分類器中,k值設定爲多少才最合適呢?在本文前段中,已經介紹了L1範數和L2範數,但還有很多選擇還未考慮。這些選擇就叫做超參數,在機器學習設計算法時頻繁出現。

  值得注意的是,我們不能使用測試集來調整超參數。因爲測試集數據應被視爲珍貴的資源,在機器學習算法中,除了最後的測試階段,其餘階段儘量不要使用測試集。另一個原因是,如此調整超參數後,把測試集數據當成了訓練集數據,這樣分類器能在測試集中很好地運行,但部署模型時將會出現明顯的性能降低。

  於是提出了一個調整超參數的較好方法,它將訓練集中的小部分數據劃分出來,稱之爲驗證集。以 CIFAR-10 爲例,將50000的訓練集數據劃分成49000的訓練集和1000的驗證集。

交叉驗證

  交叉驗證是一種更爲複雜的調整超參數的方法。當訓練集數據的規模過小時,驗證集的規模自然也很小,交叉驗證能很好解決這一問題。

  之前調整超參數的方法是隨機選取1000個數據作爲驗證集,而交叉驗證則是迭代不同的驗證集,並求這些驗證集的平均性能。在k折交叉驗證中,我們將訓練集劃分爲均等的k份子樣本,其中k-1份用於訓練,1份用於驗證。如此重複k次,每個子樣本驗證一次,對這k次的結果求平均,最終得到一個單一估測。

  以5折交叉驗證爲例,將訓練集train data劃分爲均等的5份子樣本,其中4份用於訓練,1份(黃色部分)用於驗證。迭代重複,每個fold都將被視作驗證集,最後對這5次的結果求平均,得到5折交叉驗證的準確率。

  圖中橫軸是k值,縱軸是交叉驗證的準確率,當k值大約取7時,能達到最高的準確率。

  在實際工作中,交叉驗證計算昂貴,所以一般都是使用單次驗證而非交叉驗證。一般是將訓練集中50%~90%的數據作爲驗證集,當然,如果超參數數值過大時,我們需要用到更大的驗證集。當樣本數量過少時,才優先考慮交叉驗證。


發佈了99 篇原創文章 · 獲贊 210 · 訪問量 40萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章