您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

圖像分類的方法之深度學(xué)習(xí)與傳統(tǒng)機(jī)器學(xué)習(xí)

大?。?/span>0.21 MB 人氣: 2017-09-28 需要積分:2

  圖像分類,顧名思義,是一個輸入圖像,輸出對該圖像內(nèi)容分類的描述的問題。它是計算機(jī)視覺的核心,實際應(yīng)用廣泛。

  圖像分類的傳統(tǒng)方法是特征描述及檢測,這類傳統(tǒng)方法可能對于一些簡單的圖像分類是有效的,但由于實際情況非常復(fù)雜,傳統(tǒng)的分類方法不堪重負(fù)?,F(xiàn)在,我們不再試圖用代碼來描述每一個圖像類別,決定轉(zhuǎn)而使用機(jī)器學(xué)習(xí)的方法處理圖像分類問題。

  

  目前,許多研究者使用CNN等深度學(xué)習(xí)模型進(jìn)行圖像分類;另外,經(jīng)典的KNN和SVM算法也取得不錯的結(jié)果。然而,我們似乎無法斷言,哪種方法對于圖像分來問題效果最佳。

  

  本項目中,我們做了一些有意思的事情:

  1. 將業(yè)內(nèi)普遍用于圖像分類的CNN和遷移學(xué)習(xí)算法與KNN,SVM,BP神經(jīng)網(wǎng)絡(luò)進(jìn)行比較。

  2. 獲取深度學(xué)習(xí)經(jīng)驗。

  3. 探索谷歌機(jī)器學(xué)習(xí)框架TensorFlow

  下面是具體實施細(xì)節(jié)。

  系統(tǒng)設(shè)計

  在本項目中,用于實驗的5種算法為KNN、SVM、BP神經(jīng)網(wǎng)絡(luò)、CNN以及遷移學(xué)習(xí)。我們采用如下三種方式進(jìn)行實驗:

  1. KNN、SVM、BP神經(jīng)網(wǎng)絡(luò)是我們在學(xué)校能夠?qū)W到的。功能強(qiáng)大而且易部署。所以第一步,我們主要使用sklearn實現(xiàn)KNN,SVM,和BP神經(jīng)網(wǎng)絡(luò)。

  2. 由于傳統(tǒng)的多層感知機(jī)模型在圖像識別方面效果甚佳,但由于其節(jié)點間的全連接模式對于其延展性造成了阻礙,因此對于高分辨率的圖像,識別率不是很理想。所以這一步,我們用Google TensorFlow框架構(gòu)建CNN。

  3. 對于已經(jīng)預(yù)訓(xùn)練過的深度神經(jīng)網(wǎng)絡(luò)Inception V3進(jìn)行重訓(xùn)練。Inception V3由TensorFlow提供,使用ImageNet自2012年以來的數(shù)據(jù)進(jìn)行訓(xùn)練。ImageNet是計算機(jī)視覺領(lǐng)域一個經(jīng)典挑戰(zhàn),參賽者試圖用模型將全部圖像放至1000個分類中。為了要重新訓(xùn)練已經(jīng)預(yù)訓(xùn)練好的模型,我們必須保證我們自己的數(shù)據(jù)集沒有被預(yù)訓(xùn)練過。

  實施

  第一種方法:使用sklearn預(yù)處理數(shù)據(jù)以及實現(xiàn)KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)。

  步驟1,使用openCV包,定義2個預(yù)處理函數(shù),分別是圖像特征向量(用來調(diào)整圖像大小并將圖像扁平化成一系列行像素)和提取顏色直方圖(使用cv2.normalize從HSV色域中提取一個3D顏色直方圖并做平滑處理)。

  步驟2,構(gòu)造參數(shù)。由于我們試圖在整個數(shù)據(jù)集以及具有不同類別數(shù)目的子數(shù)據(jù)集上進(jìn)行性能測試,所以我們把各個數(shù)據(jù)集看作為參數(shù),以便進(jìn)行實驗分析。另外,我們還設(shè)置了KNN中的鄰居數(shù)目作為參數(shù)。

  步驟3,提取圖像特征并寫入數(shù)組。我們使用cv2.imread函數(shù)讀取圖像,根據(jù)規(guī)范化的圖像名稱進(jìn)行分類。然后運行第步驟1中提到的2個函數(shù),分別得到2種圖像特征并寫入數(shù)組。

  步驟4,使用函數(shù)train_test_split分割數(shù)據(jù)集。85%的數(shù)據(jù)作為訓(xùn)練集,15%的數(shù)據(jù)作為測試集。

  步驟5,使用KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)方法去評估數(shù)據(jù)。對于KNN,使用KNeighborsClassifier,對于SVM,使用SVC,對于BP神經(jīng)網(wǎng)絡(luò),使用MLPClassifier。

  第二種方法:基于TensorFlow構(gòu)建CNN。使用TensorFlow得到計算圖并在C++中實現(xiàn),比Python更高效。

  TensorFlow中使用到的的幾個概念:占位符,變量,數(shù)學(xué)公式,成本計量,最優(yōu)方法,CNN體系結(jié)構(gòu)。

  步驟1,第一層放置圖像。

  步驟2,構(gòu)建3層卷積層(3 Convolutional layers),2X2的max-pooling和ReLU。輸入是4維張量:【圖像編號,Y坐標(biāo),X坐標(biāo),通道】。輸出是另一個經(jīng)處理得到的4維張量:【圖像編號(不變),Y坐標(biāo),X坐標(biāo),通道】。

  步驟3,構(gòu)建2層全連接層(2 Fully-Connected Layers)。輸入是2維張量:【圖像編號,輸入編號】。輸出是2維張量【圖像編號,輸出編號】。使用

  步驟4,使用合并層(Flatten Layer)鏈接卷積層和全連接層。

  步驟5,使用softmax layer標(biāo)準(zhǔn)化輸出。

  步驟6,優(yōu)化訓(xùn)練結(jié)果。我們使用交叉熵(cross entropy)作為成本計量函數(shù),取其均值。最優(yōu)方法使用tf.train.AdamOptimizer()。

  第三種方法:Retrain Inception V3。使用Retrain Inception V3 ,并利用遷移學(xué)習(xí)減少工作量。

  我們得到pre-trained模型,移除原有頂層,訓(xùn)練新模型。然后分析在磁盤上的所有圖像并計算它們的bottleneck值。腳本會運行4000次。每次運行都會從訓(xùn)練集中隨機(jī)選取10個圖像,找到它們的bottleneck值并注入最后一層得到預(yù)測結(jié)果。然后在反向傳播過程中,根據(jù)預(yù)測結(jié)果和實際標(biāo)簽的比較結(jié)果去更新每層的權(quán)重。

  實驗

  實驗中使用到的數(shù)據(jù)集是Oxford-IIIT Pet 數(shù)據(jù)集。

  http://www.robots.ox.ac.uk/~vgg/data/pets/

  其中有犬類25類,貓類12類。每類有200個圖像。我們使用到該數(shù)據(jù)集中的10個類別的貓的數(shù)據(jù),分別是[‘Sphynx’,’Siamese’,’Ragdoll’,’Persian’,’Maine-Coon’,’British-shorthair’,’Bombay’,’Birman’,’Bengal’,’Abyssinian’]。即,共有2000個圖像,由于圖像大小不一,我們調(diào)整大小統(tǒng)一為固定尺寸64X64或128X128。

  本項目中,我們主要使用OpenCV預(yù)處理圖像。一般通過變形、剪裁或亮化隨機(jī)處理訓(xùn)練集。

  github:https://github.com/aleju/imgaug

  賦值

  第一種方法:KNN,SVM,和BP神經(jīng)網(wǎng)絡(luò)

  第一部分:使用sklearn預(yù)處理數(shù)據(jù)以及實現(xiàn)KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)。在image_to_feature_vector函數(shù)中,我們設(shè)定尺寸128X128。經(jīng)試驗表明,圖像尺寸越大,結(jié)果越精確,運行負(fù)擔(dān)越大。最終我們決定使用128X128的尺寸。在extract_color_histogram函數(shù)中,設(shè)定每個通道的容器數(shù)量為32,32,32。對于數(shù)據(jù)集,使用3種數(shù)據(jù)集。第一個是具有400個圖像,2個標(biāo)簽的子數(shù)據(jù)集。第二個是具有1000個圖像,5個標(biāo)簽的子數(shù)據(jù)集。第三個是整個數(shù)據(jù)集,1997個圖像,10個標(biāo)簽。

  在KNeighborsClassifier中,我們只改變鄰居數(shù)量且存儲結(jié)果作為每個數(shù)據(jù)集的最佳K值,其他參數(shù)默認(rèn)。

  在MLPClassifier中,我們設(shè)定每層有50個神經(jīng)元。

  在SVC中,最大迭代次數(shù)是1000,類權(quán)重是“balanced”。

  依據(jù)數(shù)據(jù)集,2個標(biāo)簽到10個標(biāo)簽不同,運行時間大約為3到5分鐘不等。

  第二種方法:基于TensorFlow構(gòu)建CNN

  由于在整個數(shù)據(jù)集中運行時間過長,我們在每個迭代中分批次處理。每批次一般有32個或64個圖像。數(shù)據(jù)集分為1600個圖像的訓(xùn)練集,400個圖像的驗證集,300個圖像的測試集。

  本方法中有大量的參數(shù)可調(diào)整。學(xué)習(xí)速率設(shè)定為1x10^-4;圖像大小設(shè)定為64x64和128x128;然后是層和形狀,然而有太多的參數(shù)可調(diào)整,我們依據(jù)經(jīng)驗并進(jìn)行實驗去得到最佳結(jié)果。

  為了得到最佳的layers,我們進(jìn)行實驗。首先,參數(shù)如下:

  # Convolutional Layer 1. filter_size1 = 5 num_filters1 = 64

  # Convolutional Layer 2. filter_size2 = 5 num_filters2 = 64

  # Convolutional Layer 3. filter_size3 = 5 num_filters3 = 128

  # Fully-connected layer 1. fc1_size = 256

  # Fully-connected layer 2. fc1_size = 256

  我們使用了3個卷積層和2個全連接層,然而悲劇的是過度擬合。經(jīng)過研究發(fā)現(xiàn),對于該構(gòu)造,我們的數(shù)據(jù)集過小,網(wǎng)絡(luò)過于復(fù)雜。

  最終,我們使用如下參數(shù):

  # Convolutional Layer 1. filter_size1 = 5 num_filters1 = 64

  # Convolutional Layer 2. filter_size2 = 3 num_filters2 = 64

  # Fully-connected layer 1. fc1_size = 128

  # Number of neurons in fully-connected layer.

  # Fully-connected layer 2. fc2_size = 128

  # Number of neurons in fully-connected layer.

  # Number of color channels for the images:

  # 1 channel for gray-scale. num_channels = 3

  我們只使用了2個卷積層和2個全連接層。依然不盡人意,經(jīng)過4000次迭代,結(jié)果仍舊過擬合,不過好在測試結(jié)果10%優(yōu)于前者。最終,經(jīng)過5000次迭代,我們得到43%的精確度,運行時間是半小時以上。

?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關(guān)規(guī)定!

      ?