第4章 圖像分類(image classification)基礎


第4章 圖像分類基礎

      一張圖片勝過千言萬語。我們不斷地攫取視覺內容,解釋它的含義,並且存儲它們以備后用。

       但是,對於計算機要解釋一張圖片的內容是很難的,因為計算機看到的圖片是一個大的數字矩陣,它對圖像傳遞的思想、知識和意義一無所知。

 

       為了理解圖像的內容,我們必須應用圖像分類(image classification),這是使用計算機視覺和機器學習算法從圖像中抽取意義的任務。這個操作可以簡單的為一張圖像分配一個標簽,如貓、狗還是大象,或者也可以高級到解釋圖像的內容並且返回一個人類可讀的句子。

       圖像分類是一個非常大的研究領域,包括各種各樣的技術,隨着深度學習的普及,它還在繼續發展。

 

       現在,是時候來駕馭深度學習與圖像分類的浪潮了!

 

       圖像分類和圖像理解是目前(並將繼續是)未來十年最受歡迎的計算機視覺子領域。

       在本章中,我將提供圖像分類的高級概述,以及圖像分類算法必須克服的許多挑戰。我們還會復習與圖像分類和機器學習相關的三種不同學習類型。最后,我們將通過討論四個步驟來總結本章,這四個步驟是如何訓練一個用於圖像分類的深度學習網絡,以及這四個步驟是如何與傳統的手工設計的特征提取管道進行比較的。

 

1          圖像分類是什么?

  圖像分類,核心是從給定的分類集合中給圖像分配一個標簽的任務。實際上,這意味着我們的任務是分析一個輸入圖像並返回一個將圖像分類的標簽。標簽總是來自預定義的可能類別集。

  示例:我們假定一個可能的類別集categories = {dog, cat, panda},之后我們提供一張圖片(圖1)給分類系統:

 

圖1 圖像分類目標是根據輸入圖片且根據預定義類別分配標簽

  這里的目標是根據輸入圖像,從類別集中分配一個類別,這里為dog。

  我們的分類系統也可以根據概率給圖像分配多個標簽,如dog:95%,cat:4%,panda:1%。

  更一般的,給定三個通道的W*H像素,我們的目標是取W*H*3=N個像素且找出正確分類圖像內容的方法。

 

1.1  關於術語的說明

  當執行機器學習和深度學習時,數據集(dataset)是我們嘗試提取知識的地方。在數據集中的每個例子/條目(可能使圖像數據、文本數據、語音數據)稱為數據點(data point)。

 

圖2 數據集是數據點的集合

  我們的目標是應用機器學習和深度學習算法來發現在數據集中的潛在模式,使我們能夠正確的分類我們的算法還沒有遇到的數據點(即泛化性能)。現在考慮下面的術語:

  (1)    在圖像分類方面,我們的數據集就是圖像的集合;

  (2)    因此,每個圖像就是一個數據點。

  注意:在后續過程中,我們將圖像和數據點交替使用,可認為是同一個意義。

1.2  語義上的差異

  看圖3上部的左右圖像,我們能夠很容易的分辨出貓和狗,但是對於所有計算機來說看到的則是對應於圖3下部左右的大的像素矩陣。

 

圖3 上:人類認知圖片的方式 下:計算機看到圖片以矩陣方式

  考慮到計算機看到的是大的像素矩陣,我們引入語義差異(semantic gap)問題。語義差距是人對圖像內容的感知方式與計算機能夠理解圖像過程的表現方式之間的差異。

  再次,人類可以快速揭示出圖3上部兩幅圖的差異,但是計算機卻不知道圖中有動物存在。為了更清晰解釋,看圖4:

 

圖4 當描述圖片內容時,我們可能關注空間層次、顏色、質地傳遞的內容——計算機視覺算法也是同樣關注這些

  我們可能描述圖像如下:

  (1)    空間:天空在圖像上部,沙灘和海洋在底部;

  (2)    顏色:天空是深藍色,海水顏色比天空淺,而沙子是黃色的;

  (3)    質地:天空比較均勻,沙子較粗糙

 

  那么,我們怎么編碼這些信息使得計算機能夠理解?答案就是應用特征提取(feature extraction)來量化圖像的內容。特征提取是輸入一副圖像、實施一個算法、且獲得量化我們圖像的一個特征向量(feature vector)(例如,一系列數字)的過程。

