圖像分類綜述

2020-03-12     sandag

一、圖像分類介紹

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

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

這裡的目標是根據輸入圖像,從類別集中分配一個類別,這裡為dog,我們的分類系統也可以根據 機率 給圖像分配多個標籤,如dog:95%,cat:4%,eagle:1%。

圖像分類的任務就是給定一個圖像,正確給出該圖像所屬的類別。對於超級強大的人類視覺系統來說,判別出一個圖像的類別是件很容易的事,但是對於計算機來說,並不能像人眼那樣一下獲得圖像的語義信息。

計算機能看到的只是一個個像素的數值,對於一個RGB圖像來說,假設圖像的尺寸是32*32,那麼機器看到的就是一個形狀為 3*32*32的矩陣 ,或者更正式地稱其為「張量」(「張量」簡單來說就是高維的矩陣),那麼機器的任務其實也就是尋找一個函數關係,這個函數關係能夠將這些像素的數值映射到一個具體的類別(類別可以用某個數值表示)。

二、應用場景

圖像分類更適用於圖像中待分類的物體是單一的,如上圖1中待分類物體是單一的,如果圖像中包含多個目標物,如下圖3,可以使用多標籤分類或者目標檢測算法。

三、傳統圖像分類算法

通常完整建立圖像識別模型一般包括底層特徵學習、特徵編碼、空間約束、分類器設計、模型融合等幾個階段,如圖4所示。

1). 底層特徵提取 : 通常從圖像中按照固定步長、尺度提取大量局部特徵描述。常用的局部特徵包括 SIFT (Scale-Invariant Feature Transform, 尺度不變特徵轉換) 、 HOG (Histogram of Oriented Gradient, 方向梯度直方圖) 、 LBP (Local Bianray Pattern, 局部二值模式)等,一般也採用多種特徵描述,防止丟失過多的有用信息。

2). 特徵編碼 : 底層特徵中包含了大量冗餘與噪聲,為了提高特徵表達的魯棒性,需要使用一種特徵變換算法對底層特徵進行編碼,稱作 特徵編碼 。常用的特徵編碼方法包括向量量化編碼、稀疏編碼、局部線性約束編碼、Fisher向量編碼等。

3). 空間特徵約束 : 特徵編碼之後一般會經過空間特徵約束,也稱作 特徵匯聚 。特徵匯聚是指在一個空間範圍內,對每一維特徵取最大值或者平均值,可以獲得一定特徵不變形的特徵表達。金字塔特徵匹配是一種常用的特徵匯聚方法,這種方法提出將圖像均勻分塊,在分塊內做特徵匯聚。

4). 通過分類器分類 : 經過前面步驟之後一張圖像可以用一個固定維度的向量進行描述,接下來就是經過分類器對圖像進行分類。通常使用的分類器包括 SVM (Support Vector Machine, 支持向量機)、隨機森林等。而使用核方法的SVM是最為廣泛的分類器,在傳統圖像分類任務上性能很好。

這種傳統的圖像分類方法在PASCAL VOC競賽中的圖像分類算法中被廣泛使用 。

四、深度學習算法

Alex Krizhevsky在2012年ILSVRC提出的CNN模型取得了歷史性的突破,效果大幅度超越傳統方法,獲得了ILSVRC2012冠軍,該模型被稱作 AlexNet 。這也是首次將深度學習用於大規模圖像分類中。

從AlexNet之後,湧現了一系列CNN模型,不斷地在ImageNet上刷新成績,如圖5展示。隨著模型變得越來越深以及精妙的結構設計,Top-5的錯誤率也越來越低,降到了3.5%附近。而在同樣的ImageNet數據集上,人眼的辨識錯誤率大概在5.1%,也就是目前的深度學習模型的識別能力已經超過了人眼。

1、CNN

傳統CNN包含卷積層、全連接層等組件,並採用softmax多類別分類器和多類交叉熵損失函數,一個典型的卷積神經網絡如圖6所示,我們先介紹用來構造CNN的常見組件。

l 卷積層(convolution layer): 執行卷積操作提取底層到高層的特徵,發掘出圖片局部關聯性質和空間不變性質。

l 池化層(pooling layer): 執行降採樣操作。通過取卷積輸出特徵圖中局部區塊的最大值(max-pooling)或者均值(avg-pooling)。降採樣也是圖像處理中常見的一種操作,可以過濾掉一些不重要的高頻信息。

l 全連接層(fully-connected layer,或者fc layer): 輸入層到隱藏層的神經元是全部連接的。

l 非線性變化: 卷積層、全連接層後面一般都會接非線性變化函數,例如Sigmoid、Tanh、ReLu等來增強網絡的表達能力,在CNN里最常使用的為ReLu激活函數。

l Dropout: 在模型訓練階段隨機讓一些隱層節點權重不工作,提高網絡的泛化能力,一定程度上防止過擬合。

另外,在訓練過程中由於每層參數不斷更新,會導致下一次輸入分布發生變化,這樣導致訓練過程需要精心設計超參數。如2015年Sergey Ioffe和Christian Szegedy提出了 Batch Normalization (BN)算法 中,每個batch對網絡中的每一層特徵都做歸一化,使得每層分布相對穩定。BN算法不僅起到一定的正則作用,而且弱化了一些超參數的設計。

