日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

libsvm Minist Hog 手写体识别

發(fā)布時(shí)間:2025/7/25 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 libsvm Minist Hog 手写体识别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


統(tǒng)計(jì)手寫數(shù)字集的HOG特征

轉(zhuǎn)載請(qǐng)注明出處,樓燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/

這篇文章是模式識(shí)別的小作業(yè),利用svm實(shí)現(xiàn)Minist數(shù)據(jù)集手寫體識(shí)別,在這里我實(shí)現(xiàn)了opencv中的svm和libsvm兩個(gè)版本,供大家做參考。

[https://github.com/YihangLou/SVM-Minist-HandWriting-Recognition]https://github.com/YihangLou/SVM-Minist-HandWriting-Recognition?Github上的工程鏈接

Hog特征簡(jiǎn)介

本實(shí)驗(yàn)中,使用開源計(jì)算機(jī)視覺庫OpenCV作為圖像處理的基本工具,用其提供的loadImage函數(shù)讀入訓(xùn)練樣本后,首先我們考慮如何對(duì)樣本中的手寫數(shù)字特征進(jìn)行提取。在本實(shí)驗(yàn)中我們采取了方向梯度直方圖(Histogram of OrientedGradient, HOG)的方法。HOG特征是一種在計(jì)算機(jī)視覺和圖像處理中用來進(jìn)行物體檢測(cè)的特征描述子。在一副圖像中,局部目標(biāo)的表象和形狀能夠被梯度和邊緣的方向密度分布很好地描述,而HOG通過計(jì)算和統(tǒng)計(jì)圖像局部區(qū)域的梯度方向直方圖來構(gòu)成特征。

HOG特征提取算法的實(shí)現(xiàn)過程如下:

1)將待檢測(cè)的圖像灰度化;
2)采用Gamma校正法對(duì)輸入圖像進(jìn)行顏色空間的標(biāo)準(zhǔn)化(歸一化)。目的是調(diào)節(jié)圖像的對(duì)比度,降低圖像局部的陰影和光照變化所造成的影響,同時(shí)可以抑制噪音的干擾。
3)計(jì)算圖像每個(gè)像素的梯度(包括大小和方向)。主要是為了捕獲輪廓信息,同時(shí)進(jìn)一步弱化光照的干擾。
4)將圖像劃分成小cells(例如66像素/cell),并統(tǒng)計(jì)每個(gè)cell的梯度直方圖(不同梯度的個(gè)數(shù)),即可形成每個(gè)cell的descriptor。統(tǒng)計(jì)梯度直方圖過程如下:假設(shè)我們采用9個(gè)bin的直方圖來統(tǒng)計(jì)這66個(gè)像素的梯度信息。也就是將cell的梯度方向 分成9個(gè)方向塊,

如果這個(gè)像素的梯度方向 是 或者 ,直方圖第2個(gè)bin的計(jì)數(shù)就加1,這樣,對(duì)cell內(nèi)每個(gè)像素用梯度方向在直方圖中進(jìn)行加權(quán)投影(映射到固定的角度范圍),就可以得到這個(gè)cell的梯度方向直方圖了,就是該cell對(duì)應(yīng)的9維特征向量(因?yàn)橛?個(gè)bin)。梯度幅值 就是作為投影的權(quán)值的。例如說:這個(gè)像素的梯度方向是 ,然后它的梯度幅值 是2,那么直方圖第2個(gè)bin的計(jì)數(shù)就不是加1了,而是加2。
4)將每幾個(gè)cell組成一個(gè)block(例如3*3個(gè)cell/block),一個(gè)block內(nèi)所有cell的特征descriptor串聯(lián)起來便得到該block的HOG特征descriptor;
5)將圖像image內(nèi)的所有block的HOG特征descriptor串聯(lián)起來就可以得到該image的HOG特征descriptor了。這個(gè)就是最終的可供分類使用的特征向量了。

在我們的實(shí)驗(yàn)中使用OpenCV提供的HOG算子HOGDescriotiptor,它的構(gòu)造函數(shù)HOGDescriptor * hog = new HOGDescriptor(Size _winSize,Size _blockSize, Size _blockStride ,Size _cellSize , int bins);相關(guān)參數(shù)設(shè)置如表2.1所示。接下來我們只需再調(diào)用hog->compute()函數(shù)并以Image作為參數(shù)即可計(jì)算出其特征向量descriptors。
vectordescriptors;
hog->compute(Image, descriptors,Size(1,1), Size(0,0));

LibSVM配置

