CS231n课程笔记翻译:图像分类笔记(上)
譯者注:本文翻譯自斯坦福CS231n課程筆記image classification notes,由課程教師Andrej Karpathy授權(quán)進(jìn)行翻譯。本篇教程由杜客翻譯完成。ShiqingFan對譯文進(jìn)行了仔細(xì)校對,提出了大量修改建議,態(tài)度嚴(yán)謹(jǐn),幫助甚多。鞏子嘉對幾處術(shù)語使用和翻譯優(yōu)化也提出了很好的建議。張欣等亦有幫助。
原文如下
這是一篇介紹性教程,面向非計算機(jī)視覺領(lǐng)域的同學(xué)。教程將向同學(xué)們介紹圖像分類問題和數(shù)據(jù)驅(qū)動方法。下面是內(nèi)容列表:
- 圖像分類、數(shù)據(jù)驅(qū)動方法和流程
- Nearest Neighbor分類器
- k-Nearest Neighbor 譯者注:上篇翻譯截止處
- k-Nearest Neighbor 譯者注:上篇翻譯截止處
- 驗證集、交叉驗證集和超參數(shù)調(diào)參
- Nearest Neighbor的優(yōu)劣
- 小結(jié)
- 小結(jié):應(yīng)用kNN實踐
- 拓展閱讀
圖像分類
目標(biāo):這一節(jié)我們將介紹圖像分類問題。所謂圖像分類問題,就是已有固定的分類標(biāo)簽集合,然后對于輸入的圖像,從分類標(biāo)簽集合中找出一個分類標(biāo)簽,最后把分類標(biāo)簽分配給該輸入圖像。雖然看起來挺簡單的,但這可是計算機(jī)視覺領(lǐng)域的核心問題之一,并且有著各種各樣的實際應(yīng)用。在后面的課程中,我們可以看到計算機(jī)視覺領(lǐng)域中很多看似不同的問題(比如物體檢測和分割),都可以被歸結(jié)為圖像分類問題。
例子:以下圖為例,圖像分類模型讀取該圖片,并生成該圖片屬于集合 {cat, dog, hat, mug}中各個標(biāo)簽的概率。需要注意的是,對于計算機(jī)來說,圖像是一個由數(shù)字組成的巨大的3維數(shù)組。在這個例子中,貓的圖像大小是寬248像素,高400像素,有3個顏色通道,分別是紅、綠和藍(lán)(簡稱RGB)。如此,該圖像就包含了248X400X3=297600個數(shù)字,每個數(shù)字都是在范圍0-255之間的整型,其中0表示全黑,255表示全白。我們的任務(wù)就是把這些上百萬的數(shù)字變成一個簡單的標(biāo)簽,比如“貓”。
—————————————————————————————————————————
圖像分類的任務(wù),就是對于一個給定的圖像,預(yù)測它屬于的那個分類標(biāo)簽(或者給出屬于一系列不同標(biāo)簽的可能性)。圖像是3維數(shù)組,數(shù)組元素是取值范圍從0到255的整數(shù)。數(shù)組的尺寸是寬度x高度x3,其中這個3代表的是紅、綠和藍(lán)3個顏色通道。
—————————————————————————————————————————
困難和挑戰(zhàn):對于人來說,識別出一個像“貓”一樣視覺概念是簡單至極的,然而從計算機(jī)視覺算法的角度來看就值得深思了。我們在下面列舉了計算機(jī)視覺算法在圖像識別方面遇到的一些困難,要記住圖像是以3維數(shù)組來表示的,數(shù)組中的元素是亮度值。
- 視角變化(Viewpoint variation):同一個物體,攝像機(jī)可以從多個角度來展現(xiàn)。
- 大小變化(Scale variation):物體可視的大小通常是會變化的(不僅是在圖片中,在真實世界中大小也是變化的)。
- 形變(Deformation):很多東西的形狀并非一成不變,會有很大變化。
- 遮擋(Occlusion):目標(biāo)物體可能被擋住。有時候只有物體的一小部分(可以小到幾個像素)是可見的。
- 光照條件(Illumination conditions):在像素層面上,光照的影響非常大。
- 背景干擾(Background clutter):物體可能混入背景之中,使之難以被辨認(rèn)。
- 類內(nèi)差異(Intra-class variation):一類物體的個體之間的外形差異很大,比如椅子。這一類物體有許多不同的對象,每個都有自己的外形。
面對以上所有變化及其組合,好的圖像分類模型能夠在維持分類結(jié)論穩(wěn)定的同時,保持對類間差異足夠敏感。
—————————————————————————————————————————
—————————————————————————————————————————
數(shù)據(jù)驅(qū)動方法:如何寫一個圖像分類的算法呢?這和寫個排序算法可是大不一樣。怎么寫一個從圖像中認(rèn)出貓的算法?搞不清楚。因此,與其在代碼中直接寫明各類物體到底看起來是什么樣的,倒不如說我們采取的方法和教小孩兒看圖識物類似:給計算機(jī)很多數(shù)據(jù),然后實現(xiàn)學(xué)習(xí)算法,讓計算機(jī)學(xué)習(xí)到每個類的外形。這種方法,就是數(shù)據(jù)驅(qū)動方法。既然該方法的第一步就是收集已經(jīng)做好分類標(biāo)注的圖片來作為訓(xùn)練集,那么下面就看看數(shù)據(jù)庫到底長什么樣:
—————————————————————————————————————————
一個有4個視覺分類的訓(xùn)練集。在實際中,我們可能有上千的分類,每個分類都有成千上萬的圖像。
—————————————————————————————————————————
圖像分類流程。在課程視頻中已經(jīng)學(xué)習(xí)過,圖像分類就是輸入一個元素為像素值的數(shù)組,然后給它分配一個分類標(biāo)簽。完整流程如下:
- 輸入:輸入是包含N個圖像的集合,每個圖像的標(biāo)簽是K種分類標(biāo)簽中的一種。這個集合稱為訓(xùn)練集。
- 學(xué)習(xí):這一步的任務(wù)是使用訓(xùn)練集來學(xué)習(xí)每個類到底長什么樣。一般該步驟叫做訓(xùn)練分類器或者學(xué)習(xí)一個模型。
- 評價:讓分類器來預(yù)測它未曾見過的圖像的分類標(biāo)簽,并以此來評價分類器的質(zhì)量。我們會把分類器預(yù)測的標(biāo)簽和圖像真正的分類標(biāo)簽對比。毫無疑問,分類器預(yù)測的分類標(biāo)簽和圖像真正的分類標(biāo)簽如果一致,那就是好事,這樣的情況越多越好。
Nearest Neighbor分類器
作為課程介紹的第一個方法,我們來實現(xiàn)一個Nearest Neighbor分類器。雖然這個分類器和卷積神經(jīng)網(wǎng)絡(luò)沒有任何關(guān)系,實際中也極少使用,但通過實現(xiàn)它,可以讓讀者對于解決圖像分類問題的方法有個基本的認(rèn)識。
圖像分類數(shù)據(jù)集:CIFAR-10。一個非常流行的圖像分類數(shù)據(jù)集是CIFAR-10。這個數(shù)據(jù)集包含了60000張32X32的小圖像。每張圖像都有10種分類標(biāo)簽中的一種。這60000張圖像被分為包含50000張圖像的訓(xùn)練集和包含10000張圖像的測試集。在下圖中你可以看見10個類的10張隨機(jī)圖片。
—————————————————————————————————————————
左邊:從CIFAR-10數(shù)據(jù)庫來的樣本圖像。右邊:第一列是測試圖像,然后第一列的每個測試圖像右邊是使用Nearest Neighbor算法,根據(jù)像素差異,從訓(xùn)練集中選出的10張最類似的圖片。
—————————————————————————————————————————
假設(shè)現(xiàn)在我們有CIFAR-10的50000張圖片(每種分類5000張)作為訓(xùn)練集,我們希望將余下的10000作為測試集并給他們打上標(biāo)簽。Nearest Neighbor算法將會拿著測試圖片和訓(xùn)練集中每一張圖片去比較,然后將它認(rèn)為最相似的那個訓(xùn)練集圖片的標(biāo)簽賦給這張測試圖片。上面右邊的圖片就展示了這樣的結(jié)果。請注意上面10個分類中,只有3個是準(zhǔn)確的。比如第8行中,馬頭被分類為一個紅色的跑車,原因在于紅色跑車的黑色背景非常強(qiáng)烈,所以這匹馬就被錯誤分類為跑車了。
那么具體如何比較兩張圖片呢?在本例中,就是比較32x32x3的像素塊。最簡單的方法就是逐個像素比較,最后將差異值全部加起來。換句話說,就是將兩張圖片先轉(zhuǎn)化為兩個向量和,然后計算他們的L1距離:
這里的求和是針對所有的像素。下面是整個比較流程的圖例:
—————————————————————————————————————————
以圖片中的一個顏色通道為例來進(jìn)行說明。兩張圖片使用L1距離來進(jìn)行比較。逐個像素求差值,然后將所有差值加起來得到一個數(shù)值。如果兩張圖片一模一樣,那么L1距離為0,但是如果兩張圖片很是不同,那L1值將會非常大。
—————————————————————————————————————————
下面,讓我們看看如何用代碼來實現(xiàn)這個分類器。首先,我們將CIFAR-10的數(shù)據(jù)加載到內(nèi)存中,并分成4個數(shù)組:訓(xùn)練數(shù)據(jù)和標(biāo)簽,測試數(shù)據(jù)和標(biāo)簽。在下面的代碼中,Xtr(大小是50000x32x32x3)存有訓(xùn)練集中所有的圖像,Ytr是對應(yīng)的長度為50000的1維數(shù)組,存有圖像對應(yīng)的分類標(biāo)簽(從0到9):
Xtr, Ytr, Xte, Yte = load_CIFAR10('data/cifar10/') # a magic function we provide # flatten out all images to be one-dimensional Xtr_rows = Xtr.reshape(Xtr.shape[0], 32 * 32 * 3) # Xtr_rows becomes 50000 x 3072 Xte_rows = Xte.reshape(Xte.shape[0], 32 * 32 * 3) # Xte_rows becomes 10000 x 3072現(xiàn)在我們得到所有的圖像數(shù)據(jù),并且把他們拉長成為行向量了。接下來展示如何訓(xùn)練并評價一個分類器:
作為評價標(biāo)準(zhǔn),我們常常使用準(zhǔn)確率,它描述了我們預(yù)測正確的得分。請注意以后我們實現(xiàn)的所有分類器都需要有這個API:train(X, y)函數(shù)。該函數(shù)使用訓(xùn)練集的數(shù)據(jù)和標(biāo)簽來進(jìn)行訓(xùn)練。從其內(nèi)部來看,類應(yīng)該實現(xiàn)一些關(guān)于標(biāo)簽和標(biāo)簽如何被預(yù)測的模型。這里還有個predict(X)函數(shù),它的作用是預(yù)測輸入的新數(shù)據(jù)的分類標(biāo)簽。現(xiàn)在還沒介紹分類器的實現(xiàn),下面就是使用L1距離的Nearest Neighbor分類器的實現(xiàn)套路:
如果你用這段代碼跑CIFAR-10,你會發(fā)現(xiàn)準(zhǔn)確率能達(dá)到38.6%。這比隨機(jī)猜測的10%要好,但是比人類識別的水平(據(jù)研究推測是94%)和卷積神經(jīng)網(wǎng)絡(luò)能達(dá)到的95%還是差多了。點擊查看基于CIFAR-10數(shù)據(jù)的Kaggle算法競賽排行榜。
距離選擇:計算向量間的距離有很多種方法,另一個常用的方法是L2距離,從幾何學(xué)的角度,可以理解為它在計算兩個向量間的歐式距離。L2距離的公式如下:
換句話說,我們依舊是在計算像素間的差值,只是先求其平方,然后把這些平方全部加起來,最后對這個和開方。在Numpy中,我們只需要替換上面代碼中的1行代碼就行:
注意在這里使用了np.sqrt,但是在實際中可能不用。因為求平方根函數(shù)是一個單調(diào)函數(shù),它對不同距離的絕對值求平方根雖然改變了數(shù)值大小,但依然保持了不同距離大小的順序。所以用不用它,都能夠?qū)ο袼夭町惖拇笮∵M(jìn)行正確比較。如果你在CIFAR-10上面跑這個模型,正確率是35.4%,比剛才低了一點。
L1和L2比較。比較這兩個度量方式是挺有意思的。在面對兩個向量之間的差異時,L2比L1更加不能容忍這些差異。也就是說,相對于1個巨大的差異,L2距離更傾向于接受多個中等程度的差異。L1和L2都是在p-norm常用的特殊形式。
k-Nearest Neighbor分類器
你可能注意到了,為什么只用最相似的1張圖片的標(biāo)簽來作為測試圖像的標(biāo)簽?zāi)?#xff1f;這不是很奇怪嗎!是的,使用k-Nearest Neighbor分類器就能做得更好。它的思想很簡單:與其只找最相近的那1個圖片的標(biāo)簽,我們找最相似的k個圖片的標(biāo)簽,然后讓他們針對測試圖片進(jìn)行投票,最后把票數(shù)最高的標(biāo)簽作為對測試圖片的預(yù)測。所以當(dāng)k=1的時候,k-Nearest Neighbor分類器就是Nearest Neighbor分類器。從直觀感受上就可以看到,更高的k值可以讓分類的效果更平滑,使得分類器對于異常值更有抵抗力。
—————————————————————————————————————————
上面示例展示了Nearest Neighbor分類器和5-Nearest Neighbor分類器的區(qū)別。例子使用了2維的點來表示,分成3類(紅、藍(lán)和綠)。不同顏色區(qū)域代表的是使用L2距離的分類器的決策邊界。白色的區(qū)域是分類模糊的例子(即圖像與兩個以上的分類標(biāo)簽綁定)。需要注意的是,在NN分類器中,異常的數(shù)據(jù)點(比如:在藍(lán)色區(qū)域中的綠點)制造出一個不正確預(yù)測的孤島。5-NN分類器將這些不規(guī)則都平滑了,使得它針對測試數(shù)據(jù)的泛化(generalization)能力更好(例子中未展示)。注意,5-NN中也存在一些灰色區(qū)域,這些區(qū)域是因為近鄰標(biāo)簽的最高票數(shù)相同導(dǎo)致的(比如:2個鄰居是紅色,2個鄰居是藍(lán)色,還有1個是綠色)。
—————————————————————————————————————————
在實際中,大多使用k-NN分類器。但是k值如何確定呢?接下來就討論這個問題。
圖像分類筆記(上)完。
點擊查看圖像分類筆記(下)。
譯者反饋:
鏈接:https://zhuanlan.zhihu.com/p/20894041
來源:知乎
總結(jié)
以上是生活随笔為你收集整理的CS231n课程笔记翻译:图像分类笔记(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从0开始学习 GitHub 系列之「初识
- 下一篇: CS231n课程笔记翻译:图像分类笔记(