Convolutional Neural Networks for Visual Recognition 1
Introduction
這是斯坦福計算機視覺大牛李菲菲最新開設的一門關于deep learning在計算機視覺領域的相關應用的課程。這個課程重點介紹了deep learning里的一種比較流行的模型:Convolutional Neural Networks,簡稱CNN,主要利用CNN來做visual recognition,或者說是image classification,object recognition等。我自己在學習的過程中,一邊翻譯一邊總結,整理出這些中文版的lecture notes,英文好的同學可以直接看原文,課程的網址是:
http://cs231n.stanford.edu/
學習這門課程,需要一定的數學基礎,包括線性代數,概率論,統計等,還要對傳統的機器學習有一定的了解,可以參考斯坦福大學機器學習大牛Anderw的課程,另外一個前提條件是編程,這門課程沒有用matlab,而是用了當下比較流行的一種語言python,課程中所有的程序都是用python寫成的,所以還要學習python編程,這門課程對python有簡單的介紹,并且還推薦了相應的python版本及編譯器,這些信息都可以在課程網站上找到。
我在這里轉譯的中文lecture notes,認為大家都已經搞定了上述所需的前提條件,就是有一定的數學基礎,也了解機器學習,并且安裝了相應的python和IDE(推薦Eclipse+Pydev),能夠利用python進行編程。所以沒有這些基礎知識。下面是正式的課程內容。
Image Classification
首先介紹的是計算機視覺領域一個重要而基礎的問題:圖像分類。簡單來說,就是將一幅圖像賦以一個語義標簽,對這幅圖像進行標識,如下圖所示:
圖像分類的任務就是將一個給定的圖像賦予一個或者一組語義標簽。
我們看到的是一只貓,但是對于計算機來說,看到的只是一個三維的數組,這個圖像是248個像素寬,400像素高,而且有R,G,B三個通道,所以是一個248×400×3的數組,一共有296700個像素,每個像素的值在0-255的范圍內,圖像分類的任務就行將這所有的像素用一個語義標簽進行標識,比如“cat”。
一般來說,對于visual recognition,我們需要解決以下一些困難或挑戰:
Viewpoint variation:一個物體由于照相機拍攝的視角不同,會呈現不同的方向。
Scale variation: 尺度的變化,這是比較常見的一個問題。
Deformation: 有些物體可能會發現形變。
Occlusion: 物體的局部有可能被遮擋。
Illumination conditions:光照條件的變化有可能改變圖像的像素值的分布。
Background clutter: 背景紋理與物體的紋理相似的話,會對識別造成很大影響。
Intra-class variation: 即使屬于同一類的物體,也有可能呈現不同的形狀,比如椅子,杯子等。
一個好的圖像分類模型,應該能夠很好地處理這些問題。
我們如何寫一個算法來做這項工作呢,這個不像排序那么簡單,因為我們不能直接寫一個算法來確定圖像里的物體。因此,一般來說,我們會先給計算機一些樣本,通過這些樣本讓計算機了解每一類物體的性質,這種方法稱為data-driven(數據驅動),因為這類方法要依賴于事先收集的一些訓練數據。下圖給出了一些訓練數據的示例:
在實際的應用中,可能會有幾千個類別而每一類可能會有成千上萬個樣本。一個完整的圖像分類模型包含以下幾個步驟:
Input:我們的輸入包括N張圖像,每張圖像都有相應的標簽,這些標簽屬于K個不同的類別,這組圖像稱為訓練集。
Learning: 我們的任務是通過訓練集讓計算機知道每一類的性質,這個過程稱為訓練階段或者學習階段。
Evaluation: 最后,我們要用訓練好的模型來評估一些從未見過的圖像,對這些圖像進行分類,并將預測標簽與該圖像的真實標簽比較。
Nearest Neighbor Classifier
我們先介紹一種很簡單的分類模型:最近鄰分類器,這個模型與我們將要介紹的CNN沒有什么關系,而且在實際應用中,也很少用到這個模型,但是可以用這個模型來了解圖像分類的處理流程。
這里我們要用到的數據庫是:\textbf{CIFAR-10},這是一個非常流行的用于圖像分類的數據庫,這個數據庫包含10類圖像,一共含有60000張圖,每張圖的寬和高都是32,每張圖都有一個類標簽,這60000萬張圖分成兩部分,其中50000張圖作為訓練集,剩下的10000張圖作為測試集。下圖給出了該訓練集的一些樣圖:
左圖:訓練集里的一些樣圖。右圖:第一列是測試圖,其它圖是與該測試圖最相似的訓練圖。
現在,假設我們有這樣一個數據庫,包含屬于10個類別的共50000個訓練樣本,每個類別有5000張圖,最近鄰分類器拿到一張測試圖,會將該測試圖與訓練集的每一個
樣本進行比較,挑出離該測試圖最近的訓練樣本,并且將該訓練樣本的類標簽賦給該測試圖,換句話說,離該測試圖最近的樣本是什么類,那么該測試圖就屬于該類,
我們可以看到,利用這個分類器,上面右邊的10個測試樣本只有三個賦予了正確的類標簽,其它7個樣本都錯了,比如第8個樣本是一個馬的頭,但是離它最近的訓練樣本
是汽車,這樣這個馬頭的圖像就被賦予汽車的標簽了。
現在我們來定義Nearest Neighbor Classifier,最簡單的一種定義就是像素級的比較,我們將一張32×32×3的圖看成一個高維的向量,兩張圖的差距
定義為L1距離:
還有一種常用的度量,是L2距離:
d2(I1,I2)=∑p(Ip1?IP2)2???????????√
實驗證明,利用L1,L2度量的效果并不理想,只有30%多一點,一種比較常見的改進是K-NN,我們不能只參考離測試樣本最近的一個樣本,我們要參考離測試樣本最近的K個樣本,然后利用投票策略,即,這K個樣本中,哪一類的樣本最多,我們就認為測試樣本屬于這一類。但是K-NN中的K到底要取多大?這個K可以稱為hyperparameters,在機器學習中,如何選擇參數也是一個需要仔細考慮的問題,一般來說test set只能用來做最后的評估,而且只能用一次,不能用test set來選擇最佳的hyperparameters,一個可行的方案是將訓練集分成兩部分,我們將擁有絕大多數訓練樣本的那部分用來訓練,稱為training set,而只有很少一部分訓練樣本的那部分用來評估不同的參數對模型的影響,這部分稱為validation set。
當樣本總數很少的時候,我們一般會采取另外一種策略稱為cross validation,將樣本分為相同規模的幾份,比如5份或者10份,然后,挑出一份做validation,剩下的做訓練,這樣循環一遍,以保證每一份都能被評估,這種策略相對來說比較耗時,因為需要循環地做訓練和測試。
Pros and Cons of Nearest Neighbor classifier
接下來,我們要總結一下Nearest Neighbor classifier的優缺點,很顯然,這種分類器的優點就是簡單,易懂,而且不需要訓練,但是它的缺點也很明顯,一個是效率太低,測試的時候非常耗時,因為要和訓練集
的樣本逐個比較,在實際應用中,我們比較關心測試階段的效率,因為訓練可以提前做好,所以最近鄰分類器不能滿足實時檢測,在實際應用中,很少用到這種分類器。最近鄰分類器另外一個缺點是對像素亮度值的變化非常敏感,因為這個是基于像素值的比較,所以同一個物體,在不同光照,或者有遮擋的情況下,會出現很大的差距,更加合理的度量應該基于物體的語義及結構信息。如下圖所示:
圖像的偏移,部分遮擋,光照變化會使距離度量相差很大。
最后做一點總結:
我們介紹了圖像分類的概念,并且介紹了一種很簡單的分類器:最近鄰分類器,而且我們也介紹了如何利用validation set或者cross validation來調整hyperparameters,我們也看到最近鄰分類器的效果并不是很理想,最后我們探討了L1,L2度量的缺陷,就是對像素值的變化比較敏感,而沒有基于物體的語義及結構信息來進行度量。
聲明:lecture notes里的圖片都來源于該課程的網站,只能用于學習,請勿作其它用途,如需轉載,請說明該課程為引用來源。
課程網站 http://cs231n.stanford.edu/
轉載于:https://www.cnblogs.com/mtcnn/p/9412617.html
總結
以上是生活随笔為你收集整理的Convolutional Neural Networks for Visual Recognition 1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最佳新秀Java(22)——再次了解泛型
- 下一篇: 读取bmp图片数据