這里SVM的原理不就做介紹了,網(wǎng)上也有很多的資料介紹SVM

  • 首先設(shè)置SVM參數(shù)。LibSVM提供了SVM參數(shù)結(jié)構(gòu)svm_param,如下段代碼所示,各參數(shù)意義如表2.2所示。
    //配置SVM參數(shù)
    svm_parameter param;
    param.svm_type = C_SVC;
    param.kernel_type = RBF;
    param.degree = 10.0;
    param.gamma = 0.09;
    param.coef0 = 1.0;
    param.nu = 0.5;
    param.cache_size = 1000;
    param.C = 10.0;
    param.eps = 1e-3;
    param.p = 1.0;

在本實(shí)驗(yàn)中選擇了C_SVC類型的SVM,并且選擇了REF核函數(shù)。

  • 將待訓(xùn)練的特征向量整理成LibSVM使用的數(shù)據(jù)格式。2.1.1中使用OpenCV提供的HOG方法得到了特征向量descriptors,要在LibSVM中使用上還需符合LibSVM的訓(xùn)練數(shù)據(jù)文件格式,如下所示

    <label> <index1>:<value1> <index2>:<value2> ... 其中<label> 是訓(xùn)練數(shù)據(jù)集的目標(biāo)值,對(duì)于分類,它是標(biāo)識(shí)某類的整數(shù)(支持多個(gè)類)。<index> 是以1開始的整數(shù),可以是不連續(xù)的,但是必須在結(jié)尾處標(biāo)記為index=-1;<value>為實(shí)數(shù),也就是我們提取出的特征向量。例如我們處理第一張手寫圖片train_0_0.jpg,該圖片表示的是手寫數(shù)字0,那么<label>標(biāo)記為0;該圖片用HOG方法描述的特征向量descriptor是長度為324的vector<float>,那么將<index1>~<index324>分別標(biāo)記為0,1,2...323,<index325>標(biāo)記為-1表示結(jié)束;<value1>~<value324>分別賦值為descriptor[0],descriptor[1],descriptor[2]...descriptor[323]。
  • 調(diào)用svm_train函數(shù)開始訓(xùn)練,得到訓(xùn)練模型svm_model,并保存于“*.model”文件。前面兩個(gè)步驟已經(jīng)分別設(shè)置好了SVM的一系列參數(shù)param并整理了待訓(xùn)練特征向量的格式svm_prob,svm_train函數(shù)以param和svm_prob作為參數(shù)開始訓(xùn)練。

訓(xùn)練過程中輸出如圖所示,其中, #iter為迭代次數(shù);nu是選擇的核函數(shù)類型的參數(shù);obj為SVM文件轉(zhuǎn)換為的二次規(guī)劃求解得到的最小值;rho為判決函數(shù)的偏置項(xiàng)b;nSV為標(biāo)準(zhǔn)支持向量個(gè)數(shù)(0<a[i]<c);nBSV為邊界上的支持向量個(gè)數(shù)(a[i]=c);Total nSV為支持向量總個(gè)數(shù)(對(duì)于兩類來說, 因?yàn)橹挥幸粋€(gè)分類模型Total nSV = nSV但是對(duì)于多類,這個(gè)是各個(gè)分類模型的nSV之和)。
得到的“*.model”文件如下所示:

svm_type c_svc //所選擇的SVM類型,默認(rèn)為c_svc kernel_type rbf //訓(xùn)練采用的核函數(shù)類型, 此處為RBF核 gamma 0.09 //RBF核的參數(shù)γ nr_class 10 //類別數(shù), 此處為數(shù)字0~9,即10個(gè)分類問題 total_sv 6364 //支持向量總個(gè)數(shù) rho 1.57532 0.87752 -0.67652 0.45041 0.659519 -0.506248 0.534779 -1.06453 0.19707 -0.584892 -1.06272 -1.54669 -0.592897 -0.583714 -0.742219 -2.47223 -1.20282 -1.79853 -0.178512 -0.215509 -0.533352 0.286281 -1.75888 0.0187612 1.11297 2.04325 0.236593 0.855722 -0.836486 1.11822 0.096519 0.95863 -0.251392 -1.09347 -1.18159 -0.620122 0.237805 -2.51107 -0.453213 -0.0407495 -1.66436 -0.209359 -1.08233 -1.12835 1.5451//判決函數(shù)的偏置項(xiàng)b label 0 1 2 3 4 5 6 7 8 9 //原始文件中的類別標(biāo)識(shí) nr_sv 427 402 677 676 791 569 489 717 805 811//每個(gè)類的支持向量機(jī)的個(gè)數(shù) ......

4)讀入測(cè)試集圖片,提取其HOG特征并整理成LibSVM使用的數(shù)據(jù)格式svm_node。測(cè)試集格式與訓(xùn)練集格式的唯一不同在于測(cè)試集不需要標(biāo)記label,也具有index和value屬性。
5)調(diào)用svm_predict函數(shù)進(jìn)行測(cè)試。首先通過svm_model * 加載訓(xùn)練出的模型“*.Model”,svm_model 和svm_node作為svm_predict函數(shù)的參數(shù),該函數(shù)以返回一個(gè)int類型的數(shù)據(jù),即預(yù)測(cè)出的類別。

