圖像分類(lèi)的方法之深度學(xué)習(xí)與傳統(tǒng)機(jī)器學(xué)習(xí)
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
圖像分類(lèi),顧名思義,是一個(gè)輸入圖像,輸出對(duì)該圖像內(nèi)容分類(lèi)的描述的問(wèn)題。它是計(jì)算機(jī)視覺(jué)的核心,實(shí)際應(yīng)用廣泛。
圖像分類(lèi)的傳統(tǒng)方法是特征描述及檢測(cè),這類(lèi)傳統(tǒng)方法可能對(duì)于一些簡(jiǎn)單的圖像分類(lèi)是有效的,但由于實(shí)際情況非常復(fù)雜,傳統(tǒng)的分類(lèi)方法不堪重負(fù)?,F(xiàn)在,我們不再試圖用代碼來(lái)描述每一個(gè)圖像類(lèi)別,決定轉(zhuǎn)而使用機(jī)器學(xué)習(xí)的方法處理圖像分類(lèi)問(wèn)題。
目前,許多研究者使用CNN等深度學(xué)習(xí)模型進(jìn)行圖像分類(lèi);另外,經(jīng)典的KNN和SVM算法也取得不錯(cuò)的結(jié)果。然而,我們似乎無(wú)法斷言,哪種方法對(duì)于圖像分來(lái)問(wèn)題效果最佳。
本項(xiàng)目中,我們做了一些有意思的事情:
1. 將業(yè)內(nèi)普遍用于圖像分類(lèi)的CNN和遷移學(xué)習(xí)算法與KNN,SVM,BP神經(jīng)網(wǎng)絡(luò)進(jìn)行比較。
2. 獲取深度學(xué)習(xí)經(jīng)驗(yàn)。
3. 探索谷歌機(jī)器學(xué)習(xí)框架TensorFlow。
下面是具體實(shí)施細(xì)節(jié)。
系統(tǒng)設(shè)計(jì)
在本項(xiàng)目中,用于實(shí)驗(yàn)的5種算法為KNN、SVM、BP神經(jīng)網(wǎng)絡(luò)、CNN以及遷移學(xué)習(xí)。我們采用如下三種方式進(jìn)行實(shí)驗(yàn):
1. KNN、SVM、BP神經(jīng)網(wǎng)絡(luò)是我們?cè)趯W(xué)校能夠?qū)W到的。功能強(qiáng)大而且易部署。所以第一步,我們主要使用sklearn實(shí)現(xiàn)KNN,SVM,和BP神經(jīng)網(wǎng)絡(luò)。
2. 由于傳統(tǒng)的多層感知機(jī)模型在圖像識(shí)別方面效果甚佳,但由于其節(jié)點(diǎn)間的全連接模式對(duì)于其延展性造成了阻礙,因此對(duì)于高分辨率的圖像,識(shí)別率不是很理想。所以這一步,我們用Google TensorFlow框架構(gòu)建CNN。
3. 對(duì)于已經(jīng)預(yù)訓(xùn)練過(guò)的深度神經(jīng)網(wǎng)絡(luò)Inception V3進(jìn)行重訓(xùn)練。Inception V3由TensorFlow提供,使用ImageNet自2012年以來(lái)的數(shù)據(jù)進(jìn)行訓(xùn)練。ImageNet是計(jì)算機(jī)視覺(jué)領(lǐng)域一個(gè)經(jīng)典挑戰(zhàn),參賽者試圖用模型將全部圖像放至1000個(gè)分類(lèi)中。為了要重新訓(xùn)練已經(jīng)預(yù)訓(xùn)練好的模型,我們必須保證我們自己的數(shù)據(jù)集沒(méi)有被預(yù)訓(xùn)練過(guò)。
實(shí)施
第一種方法:使用sklearn預(yù)處理數(shù)據(jù)以及實(shí)現(xiàn)KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)。
步驟1,使用openCV包,定義2個(gè)預(yù)處理函數(shù),分別是圖像特征向量(用來(lái)調(diào)整圖像大小并將圖像扁平化成一系列行像素)和提取顏色直方圖(使用cv2.normalize從HSV色域中提取一個(gè)3D顏色直方圖并做平滑處理)。
步驟2,構(gòu)造參數(shù)。由于我們?cè)噲D在整個(gè)數(shù)據(jù)集以及具有不同類(lèi)別數(shù)目的子數(shù)據(jù)集上進(jìn)行性能測(cè)試,所以我們把各個(gè)數(shù)據(jù)集看作為參數(shù),以便進(jìn)行實(shí)驗(yàn)分析。另外,我們還設(shè)置了KNN中的鄰居數(shù)目作為參數(shù)。
步驟3,提取圖像特征并寫(xiě)入數(shù)組。我們使用cv2.imread函數(shù)讀取圖像,根據(jù)規(guī)范化的圖像名稱進(jìn)行分類(lèi)。然后運(yùn)行第步驟1中提到的2個(gè)函數(shù),分別得到2種圖像特征并寫(xiě)入數(shù)組。
步驟4,使用函數(shù)train_test_split分割數(shù)據(jù)集。85%的數(shù)據(jù)作為訓(xùn)練集,15%的數(shù)據(jù)作為測(cè)試集。
步驟5,使用KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)方法去評(píng)估數(shù)據(jù)。對(duì)于KNN,使用KNeighborsClassifier,對(duì)于SVM,使用SVC,對(duì)于BP神經(jīng)網(wǎng)絡(luò),使用MLPClassifier。
第二種方法:基于TensorFlow構(gòu)建CNN。使用TensorFlow得到計(jì)算圖并在C++中實(shí)現(xiàn),比Python更高效。
TensorFlow中使用到的的幾個(gè)概念:占位符,變量,數(shù)學(xué)公式,成本計(jì)量,最優(yōu)方法,CNN體系結(jié)構(gòu)。
步驟1,第一層放置圖像。
步驟2,構(gòu)建3層卷積層(3 Convolutional layers),2X2的max-pooling和ReLU。輸入是4維張量:【圖像編號(hào),Y坐標(biāo),X坐標(biāo),通道】。輸出是另一個(gè)經(jīng)處理得到的4維張量:【圖像編號(hào)(不變),Y坐標(biāo),X坐標(biāo),通道】。
步驟3,構(gòu)建2層全連接層(2 Fully-Connected Layers)。輸入是2維張量:【圖像編號(hào),輸入編號(hào)】。輸出是2維張量【圖像編號(hào),輸出編號(hào)】。使用
步驟4,使用合并層(Flatten Layer)鏈接卷積層和全連接層。
步驟5,使用softmax layer標(biāo)準(zhǔn)化輸出。
步驟6,優(yōu)化訓(xùn)練結(jié)果。我們使用交叉熵(cross entropy)作為成本計(jì)量函數(shù),取其均值。最優(yōu)方法使用tf.train.AdamOptimizer()。
第三種方法:Retrain Inception V3。使用Retrain Inception V3 ,并利用遷移學(xué)習(xí)減少工作量。
我們得到pre-trained模型,移除原有頂層,訓(xùn)練新模型。然后分析在磁盤(pán)上的所有圖像并計(jì)算它們的bottleneck值。腳本會(huì)運(yùn)行4000次。每次運(yùn)行都會(huì)從訓(xùn)練集中隨機(jī)選取10個(gè)圖像,找到它們的bottleneck值并注入最后一層得到預(yù)測(cè)結(jié)果。然后在反向傳播過(guò)程中,根據(jù)預(yù)測(cè)結(jié)果和實(shí)際標(biāo)簽的比較結(jié)果去更新每層的權(quán)重。
實(shí)驗(yàn)
實(shí)驗(yàn)中使用到的數(shù)據(jù)集是Oxford-IIIT Pet 數(shù)據(jù)集。
http://www.robots.ox.ac.uk/~vgg/data/pets/
其中有犬類(lèi)25類(lèi),貓類(lèi)12類(lèi)。每類(lèi)有200個(gè)圖像。我們使用到該數(shù)據(jù)集中的10個(gè)類(lèi)別的貓的數(shù)據(jù),分別是[‘Sphynx’,’Siamese’,’Ragdoll’,’Persian’,’Maine-Coon’,’British-shorthair’,’Bombay’,’Birman’,’Bengal’,’Abyssinian’]。即,共有2000個(gè)圖像,由于圖像大小不一,我們調(diào)整大小統(tǒng)一為固定尺寸64X64或128X128。
本項(xiàng)目中,我們主要使用OpenCV預(yù)處理圖像。一般通過(guò)變形、剪裁或亮化隨機(jī)處理訓(xùn)練集。
github:https://github.com/aleju/imgaug
賦值
第一種方法:KNN,SVM,和BP神經(jīng)網(wǎng)絡(luò)
第一部分:使用sklearn預(yù)處理數(shù)據(jù)以及實(shí)現(xiàn)KNN,SVM和BP神經(jīng)網(wǎng)絡(luò)。在image_to_feature_vector函數(shù)中,我們?cè)O(shè)定尺寸128X128。經(jīng)試驗(yàn)表明,圖像尺寸越大,結(jié)果越精確,運(yùn)行負(fù)擔(dān)越大。最終我們決定使用128X128的尺寸。在extract_color_histogram函數(shù)中,設(shè)定每個(gè)通道的容器數(shù)量為32,32,32。對(duì)于數(shù)據(jù)集,使用3種數(shù)據(jù)集。第一個(gè)是具有400個(gè)圖像,2個(gè)標(biāo)簽的子數(shù)據(jù)集。第二個(gè)是具有1000個(gè)圖像,5個(gè)標(biāo)簽的子數(shù)據(jù)集。第三個(gè)是整個(gè)數(shù)據(jù)集,1997個(gè)圖像,10個(gè)標(biāo)簽。
在KNeighborsClassifier中,我們只改變鄰居數(shù)量且存儲(chǔ)結(jié)果作為每個(gè)數(shù)據(jù)集的最佳K值,其他參數(shù)默認(rèn)。
在MLPClassifier中,我們?cè)O(shè)定每層有50個(gè)神經(jīng)元。
在SVC中,最大迭代次數(shù)是1000,類(lèi)權(quán)重是“balanced”。
依據(jù)數(shù)據(jù)集,2個(gè)標(biāo)簽到10個(gè)標(biāo)簽不同,運(yùn)行時(shí)間大約為3到5分鐘不等。
第二種方法:基于TensorFlow構(gòu)建CNN
由于在整個(gè)數(shù)據(jù)集中運(yùn)行時(shí)間過(guò)長(zhǎng),我們?cè)诿總€(gè)迭代中分批次處理。每批次一般有32個(gè)或64個(gè)圖像。數(shù)據(jù)集分為1600個(gè)圖像的訓(xùn)練集,400個(gè)圖像的驗(yàn)證集,300個(gè)圖像的測(cè)試集。
本方法中有大量的參數(shù)可調(diào)整。學(xué)習(xí)速率設(shè)定為1x10^-4;圖像大小設(shè)定為64x64和128x128;然后是層和形狀,然而有太多的參數(shù)可調(diào)整,我們依據(jù)經(jīng)驗(yàn)并進(jìn)行實(shí)驗(yàn)去得到最佳結(jié)果。
為了得到最佳的layers,我們進(jìn)行實(shí)驗(yà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個(gè)卷積層和2個(gè)全連接層,然而悲劇的是過(guò)度擬合。經(jīng)過(guò)研究發(fā)現(xiàn),對(duì)于該構(gòu)造,我們的數(shù)據(jù)集過(guò)小,網(wǎng)絡(luò)過(guò)于復(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個(gè)卷積層和2個(gè)全連接層。依然不盡人意,經(jīng)過(guò)4000次迭代,結(jié)果仍舊過(guò)擬合,不過(guò)好在測(cè)試結(jié)果10%優(yōu)于前者。最終,經(jīng)過(guò)5000次迭代,我們得到43%的精確度,運(yùn)行時(shí)間是半小時(shí)以上。
?
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
圖像分類(lèi)的方法之深度學(xué)習(xí)與傳統(tǒng)機(jī)器學(xué)習(xí)下載
相關(guān)電子資料下載
- 如何創(chuàng)建FPGA控制的機(jī)器人手臂 49
- 機(jī)器學(xué)習(xí)需要掌握的九種工具盤(pán)點(diǎn) 16
- 深度學(xué)習(xí)在工業(yè)缺陷檢測(cè)中的應(yīng)用 63
- 探討目前主流3D激光SLAM算法方案 94
- 華為成為中國(guó)首個(gè)PyTorch基金會(huì)Premier會(huì)員 453
- Hugging Face被限制訪問(wèn) 404
- 《人工智能在指揮和控制系統(tǒng)中的決策支持》 133
- 中國(guó)手機(jī)廠商發(fā)力這一領(lǐng)域 外媒:大戲剛剛開(kāi)始 262
- 生成式人工智能和機(jī)器學(xué)習(xí)正在這9個(gè)學(xué)科中打造未來(lái) 216
- 智慧礦山AI算法帶你解決皮帶運(yùn)行難題! 51