浙江省杭州學軍中學 趙熠杰
隨著網(wǎng)絡的普及以及信息社會的發(fā)展,我們在日常生活中接觸到的圖像數(shù)據(jù)也越來越多,尤其是最近幾年社交網(wǎng)絡的普及,像是facebook,微信,微博等社交網(wǎng)絡,人們可以隨時隨地上傳自己的圖片或者視頻,一方面對于圖像的存儲以及管理帶來了很大的困難,另一方面來說如何去挖掘圖像中存儲的信息也變得越來越重要。這些圖像信息不僅可以讓我們獲得一些人們的想法,還可以快速的提高效率。
場景分類是一個比較基礎性的工作,它的應用非常的廣泛,不僅可以應用的安防領域,讓我們的生活變得更加安全,還可以應用到自動駕駛領域,提高自動駕駛的安全性。同時場景分類在各大社交網(wǎng)絡中的應用也非常多,豐富了我們的生活。但是如何讓計算機像人類一樣對一個場景進行精確的分類也是一項非常具有挑戰(zhàn)性的工作。因此,場景分類是一個具有研究前景的領域。
計算機視覺一直以來都是人工智能的研究熱點,所以也涌現(xiàn)了非常多的優(yōu)秀的算法。主要分為兩類,一類是傳統(tǒng)的根據(jù)特征進行建模然后使用機器學習的算法進行分類,常見的特征提取算法包括統(tǒng)計直方圖,色彩直方圖,LBP以及SIFT特征等。使用的機器學習算法如隨機森林,建立多顆決策樹,并根據(jù)多棵決策樹的結果進行多數(shù)投票,另外一種是支持向量機,這也是在深度學習大規(guī)模應用之前效果最好的一種算法,是一種根據(jù)支持向量確定決策邊界的方法。
另外一類是基于深度學習的算法,Krizhevsky在2012年提出了基于深度學習的圖像分類算法,使用了一個8層的神經(jīng)網(wǎng)絡結構,奪得了ImageNet2012年圖像分類的冠軍。隨后Christian Szegedy提出了GoogleNet,使用了22層的神經(jīng)網(wǎng)絡獲得了ImageNet2014年圖像分類的冠軍。隨后Karen Simonyan等人提出了一個19層的VGG網(wǎng)絡,在圖像分類領域獲得了更好的結果。
場景分類是根據(jù)訓練數(shù)據(jù)集中的數(shù)據(jù)的特征,給每一類確定一種準確地描述方式,由這些特征生成類描述或模型,并運用這種描述方式對新的數(shù)據(jù)集進行分類。場景分類是指針對原始的圖片數(shù)據(jù),對數(shù)據(jù)進行過濾、提取特征等操作,然后根據(jù)場景圖像特征進行分類。
本文中所使用的數(shù)據(jù)集為aichallenger中場景分類的數(shù)據(jù)集,比賽從400萬張圖片中選出了8萬張比較好的圖片,分別屬于80個不同的場景,比如足球場,滑雪場,臥室等。從中選出70%作為訓練集,10%作為交叉驗證集,20%作為測試集,其中每張圖片的大小是不相同的。
首先是圖像的預處理,本步驟主要將圖片做一些簡單的處理。由于每張圖片的大小都是各不相同的,深度學習算法通常需要固定大小的輸入,因此我們需要將每張圖片的大小處理成固定的大小,如果直接對圖像做縮放的話可能會造成比較大的失真,實驗驗證也是如此的。因此,在圖像的處理中本文首先將圖像進行小幅度的縮放,然后從縮放后的圖片中裁剪出224*224大小的圖片。后續(xù)將圖片存儲為numpy支持的數(shù)組即可。
第二步是數(shù)據(jù)增強。在后續(xù)的實驗中本文發(fā)現(xiàn),現(xiàn)有的數(shù)據(jù)數(shù)量還是比較的少,因此有必要進行進一步的數(shù)據(jù)增強,在增加數(shù)據(jù)增強后的網(wǎng)絡中,top3的準確率可以提高大約10%。本文所使用的數(shù)據(jù)增強方法主要包括如下:將輸入數(shù)據(jù)歸一化到-1,到1之間;將輸入的圖片進行一定幅度的旋轉,本文中旋轉角度為15度;每一張圖片的寬度上進行隨機的水平平移,本文中平移整張圖片的1%;每一張圖片在高度上進行隨機的水平平移,本文中同樣偏移整張圖片的1%;對圖片以一定的概率進行隨機的水平翻轉,在豎直方向上不做任何的翻轉。
第三步模型構建。此步驟主要是選擇或者設計深度學習使用的模型,同時由于本文使用的數(shù)據(jù)集中圖片的數(shù)量比較少,只有8萬張圖片,比較深的網(wǎng)絡可能會過擬合。因此,本文使用了遷移學習的方法,使用了部分在ImageNet中訓練好的參數(shù)初始化網(wǎng)絡,部分模型沒有使用做對比實驗。詳細的內(nèi)容將在第三部分進行介紹。
第四步是使用第三步訓練好的網(wǎng)絡以及參數(shù)進行預測。在這一部分同樣需要對數(shù)據(jù)進行預處理,預處理的過程同訓練過程的預處理相同,但是這一步不進行數(shù)據(jù)的增強。
在對場景分類模型的構建的時候,本文選擇使用ResNet以及InceptionV3的網(wǎng)絡結構對場景進行分類,并對部分地方進行改進實驗。同時,為了增強模型的泛化能力,避免在小數(shù)據(jù)上造成過擬合的現(xiàn)象,因此本文使用了遷移學習的方法,使用了在ImageNet中訓練好的ResNet以及InceptionV3的參數(shù)對網(wǎng)絡進行初始化。另外在進行實驗的時候發(fā)現(xiàn),只對網(wǎng)絡進行微調的結果在top1上的準確率并不是十分的理想。因此,本文使用預訓練好的參數(shù)對網(wǎng)絡進行初始化,不加載最后一層全連接層的參數(shù),并且在網(wǎng)絡的訓練過程中對整個網(wǎng)絡中的所有參數(shù)進行更新,而不是只更新最后一層的參數(shù)。下面將詳細介紹ResNet以及InceptionV3算法。
我們在網(wǎng)絡的訓練過程中會發(fā)現(xiàn)這樣一些現(xiàn)象,就是隨著網(wǎng)絡深度的增加,模型的準確率會下降,通常這種下降是由于模型的過擬合造成的,但是在這里卻不是由于模型的過擬合造成的。為了避免這種情況,ResNet網(wǎng)絡提出了一種Residual block,如圖1所示,加入我們要學習的特征是H(x),那么在第一個卷積層中我們可以學到的知識是F(x),那么我們?nèi)绻頕(x)=H(x)-x的話,我們就可以添加一條捷徑,使得網(wǎng)絡在經(jīng)過兩個卷積層過后可以獲得更好的結果,同時不丟失一些比較好的特征。
圖1
整個ResNet的網(wǎng)絡結構就是由上面的殘差塊組成的,本文使用的是ResNet50,也就是說總共有16個殘差塊,其中每個殘差塊由3個卷積層,每個卷積層后面會有一個BN層,BN層后面是激活函數(shù),本文中激活函數(shù)使用Relu。首先網(wǎng)絡接受一個224*224*3大小的場景圖片,然后是64個7*7大小的卷積核,步長為2,后面是一個最大池化層。后面是16個參差塊,每個參差塊有3個卷積層構成,包含1*1,3*3,1*1的卷積核大小。第一種參差塊卷積核的個數(shù)分別為64,64,256,總共有3個這樣的參差塊。第二個殘差塊的卷積核個數(shù)分別為128,128,512,共有4個。第三個殘差塊的卷積核個數(shù)分別為256,256,1024,共有6個。第四個殘差塊的卷積核個數(shù)分別問512,512,2018,共有3個。最后是一個80的全連接層。
本文采用在ImageNet中訓練好的ResNet50對網(wǎng)絡進行參數(shù)初始化,然后對整個模型中的參數(shù)進行更新,實驗發(fā)現(xiàn)這樣的效果比只更新最后全連接層的參數(shù)要好很多。
Inception的結構最初是在GoogleNet這個網(wǎng)絡結構中提出來的。從14年開始各種各樣的網(wǎng)絡通過增加網(wǎng)絡的深度以及寬度在圖像分類這個任務上提高了比較多的準確率。但是這樣的操作在提升了網(wǎng)絡效果的同時增加了計算的復雜度,同時參數(shù)的數(shù)量也大大的增加,比如vgg需要196億FLOP,但是使用了Inception結構的GoogleNet就會少很多。
卷積核的大小如果比較大的情況下,對應的計算就會比較多,同樣參數(shù)的數(shù)量也會比較多,比如n個5*5的卷積核需要25×n個網(wǎng)絡參數(shù),但是如果使用3*3的卷積核的話,需要的參數(shù)就比原來少了16個。因此在使用相同大小的特征圖的情況下,卷積核的大小應該是越小越好。那么5*5的卷積核是否可以用更小,但是個數(shù)會稍微多一點的卷積核來替代。假如我們放大一下5*5的卷積的計算圖的話,我們可以看到每一次的輸出都更像是一個更小的全連接網(wǎng)絡,在其輸入上滑動5*5大小的位置,那么我們可以利用平移不變性使用兩個更小的卷積運算來代替這樣一個比較大的卷積運算。首先是一個使用3*3大小卷積核的卷積層,然后在這一層的輸出后跟一個使用3*3大小卷積核的卷積層,這樣經(jīng)過這兩個卷積層的輸出與原來使用5*5大小的卷積核的輸出是相同的。一個Inception塊的結構如圖2所示:
圖2 一個Inception塊的結構圖
圖3 nception塊的結構圖
通過如上的分析,我們可以發(fā)現(xiàn)一個n*n的卷積核同樣可以使用一個1×n的卷積核,然后再接一個n×1的卷積核來替代。但是這樣做會有一個比較不好的效果就是在一些比較淺的層中使用這樣的結構往往不會取得很好的效果,但是在一些中等的網(wǎng)絡尺寸上會取得比較不錯的效果,因此在InceptionV3中通常會使用1*7和7*1的卷積核去替代7*7的卷積核,而不會去替代一下本身就比較小的卷積核。本部分的Inception塊的結構如圖3所示。
另外使用了擴展輸出的Inception塊可以提取到更多的高維的特征,這種的Inception塊如圖4所示:
圖4 Inception塊圖
整個InceptionV3的結構為:首先網(wǎng)絡接受224*224*3大小的輸入,然后是3個卷積層,卷積核的大小是3*3,后面會有一個池化層,后面會跟3個3*3大小的卷積層。然后是Inception的結構,首先3個圖2的Inception塊,然后5個圖3的Inception塊,后面是2個圖4的Inception塊。再然后是一個8*8的卷積核,后面是softmax分類。
本文對原始的InceptionV3進行了部分調整,將網(wǎng)絡的輸入調整到了224*224*3,同時最后一個全連接層的大小為80。使用在ImageNet訓練好的InceptionV3的參數(shù)進行初始化網(wǎng)絡,然后全部更新網(wǎng)絡的參數(shù)。
準確率是一種對深度學習模型進行評估的最簡單的方法。故名思議,準確率是指被正確分類的場景圖片占所有圖片的比例,比如總共100張圖片中有99張場景圖片都被正確的分類了,那么我們的準確率就是99%。
aichallenger競賽中采用top3的準確率作為模型優(yōu)劣的評價方法。我們的模型在最后的全連接層會輸出80個概率,我們會將這80個概率從大到小進行排序,從中選擇較大的3個概率所代表的類別,如果這3個類別中有一個類別和真實的類別一致,那么我們就認為該樣本被分類正確了。
如今是信息化的年代,場景分類任務對于我們的生活來說也越來越重要,隨著計算計算資源的提升,尤其是GPU的大規(guī)模更新,利用深度學習解決這個任務也變得越來越簡單。同時場景分類可以應用到安防以及社交網(wǎng)絡中,有著非常廣泛的研究前景。
本文主要介紹了場景分類的背景,意義,研究現(xiàn)狀,以及場景分類的一般步驟,重點介紹了場景分類的方法,利用ResNet,Inception等方法解決了場景分類的部分問題。
但是,場景分類還存在著很多的問題,包括1)場景分類方法的準確率還沒有達到人類的高度2)在對圖像做裁剪的時候丟失了很多的信息。