OpenCV SVM

除了2.1.2介紹的LibSVM工具,我們小組還嘗試了OpenCV提供的SVM工具,它是基于LibSVM軟件包開發(fā)的,優(yōu)點(diǎn)是使用起來比LibSVM更簡(jiǎn)潔,下面簡(jiǎn)要的介紹一下OpenCV中SVM的訓(xùn)練和測(cè)試兩階段:
1)OpenCV中的SVM在訓(xùn)練階段代碼如下所示:

void trainSVM(CvMat * & dataMat,CvMat * & labelMat ) {cout<<"train svm start"<<endl;cout<<dataMat<<endl;CvSVM svm;CvSVMParams param;//這里是SVM訓(xùn)練相關(guān)參數(shù) CvTermCriteria criteria; //這里是迭代終止準(zhǔn)則 criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON ); param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria ); svm.train( dataMat, labelMat, NULL, NULL, param );//訓(xùn)練數(shù)據(jù) svm.save( SVMModel.c_str()); cout<<"SVM Training Complete"<<endl; }

其中CvTermCriteria設(shè)置了迭代終止準(zhǔn)則,最大迭代次數(shù)設(shè)為1000次,結(jié)果的精確性設(shè)為FLT_EPSILON = 1.19e-7;CvSVMParams設(shè)置了SVM相關(guān)的訓(xùn)練參數(shù),參數(shù)具體設(shè)置仍如表2.1所示。與LibSVM不同的是,OpenCV不需要將特征向量整理成特定的格式,只需要特征向量按行順序排好,給出它們的label,就可以調(diào)用訓(xùn)練函數(shù)svm.train()進(jìn)行訓(xùn)練了。另外,OpenCV訓(xùn)練出的模型保存在“.xml”文件中而非LibSVM中的“.Model”文件,如圖2.3所示。

最后所有的支持向量個(gè)數(shù)為6364個(gè),與LibSVM完全一致,印證了OpenCV SVM底層是基于LibSVM的。

2)在測(cè)試階段,OpenCV SVM的用法與LibSVM基本一致,調(diào)用svm.predict函數(shù)進(jìn)行測(cè)試。首先通過CvSVM svm加載訓(xùn)練出的模型“*.xml”。接著將測(cè)試集圖片的HOG向量整理成一個(gè)個(gè)CvMat,它作為svm_predict函數(shù)的參數(shù)輸入,該函數(shù)以返回一個(gè)int類型的數(shù)據(jù),即預(yù)測(cè)出的類別。

代碼解讀

實(shí)驗(yàn)代碼實(shí)現(xiàn)了LibSVM 和OpenCV SVM分類功能,完成了各個(gè)函數(shù)功能的封裝,整個(gè)SVM分類器共分為8個(gè)函數(shù),分別為:readTrainFileList、processHogFeature、trainSVM、trainLibSVM,readTestFileList,testLibSVM,testSVM,releaseAll。其中,每個(gè)函數(shù)的輸入輸出設(shè)置以及功能如下表所示:

實(shí)驗(yàn)測(cè)試

本次實(shí)驗(yàn)使用“MNIST DATABASE”, 數(shù)據(jù)集包含了0-9數(shù)字手寫體,共有60000張訓(xùn)練數(shù)據(jù)集,10000張測(cè)試數(shù)據(jù)集。測(cè)試集的前5000個(gè)例子取自原始NIST訓(xùn)練集,后5000取自原始NIST測(cè)試集,前5000個(gè)數(shù)據(jù)要比后5000個(gè)數(shù)據(jù)更干凈、容易。
預(yù)測(cè)結(jié)果是輸出到txt中的,通過Python腳本來分析

1)訓(xùn)練正確率
在訓(xùn)練集上進(jìn)行正確率測(cè)試得到的結(jié)果是0.9884。
2)測(cè)試正確率
在10000張測(cè)試數(shù)據(jù)集上,我們的實(shí)驗(yàn)結(jié)果準(zhǔn)確率為0.9884,其中10*10的舉證結(jié)果如下,結(jié)果(i,j)代表將第i類錯(cuò)分為第j類的次數(shù)。

實(shí)驗(yàn)的主要錯(cuò)分類分析

實(shí)驗(yàn)中,有一些錯(cuò)分類很難避免,如4和9的錯(cuò)分以及7和2的錯(cuò)分,如下圖所示。由于實(shí)驗(yàn)數(shù)據(jù)本身難以識(shí)別,造成的錯(cuò)分占據(jù)整個(gè)實(shí)驗(yàn)數(shù)據(jù)的1%左右。

總結(jié)

以上是生活随笔為你收集整理的libsvm Minist Hog 手写体识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。