為了完成這個過程,我們可以考慮使用手工設計的功能,如HOG、LBPs或其它傳統方法來度量圖像。而本書中采用的是另一種方法,即應用深度學習來自動學習一系列特征,這些特征可以用來度量且最終標記圖像本身的內容。

  但是,一旦我們開始檢查真實世界的圖像,我們將面臨很多很多的挑戰。

 

1.3  挑戰

  如果語義差異還不是一個大問題,那么我們還要處理圖像或對象的變化因素(factors of variation)。圖5顯示了不同的變化因素:

 

圖5 我們需要認識到物體是如何在不同的視點、光照條件、遮擋和尺度等等下出現的。

  首先,我們看視點變化(viewpoint variation),即物體對應於是如何被拍照或獲取的造成是原始還是多維度旋轉的圖像,但不管怎么視點變化,樹莓派還是樹莓派如圖5左上所示。

  我們還將面對縮放變化(scale variation),如圖5的scale variation所示,無論如何縮放除了大小size不同,它們是同樣的東西。圖像分類方法必須適應這種變化。

  最困難的則是變形(deformation),如圖5的deformation所示,所有這些圖像都包含了圖像的特性,但是它們之間都是彈性、扭曲、動態變化的。

  圖像分類還應當處理閉合變化(occlusions variation),即如圖5的occlusion variation所示,兩幅圖中都是狗,但是右圖被隱藏在其它圖像之下,圖像分類應當能夠處理這種情況。

  就像變形和閉合的挑戰一樣,我們還要面臨光照變化(illumination variation),如圖5所示,我們應當能夠分類出同樣得到咖啡杯,但是由於光照使得他們看起來很不同。

  我們還要處理背景雜亂(background clutter),如圖5所示,當我們需要在雜亂背景下要分類出圖像的特定物體時,對於我們都是困難的,何況是電腦了。

  最后,我們還要處理類內變化(intra-class variation),如圖5所示,同樣的椅子確有不同的種類,而我們的圖像分類算法必須能夠識別出所有正確的種類。

 

  有沒有感到一點困難?更困難的是,圖像分類器不僅僅是面對上述單個的變化,往往面臨着多個變化的聯合。

  那么,我們該如何處理如此多的變化呢?一般來說,盡最大努力去做。我們對圖像的內容和希望容忍的變化做出假定,我們也考慮項目的最終目的是什么?以及我們嘗試去構建什么樣的系統?

  部署到現實世界中的成功的計算機視覺、圖像分類和深度學習系統,在編寫一行代碼之前,要做出謹慎的假設和考慮。如果你的方法過於寬泛,如我想對廚房里的每一件物品進行分類,那么你的分類系統很可能不是很好。但是如果你把問題縮小,如我想對火爐和冰箱進行分類,那么你的分類系統更容易獲得較高的准確率。

  這里的關鍵是要始終考慮圖像分類器的范圍。盡管深度學習和CNNs在不同的挑戰下具有極大的魯棒性和分類能力,但是你仍然要關注項目的范圍盡可能緊致且定義明確。

 

  深度學習不是魔法,它有時是很有力的工具但是如果使用不當也是很危險的。在這本書的其余部分,我將指導你的深度學習之旅,並幫助你指出什么時候你應該使用這些強力的工具,什么時候你應該使用更簡單的方法(或者提到是否一個問題用圖像分類來解決是不合理的)。

 

2          學習的類型

  在深度學習和機器學習領域主要有三種學習類型:監督學習、非監督學習和半監督學習。本書主要關注深度學習背景下的監督學習。這里將簡要描述三種類型。

2.1  監督學習

  監督學習是機器學習中研究最廣泛的一類。給定訓練數據,創建一個訓練過程的模型(分類器),這個模型對輸入數據做出預測且預測不准確時將進行糾正。持續這個訓練過程直到達到一些期望的停止准則,如較低的錯誤率或達到最大的訓練次數等。

  常見的監督學習算法包括Logistic Regression、Support Vector Machines(SVMs)、Random Forests和ANN。

  在圖像分類的背景下,我們假定圖像數據集包括圖像本身和對應的分類標簽(class labels),分類標簽用於訓練機器學習分類器將每個種類看起來像什么。如果分類器做出了錯誤預測,則可以運用一些方法來糾正錯誤。

  即監督學習中,每個數據點都由標簽、特征向量構成。

 

