上學期開了多媒體的課程,把其中一個課程設計實現的過程與你們分享。windows
轉載請註明出處,謝謝。
數組
這個課程設計是爲了實現圖像分類的整個過程,經過完成整個的工做過程,更好的理解圖像分類這一律念,提升本身的理論與實踐結合的能力。整個項目分爲四大步:導入數據、特徵提取部分、分類器訓練部分、標籤預測部分。根據課程,咱們選擇的數據集爲CIFAR-10,特徵提取採用的是GIST特徵提取方法,分類方法咱們使用的是LIBLINEAR中自帶的Train和Predict程序。到最後得出結果,進行結果分析。函數
CIFAR-10數據集包括60000個32x32彩色圖像,分佈在在10類,每一個類有6000幅圖像。這60000幅圖片中分別包括50000幅訓練圖像和10000幅測試圖像。 工具
數據集被分紅了五個訓練文件和一個測試文件,每個文件都有10000張圖片。測試文件中隨機的包含了每一個類的1000幅圖片,可是每一個訓練批次中的圖像是隨機的,其中包含的圖像並非固定同樣的。因此一些培訓批次可能某一個類包含更多的圖像。而五個訓練文件,每一個類的總數爲5000個,這樣就保證了樣本的機率平衡。測試
還須要注意的是,從CIFAR-10中加載的內容中的data數據是整數,須要咱們轉換成圖片,在網站上面咱們能夠看到也給出了相應的解釋。每個文件中有一個10000x3072N數組。數組的每一行存儲一個32x32的彩色圖像。前1024項表明的紅色,中間1024個表明的是綠色,和最後1024表明的是藍色。圖像存儲是按行主序,使數組的前32項是圖像的第一排紅色通道值。網站
根據項目提供的網站,咱們能夠大體知道,GIST特徵提取是提出一個識別現實世界的計算模型,這個模型繞過個別對象或區域的分割和處理。用一個五維的感知維度來表明一個場景的主要內容,包括天然性、開放性、粗糙度、擴張性和堅固性。這些維度可以可靠的估計使用的光譜和粗定位信息,雖有可用這些維度來表明一個場景圖片。spa
LIBLINEAR是一個用於大規模數據分類的線性分類器,支持邏輯迴歸和向量機。同時,LIBLINEAR還爲開發者提供了好用的命令行和庫接口。不論是開發者仍是深層次的使用者,LIBLINEAR都有對應的文檔供其查閱。實驗證實,LIBLINEAR對於大規模數據分析十分有效。命令行
從上面的數據集咱們能夠知道,數據的數量爲60000,而相應的類卻僅僅爲10,數據數量遠遠大於數據類別。因此咱們使用LIBLINEAR分類器,設計
從相應網站下載相應軟件。這裏CIFAR-10咱們下載MATLAB版,解壓數據獲得訓練和測試數據,能夠在MATLAB中用LOAD加載,只是如今的數據是整數類型,咱們須要將其轉換成圖片,而後對轉換後的圖片進行特徵提取,將相應的結果保存下來,保存的格式很是重要,咱們能夠將從LIBLINEAR中下載的數據中的heart-scale打開,記住相應的格式爲:labelID:feartures。重複將全部的圖片都作一遍,而後將全部的結果保存到一個特定的地方(Feartures.txt),就至關於特徵已經提取出來,接下來要作的只是運用LIBLINEAR分類器將所得的特徵進行分類(Train),而後用相應的數據進行測試而後進行標籤預測(Predict)。從而完成整個圖片分類過程。對象
實踐部分咱們根據上面的具體設計來進行
圖一:下載的CIFAR-10數據集包
將下載的數據在MATLAB中load後以下圖所示:
圖二:MATLAB中加載數據集
從上圖咱們能夠看到,data中的數據是以二維數組的形式存儲的圖片信息,每一行有3072個數據,恰好包括了紅、綠、藍三色,每一色的大小爲1024即32*32大小,每一行則表明一幅圖片。
下面進行二維數組到圖片的轉換。
RGB圖片的每個色由32*32的矩陣表示
因此咱們能夠設置變量Red,Green,Blue三個數組來用於讀取相應的顏色,而後將相應的顏色值存進Image裏面,這時Image就表示一幅圖片了
過程以下:
圖三:將data數據轉換成圖片
用Imshow(Image)結果以下:
圖四:CIFAR-10第一幅圖片
對着一幅圖片進行特徵提取,利用從網站下載下來的LMgist文件,能夠獲得以下的結果:
圖五:GIST特徵提取效果圖
下面咱們要對整個的數據進行收集,有50000個圖片信息要進行處理。分別load加載,能夠獲得相應的數據咱們設爲data1、data2、data3、data4、data5,而後用一個新的data合併這五個數據data=[data1;data2;data3;data4;data5]。這樣咱們就獲得一個50000*3072大小的矩陣了,這樣整個的數據就都導出來了。方法以下:
圖六:導入全部訓練數據
這樣數組sumdata中的數據就包含因此訓練數據了,sumdata1中的數據就是每一幅圖片的label了,代表每幅圖片屬於哪一個類。
這裏咱們使用的是Gist特徵提取,下載的gistdescriptor包中已經有了一個Gist函數,咱們只要進行調用就能夠,以下:
[gist1,param] = LMgist(Image,'',param);
這裏的Image就是數據導入的Image圖片,直接放入LMgist當中,能夠返回一個gist1數組,
咱們每導入一幅圖片的內容就進行相應的特徵提取,用一個1:50000的循環,將每一幅圖片都提取特徵。
過程以下:
圖七:調用LMgist進行特徵提取
將提取的特徵保存到相應的文件當中:
fid= fopen('E:/Feartrues.txt','w');
fprintf(fid,'%d',sumdata1(t));
fprintf(fid,'%d:%g', ii, gist1(1, ii));
fprintf(fid,'\n');
上面代碼將會在E盤Feartures.txt文件中保存提取的特徵,格式是按照前面提到的heart_scale文件中的格式的,labelID:Feartures。其中Feartures用一個512的向量進行保存。
在前面咱們介紹到,下載的數據包爲Liblinear-1.94,咱們找到其中一個文件heart_scale,已經介紹了,相應的數據格式,在第二步中已有詳細介紹。
將特徵提取的Feartures.txt文件做爲訓練數據的輸入,即Train Feartures.tx 咱們能夠獲得一個Feartures.model,這個model就是由訓練得出的分類器模型。其中在windows環境下,咱們能夠直接使用已經編譯鏈接好的可執行文件,該文件在解壓後windows目錄下。
Train的格式爲:
train[options] training_set_file [model_file];其中train_set_file爲咱們要測試的文件,就是上面的Feartures.txt,model_file爲輸出文件。
Options的一些操做,如multiclassclassification:
-stype :對於多分類,指定使用的分類器(默認是1):
0-- L2-regularized logistic regression(primal)
1-- L2-regularized L2-loss support vectorclassification (dual)
2-- L2-regularized L2-loss support vectorclassification (primal)
3-- L2-regularized L1-loss support vectorclassification (dual)
4-- support vector classification by Crammerand Singer
5-- L1-regularized L2-loss support vectorclassification
6-- L1-regularized logistic regression
7-- L2-regularized logistic regression (dual)
咱們能夠在訓練的時候使用multiclassclassification。
我使用的是下載包中自帶的Predict程序,在下載包中windows目錄下面能夠找到。而後用上面生成的Feartures.txt.model文件做爲一個輸入,而後從CIFAR-10中提出test_batch.mat文件做爲測試數據,而後output.txt爲輸出文件。
Predict用法:
predict[options] test_file model_file output_file
options:
-bprobability_estimates:是否輸出機率估計。默認是0,不輸出。只對logistic迴歸有用
-q:安靜模式(無輸出信息)
須要注意的是-b只在預測階段用到。這個和LIBSVM不一樣。
特徵提取的結果:】
圖八:特徵提取結果
從上面能夠看出,總共50000幅圖片,特徵提取的時間爲55.808367分鐘,電腦CPU是OCRE-i5,執行速度仍是相對較快的。特徵提取完以後,在E盤下面生成了一個Feartures.txt文件,打開要花點時間,有300多MB。
圖九:Feartures.txt內容
文件中的格式,跟咱們設計的是同樣的,總共50000行,每一行有512個特徵值,第一個數字爲label,符合項目要求。
按照前面訓練數據提取特徵的方法,將test_batch.mat測試文件中的數據也進行特徵提取,存進Test_data.txt中,而後就能夠看成Predict程序的一個輸入了。
圖十:提取測試數據
下表是Train的不一樣方法所用的時間和相應Predict的結果:
Train–S type Feartures.txt默認爲1
表一:訓練和預測結果表
-Stypemulticlass classification |
Train 時間 |
Predict時間 |
Predict結果 Accuracy |
-S0L2-regularizedlogistic regression(primal) |
91s |
4.6s
|
58.23%(5823/10000)
|
-S1L2-regularizedL2-loss support vectorclassification (dual) |
48s |
7.9s |
58.23%(5823/10000)
|
-S2L2-regularizedL2-loss support vectorclassification (primal) |
75s |
3.8s |
58.2%(5820/10000)
|
-S3L2-regularizedL1-loss support vectorclassification (dual) |
39s |
3.6s
|
56.08%(5608/10000)
|
-S4supportvector classification by Crammerand Singer |
45s |
3.9s
|
57.84%(5784/10000)
|
-S5L1-regularizedL2-loss support vectorclassification |
591s |
2.6s |
58.2%(5820/10000)
|
-S6L1-regularizedlogistic regression |
46s
|
3.9s
|
57.98%(5798/10000)
|
-S7L2-regularizedlogistic regression (dual) |
28.2s |
3.4s
|
58.23%(5823/10000)
|
從表中能夠看出不一樣模式下面的Train時間和Predict時間有所差距,可是差距都不是特別大,其中和其餘有較大差距的-S5的Train時間,是其餘的十倍左右。Predict時間集中模式都差很少,predict結果Accuracy都在60%如下,其中有幾項數據同樣,好比-S0、-S1、-S7都爲58.23%,-S2和-S5都是58.2%,其中-S7的train時間和Predict時間和結果綜合起來是這8種模式中最好的。