經過實驗證明,BN算法加速了模型收斂過程,在後來較深的模型中被廣泛使用。

2、VGG

牛津大學VGG(Visual Geometry Group)組在2014年ILSVRC提出的模型被稱作VGG模型。該模型相比以往模型進一步加寬和加深了網絡結構,它的核心是五組卷積操作,每兩組之間做Max-Pooling空間降維。同一組內採用多次連續的3X3卷積,卷積核的數目由較淺組的64增多到最深組的512,同一組內的卷積核數目是一樣的。卷積之後接兩層全連接層,之後是分類層。

由於每組內卷積層的不同,有11、13、16、19層這幾種模型,下圖展示一個16層的網絡結構。VGG模型結構相對簡潔,提出之後也有很多文章基於此模型進行研究,如在ImageNet上首次公開超過人眼識別的模型就是借鑑VGG模型的結構。

3、GoogLeNet

GoogLeNet 在2014年ILSVRC的獲得了冠軍,在介紹該模型之前我們先來了解NIN(Network in Network)模型和 Inception模塊 ,因為GoogLeNet模型由多組Inception模塊組成,模型設計借鑑了NIN的一些思想。

NIN模型主要有兩個特點:

1.引入了多層感知卷積網絡(Multi-Layer Perceptron Convolution, MLPconv)代替一層線性卷積網絡。MLPconv是一個微小的多層卷積網絡,即在線性卷積後面增加若干層1x1的卷積,這樣可以提取出高度非線性特徵。

2.傳統的CNN最後幾層一般都是全連接層,參數較多。而NIN模型設計最後一層卷積層包含類別維度大小的特徵圖,然後採用全局均值池化(Avg-Pooling)替代全連接層,得到類別維度大小的向量,再進行分類。這種替代全連接層的方式有利於減少參數。

Inception模塊如下圖8所示,下圖左是最簡單的設計,輸出是3個卷積層和一個池化層的特徵拼接。這種設計的缺點是池化層不會改變特徵通道數,拼接後會導致特徵的通道數較大,經過幾層這樣的模塊堆積後,通道數會越來越大,導致參數和計算量也隨之增大。

為了改善這個缺點,下圖右引入3個1x1卷積層進行降維,所謂的降維就是減少通道數,同時如NIN模型中提到的1x1卷積也可以修正線性特徵。

GoogLeNet由多組Inception模塊堆積而成。另外,在網絡最後也沒有採用傳統的多層全連接層,而是像NIN網絡一樣採用了均值池化層;但與NIN不同的是,GoogLeNet在池化層後加了一個全連接層來映射類別數。

除了這兩個特點之外,由於網絡中間層特徵也很有判別性,GoogLeNet在中間層添加了兩個輔助分類器,在後向傳播中增強梯度並且增強正則化,而整個網絡的損失函數是這個三個分類器的損失加權求和。

GoogLeNet整體網絡結構如圖9所示,總共22層網絡:開始由3層普通的卷積組成;接下來由三組子網絡組成,第一組子網絡包含2個Inception模塊,第二組包含5個Inception模塊,第三組包含2個Inception模塊;然後接均值池化層、全連接層。

上面介紹的是GoogLeNet第一版模型(稱作GoogLeNet-v1)。GoogLeNet-v2引入BN層;GoogLeNet-v3 對一些卷積層做了分解,進一步提高網絡非線性能力和加深網絡;GoogLeNet-v4引入下面要講的ResNet設計思路。從v1到v4每一版的改進都會帶來準確度的提升,介於篇幅,這裡不再詳細介紹v2到v4的結構。

4、ResNet

ResNet(Residual Network) 是2015年ImageNet圖像分類、圖像物體定位和圖像物體檢測比賽的冠軍。針對隨著網絡訓練加深導致準確度下降的問題,ResNet提出了殘差學習方法來減輕訓練深層網絡的困難。

在已有設計思路(BN, 小卷積核,全卷積網絡)的基礎上,引入了殘差模塊。每個殘差模塊包含兩條路徑,其中一條路徑是輸入特徵的直連通路,另一條路徑對該特徵做兩到三次卷積操作得到該特徵的殘差,最後再將兩條路徑上的特徵相加。

殘差模塊如圖10所示,左邊是基本模塊連接方式,由兩個輸出通道數相同的3x3卷積組成。右邊是瓶頸模塊(Bottleneck)連接方式,之所以稱為瓶頸,是因為上面的1x1卷積用來降維(圖示例即256->64),下面的1x1卷積用來升維(圖示例即64->256),這樣中間3x3卷積的輸入和輸出通道數都較小(圖示例即64->64)。

圖11展示了50、101、152層網絡連接示意圖,使用的是瓶頸模塊。這三個模型的區別在於每組中殘差模塊的重複次數不同(見圖右上角)。ResNet訓練收斂較快,成功的訓練了上百乃至近千層的卷積神經網絡。

文章來源: https://twgreatdaily.com/zh/aA3L0XAB3uTiws8K7GLY.html