2.2  非監督學習

  與監督學習對應,非監督學習(也稱為自學)沒有標簽數據,只有特征向量。

  非監督學習是機器學習和深度學習的“聖杯”。因為現實世界中很容易獲得大量無標簽數據,如果我們能夠從無標簽數據中學的模式,那么可以不必花費大量時間和金錢來標記標簽數據用於監督學習。

  經典的非監督學習機器算法包括PCA和K均值。應用到神經網絡,有Autoencoders、Self Organizing Maps (SOMs)和Adaptive Resonance Theory可用於非監督學習。非監督學習是一個極其活躍的、還沒有解決的領域,本書將不關注非監督學習。

 

2.3  半監督學習

  如果一部分數據有標簽,另一部分沒有標簽,則稱之為半監督學習。

  半監督式學習在計算機視覺中尤其有用,因為在訓練集中,給每一張圖片都貼上標簽通常是費時、乏味和昂貴的(至少在工時方面)。我們可以對數據中的一小部分標簽,然后利用半監督學習給剩余的數據進行標簽和分類。

  半監督學習算法常工作在較小的數據集上在可以容忍的精確度下。即半監督學習考慮了精確度與數據大小的關系,在可容忍的限度下保持分類精確度,可以極大的降低訓練的數據量大小。半監督學習常見的選擇包括label spreading、label propagation、ladder networks和co-learning/co-training。

 

  再次,我們在本書中主要研究監督學習,因為非監督和半監督學習在計算機視覺的深度學習背景下的研究仍然是非常新的領域且還沒有清晰的方法可以使用。(該書是2017年出版的,那么可能寫作是在2015-2016?那么現在為2018年,是否還沒有清晰的方法???)

 

3          深度學習分類步驟

  通過前兩節的學習,你可能會開始覺得在構建一個圖像分類器時,新的術語、考慮和看起來不可逾越的變化會給你帶來一些壓力,但事實是,一旦你理解了這個過程,構建一個圖像分類器是相當簡單的。

  在本節中,我們將回顧當在深度學習工作中需要考慮的在心態方面的一個重要轉變。我們將回顧在構建一個深度、基於學習的圖像分類器的4個步驟,並且對比傳統的基於特征的機器學習和端到端的深度學習。

3.1  心態的轉變

  我們可能寫過成百上千的基於過程的或基於對象的函數,這些函數都有很好的定義,且很容易的驗證其結果。

  不幸的是,在深度學習和圖像分類中不是這樣的過程。

  對於貓、狗的圖片,我們不能簡單的編寫確定的語句來識別它們,因此,與其試圖構建一個基於規則的系統來描述每個類別的“外觀”,我們可以采用基於數據驅動的方法,提供每個類別的示例,然后教我們的算法使用這些示例識別類別之間的差異。

  我們輸入這些打上標簽的訓練數據集,在訓練集中的每個數據點包括:

  (1)    一張圖像;

  (2)    這張圖像的標簽或分類。

3.2  步驟一:收集數據集

  構建深度學習網絡的第一個部件是收集最初的數據集。我們需要圖像本身和與圖像相關的標簽。標簽應當是一個有限的類別集合。

  此外,每個種類中的圖像數據應當是均勻的(例如,每個類別的圖像數目相同)。如果數目不同則造成類別失衡,類別失衡是機器學習的常見問題,我們在后續中來介紹不同的方法,但是注意避免類別失衡產生的學習問題的最佳方法是避免類別失衡。

3.3  步驟二:划分數據集

  既然我們有了數據集,我們需要划分成兩部分:

  (1)訓練集(training set)

  (2)測試集(testing set)

  我們的分類器使用訓練集通過在輸入數據上做出預測來“學習”每個類別看起來像什么,且當預測錯誤的時候分類器做出糾正。分類器完成訓練之后,我們可以在測試集上評估性能。

  訓練集和測試集是互相獨立且互不重疊,是極其重要的!!!常見的訓練集和測試集划分為66.7%/33/3%,75%/25%,90%/10%,如圖6所示:

 

