图像分类综述
一、圖像分類介紹
什么是圖像分類,核心是從給定的分類集合中給圖像分配一個標(biāo)簽的任務(wù)。實際上,這意味著我們的任務(wù)是分析一個輸入圖像并返回一個將圖像分類的標(biāo)簽。標(biāo)簽來自預(yù)定義的可能類別集。
示例:我們假定一個可能的類別集categories = {dog, cat, eagle},之后我們提供一張圖1給分類系統(tǒng):
這里的目標(biāo)是根據(jù)輸入圖像,從類別集中分配一個類別,這里為dog,我們的分類系統(tǒng)也可以根據(jù)概率給圖像分配多個標(biāo)簽,如dog:95%,cat:4%,eagle:1%。
圖像分類的任務(wù)就是給定一個圖像,正確給出該圖像所屬的類別。對于超級強(qiáng)大的人類視覺系統(tǒng)來說,判別出一個圖像的類別是件很容易的事,但是對于計算機(jī)來說,并不能像人眼那樣一下獲得圖像的語義信息。
計算機(jī)能看到的只是一個個像素的數(shù)值,對于一個RGB圖像來說,假設(shè)圖像的尺寸是32*32,那么機(jī)器看到的就是一個形狀為3*32*32的矩陣,或者更正式地稱其為“張量”(“張量”簡單來說就是高維的矩陣),那么機(jī)器的任務(wù)其實也就是尋找一個函數(shù)關(guān)系,這個函數(shù)關(guān)系能夠?qū)⑦@些像素的數(shù)值映射到一個具體的類別(類別可以用某個數(shù)值表示)。
二、應(yīng)用場景
圖像分類更適用于圖像中待分類的物體是單一的,如上圖1中待分類物體是單一的,如果圖像中包含多個目標(biāo)物,如下圖3,可以使用多標(biāo)簽分類或者目標(biāo)檢測算法。
三、傳統(tǒng)圖像分類算法
通常完整建立圖像識別模型一般包括底層特征學(xué)習(xí)、特征編碼、空間約束、分類器設(shè)計、模型融合等幾個階段,如圖4所示。
1).底層特征提取: 通常從圖像中按照固定步長、尺度提取大量局部特征描述。常用的局部特征包括SIFT(Scale-Invariant Feature Transform, 尺度不變特征轉(zhuǎn)換) 、HOG(Histogram of Oriented Gradient, 方向梯度直方圖) 、LBP(Local Bianray Pattern, 局部二值模式)等,一般也采用多種特征描述,防止丟失過多的有用信息。
2).特征編碼: 底層特征中包含了大量冗余與噪聲,為了提高特征表達(dá)的魯棒性,需要使用一種特征變換算法對底層特征進(jìn)行編碼,稱作特征編碼。常用的特征編碼方法包括向量量化編碼、稀疏編碼、局部線性約束編碼、Fisher向量編碼等。
3).空間特征約束: 特征編碼之后一般會經(jīng)過空間特征約束,也稱作特征匯聚。特征匯聚是指在一個空間范圍內(nèi),對每一維特征取最大值或者平均值,可以獲得一定特征不變形的特征表達(dá)。金字塔特征匹配是一種常用的特征匯聚方法,這種方法提出將圖像均勻分塊,在分塊內(nèi)做特征匯聚。
4).通過分類器分類: 經(jīng)過前面步驟之后一張圖像可以用一個固定維度的向量進(jìn)行描述,接下來就是經(jīng)過分類器對圖像進(jìn)行分類。通常使用的分類器包括SVM(Support Vector Machine, 支持向量機(jī))、隨機(jī)森林等。而使用核方法的SVM是最為廣泛的分類器,在傳統(tǒng)圖像分類任務(wù)上性能很好。
這種傳統(tǒng)的圖像分類方法在PASCAL VOC競賽中的圖像分類算法中被廣泛使用 。
四、深度學(xué)習(xí)算法
Alex Krizhevsky在2012年ILSVRC提出的CNN模型取得了歷史性的突破,效果大幅度超越傳統(tǒng)方法,獲得了ILSVRC2012冠軍,該模型被稱作AlexNet。這也是首次將深度學(xué)習(xí)用于大規(guī)模圖像分類中。
從AlexNet之后,涌現(xiàn)了一系列CNN模型,不斷地在ImageNet上刷新成績,如圖5展示。隨著模型變得越來越深以及精妙的結(jié)構(gòu)設(shè)計,Top-5的錯誤率也越來越低,降到了3.5%附近。而在同樣的ImageNet數(shù)據(jù)集上,人眼的辨識錯誤率大概在5.1%,也就是目前的深度學(xué)習(xí)模型的識別能力已經(jīng)超過了人眼。
1、CNN
傳統(tǒng)CNN包含卷積層、全連接層等組件,并采用softmax多類別分類器和多類交叉熵?fù)p失函數(shù),一個典型的卷積神經(jīng)網(wǎng)絡(luò)如圖6所示,我們先介紹用來構(gòu)造CNN的常見組件。
l 卷積層(convolution layer): 執(zhí)行卷積操作提取底層到高層的特征,發(fā)掘出圖片局部關(guān)聯(lián)性質(zhì)和空間不變性質(zhì)。
l 池化層(pooling layer): 執(zhí)行降采樣操作。通過取卷積輸出特征圖中局部區(qū)塊的最大值(max-pooling)或者均值(avg-pooling)。降采樣也是圖像處理中常見的一種操作,可以過濾掉一些不重要的高頻信息。
l 全連接層(fully-connected layer,或者fc layer): 輸入層到隱藏層的神經(jīng)元是全部連接的。
l 非線性變化: 卷積層、全連接層后面一般都會接非線性變化函數(shù),例如Sigmoid、Tanh、ReLu等來增強(qiáng)網(wǎng)絡(luò)的表達(dá)能力,在CNN里最常使用的為ReLu激活函數(shù)。
l Dropout: 在模型訓(xùn)練階段隨機(jī)讓一些隱層節(jié)點權(quán)重不工作,提高網(wǎng)絡(luò)的泛化能力,一定程度上防止過擬合。
另外,在訓(xùn)練過程中由于每層參數(shù)不斷更新,會導(dǎo)致下一次輸入分布發(fā)生變化,這樣導(dǎo)致訓(xùn)練過程需要精心設(shè)計超參數(shù)。如2015年Sergey Ioffe和Christian Szegedy提出了Batch Normalization (BN)算法 中,每個batch對網(wǎng)絡(luò)中的每一層特征都做歸一化,使得每層分布相對穩(wěn)定。BN算法不僅起到一定的正則作用,而且弱化了一些超參數(shù)的設(shè)計。
經(jīng)過實驗證明,BN算法加速了模型收斂過程,在后來較深的模型中被廣泛使用。
2、VGG
牛津大學(xué)VGG(Visual Geometry Group)組在2014年ILSVRC提出的模型被稱作VGG模型。該模型相比以往模型進(jìn)一步加寬和加深了網(wǎng)絡(luò)結(jié)構(gòu),它的核心是五組卷積操作,每兩組之間做Max-Pooling空間降維。同一組內(nèi)采用多次連續(xù)的3X3卷積,卷積核的數(shù)目由較淺組的64增多到最深組的512,同一組內(nèi)的卷積核數(shù)目是一樣的。卷積之后接兩層全連接層,之后是分類層。
由于每組內(nèi)卷積層的不同,有11、13、16、19層這幾種模型,下圖展示一個16層的網(wǎng)絡(luò)結(jié)構(gòu)。VGG模型結(jié)構(gòu)相對簡潔,提出之后也有很多文章基于此模型進(jìn)行研究,如在ImageNet上首次公開超過人眼識別的模型就是借鑒VGG模型的結(jié)構(gòu)。
3、GoogLeNet
GoogLeNet 在2014年ILSVRC的獲得了冠軍,在介紹該模型之前我們先來了解NIN(Network in Network)模型和Inception模塊,因為GoogLeNet模型由多組Inception模塊組成,模型設(shè)計借鑒了NIN的一些思想。
NIN模型主要有兩個特點:
1.引入了多層感知卷積網(wǎng)絡(luò)(Multi-Layer Perceptron Convolution, MLPconv)代替一層線性卷積網(wǎng)絡(luò)。MLPconv是一個微小的多層卷積網(wǎng)絡(luò),即在線性卷積后面增加若干層1x1的卷積,這樣可以提取出高度非線性特征。
2.傳統(tǒng)的CNN最后幾層一般都是全連接層,參數(shù)較多。而NIN模型設(shè)計最后一層卷積層包含類別維度大小的特征圖,然后采用全局均值池化(Avg-Pooling)替代全連接層,得到類別維度大小的向量,再進(jìn)行分類。這種替代全連接層的方式有利于減少參數(shù)。
Inception模塊如下圖8所示,下圖左是最簡單的設(shè)計,輸出是3個卷積層和一個池化層的特征拼接。這種設(shè)計的缺點是池化層不會改變特征通道數(shù),拼接后會導(dǎo)致特征的通道數(shù)較大,經(jīng)過幾層這樣的模塊堆積后,通道數(shù)會越來越大,導(dǎo)致參數(shù)和計算量也隨之增大。
為了改善這個缺點,下圖右引入3個1x1卷積層進(jìn)行降維,所謂的降維就是減少通道數(shù),同時如NIN模型中提到的1x1卷積也可以修正線性特征。
GoogLeNet由多組Inception模塊堆積而成。另外,在網(wǎng)絡(luò)最后也沒有采用傳統(tǒng)的多層全連接層,而是像NIN網(wǎng)絡(luò)一樣采用了均值池化層;但與NIN不同的是,GoogLeNet在池化層后加了一個全連接層來映射類別數(shù)。
除了這兩個特點之外,由于網(wǎng)絡(luò)中間層特征也很有判別性,GoogLeNet在中間層添加了兩個輔助分類器,在后向傳播中增強(qiáng)梯度并且增強(qiáng)正則化,而整個網(wǎng)絡(luò)的損失函數(shù)是這個三個分類器的損失加權(quán)求和。
GoogLeNet整體網(wǎng)絡(luò)結(jié)構(gòu)如圖9所示,總共22層網(wǎng)絡(luò):開始由3層普通的卷積組成;接下來由三組子網(wǎng)絡(luò)組成,第一組子網(wǎng)絡(luò)包含2個Inception模塊,第二組包含5個Inception模塊,第三組包含2個Inception模塊;然后接均值池化層、全連接層。
上面介紹的是GoogLeNet第一版模型(稱作GoogLeNet-v1)。GoogLeNet-v2引入BN層;GoogLeNet-v3 對一些卷積層做了分解,進(jìn)一步提高網(wǎng)絡(luò)非線性能力和加深網(wǎng)絡(luò);GoogLeNet-v4引入下面要講的ResNet設(shè)計思路。從v1到v4每一版的改進(jìn)都會帶來準(zhǔn)確度的提升,介于篇幅,這里不再詳細(xì)介紹v2到v4的結(jié)構(gòu)。
4、ResNet
ResNet(Residual Network) 是2015年ImageNet圖像分類、圖像物體定位和圖像物體檢測比賽的冠軍。針對隨著網(wǎng)絡(luò)訓(xùn)練加深導(dǎo)致準(zhǔn)確度下降的問題,ResNet提出了殘差學(xué)習(xí)方法來減輕訓(xùn)練深層網(wǎng)絡(luò)的困難。
在已有設(shè)計思路(BN, 小卷積核,全卷積網(wǎng)絡(luò))的基礎(chǔ)上,引入了殘差模塊。每個殘差模塊包含兩條路徑,其中一條路徑是輸入特征的直連通路,另一條路徑對該特征做兩到三次卷積操作得到該特征的殘差,最后再將兩條路徑上的特征相加。
殘差模塊如圖10所示,左邊是基本模塊連接方式,由兩個輸出通道數(shù)相同的3x3卷積組成。右邊是瓶頸模塊(Bottleneck)連接方式,之所以稱為瓶頸,是因為上面的1x1卷積用來降維(圖示例即256->64),下面的1x1卷積用來升維(圖示例即64->256),這樣中間3x3卷積的輸入和輸出通道數(shù)都較小(圖示例即64->64)。
圖11展示了50、101、152層網(wǎng)絡(luò)連接示意圖,使用的是瓶頸模塊。這三個模型的區(qū)別在于每組中殘差模塊的重復(fù)次數(shù)不同(見圖右上角)。ResNet訓(xùn)練收斂較快,成功的訓(xùn)練了上百乃至近千層的卷積神經(jīng)網(wǎng)絡(luò)。
五、GitHub資源
下面列舉了搜集的開源的一些基于深度學(xué)習(xí)的圖像分類的小項目,讀者感興趣可自行嘗試。
l 使用tensorflow和cnn做的圖像識別,對四種花進(jìn)行了分類。: https://github.com/waitingfordark/four_flower
l 使用vgg16,vgg19對cifar數(shù)據(jù)集中的圖像進(jìn)行分類:https://github.com/caozhang1996/VGG-cifar10
l 基于Keras實現(xiàn)Kaggle2013--Dogs vs. Cats12500張貓狗圖像的精準(zhǔn)分類: https://github.com/zhangpengpengpeng/kaggle-dogs-vs-cats
l keras使用遷移學(xué)習(xí)實現(xiàn)醫(yī)學(xué)圖像二分類(AK、SK):https://github.com/jinghaiting/binary_classification_keras
總結(jié)
- 上一篇: springboot 使用的配置
- 下一篇: cf1132E. Knapsack(搜索