圖6 常見訓練集和測試集划分

       這些划分是合理的,那么我們需要調整的參數是什么呢?神經網絡中有一些控制參數(如學習率、衰減因子、正則化因子等)需要調整以達到網絡最佳性能,這些參數我們稱之為超參數(hyperparameters),它們設定的合理是極其重要的。

       實際上,我們需要一堆超參數且需要識別出最佳的超參數集合。你可能想使用測試集來調整這些超參數值,再次注意:測試集僅僅用作評估網絡性能!

       而是,我們需要第三個划分的數據集稱為驗證集(validation set),這個數據集合通常來自訓練集且用作“假測試數據”,用於調整超參數。僅在我們使用驗證集確定了超參數值之后,我們才會在測試集上收集最終的精確度結果。

       我們通常分配訓練集的10%—20%用於驗證。

       划分數據集聽起來很復雜,實際上,將在下一章將要講到的,歸功於python的scikit-learn庫,我們可以使用一行代碼即可划分。

3.4  步驟三:訓練網絡

  給定圖像的訓練集,我們現在可以訓練網絡了。我們網絡的目標是學習怎樣識別標簽數據中的每個類別。當網絡做出錯誤預測時,它將從錯誤中學習且提高自己的預測能力。

  那么,真實的“學習”是怎樣工作的?一般來說,我們使用一種梯度下降的形式(a form of gradient descent),將在第9章中介紹。本書的剩余部分將從頭來例證怎樣訓練神經網絡,因此這里我們推遲它,直到需要時再進行詳細的訓練過程討論。

3.5  步驟四:評估

  最后,我們需要評估我們訓練的網絡。對於測試集中的每個圖像,送入網絡中且網絡預測它認為這張圖像的標簽是什么。之后,我們的網絡模型將測試集中對圖像的預測結果列表化。

  最后,這些模型預測將與測試集的真實標簽結果進行比對。我們將能夠計算出模型預測的正確的數目,且獲得一些聚合報告,如精確度(precision)、召回率(recall)、f-度量(f-measure)等,這些參數通常用來度量整個網絡性能。

3.6  圖像分類:基於特征的學習VS深度學習

  傳統上,對於圖像分類的基於特征的學習,實際上是在步驟二和步驟三中間插入一個步驟:特征提取(feature extraction)。在這一階段,我們采用手動設計的算法如HOG、LBPs等,基於我們想編碼(例如形狀、顏色、質地等)的圖像的特定部分來度量圖像的內容。給定這些特征,我們之后執行訓練網絡和評估網絡。

  當構建CNNs網絡的時候,我們實際上跳過了特征提取的步驟。原因是CNNs是一個端到端的模型。我們將原始輸入數據(像素)輸入網絡。然后網絡學習隱藏層內的過濾器,這些過濾器可以用來區分對象類。網絡的輸出是類別標簽上的概率分布。

  其中一個激動的方面是,我們可以讓CNNs自動的學習特征而不需要手動設計特征。但是這種權衡是有代價的。訓練CNNs是一個不平凡的過程,所以要准備好花大量的時間讓自己熟悉這些經驗,並做很多實驗來確定什么是有效的,什么是無效的。

3.7  當預測不正確時,發生了什么?

  我們訓練好了網絡,也在測試集上獲得了良好的性能,但是當我們的網絡對不在訓練集也不在測試集中的其它外部未見到的圖像進行預測時,獲得了較差的性能,這個問題稱之為泛化(generalization)。泛化是網絡泛化的能力,即正確的預測即不存在訓練集也不存在與測試集中的圖像的類別標簽的能力。

  網絡的泛化將在本書多次討論,這里僅是大概介紹。當不能正確的預測圖像分類時,不要沮喪,要考慮第2章中提到的變化因素。你的訓練集正確的反映了這些變化因素嗎?如果沒有,那么你需要收集更多的訓練數據(且需要讀本書的剩余部分,來學習其它技術來克服泛化)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM