神經網絡研究項目--以工程師的視角


                                   機器學習研究項目--以機器視覺工程師的視角(MLP篇)

 
一、 機器學習的基本概念和區分;
        機器學習的概念已經出現很長時間了,它本身也形成復雜的學科分類。這里基於相關資料學習,進行簡單的定義和區分。由於經驗有限,出現錯誤,歡迎提出修改意見。
        定義機器學習(Machine Learning)是一門專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的性能的學科。
        對於我們做圖像處理的具體項目,主要就是利用機器學習的方法,通過對大量數據的統計和挖掘,使得機器能夠自動識別、分割、處理圖像中展現的物體。
        區分
         1)bp神經網絡,誕生80年代末期,第一次 實現讓一個人工神經網絡模型從大量訓練樣本中學習統計規律,從而對未知事件做預測。bp最原始是3層的,多層的實現叫做MLP。
         2)svm是一種基於統計學習理論的模式識別方法,它在結構風險最小化的基礎上,為兩種不同類別的樣本數據找到一個最優分類面;
         3)boost指的是一種將弱學習算法提升為強學習算法的一類算法;
         4)dl和在圖像處理用途廣泛的 CNNs  dl的實質,是通過構建具有很多隱層的機器學習模型和海量的訓練數據,來學習更有用的特征,從而最終提升分類或預測的准確性。 
         CNNs 是第一個真正成功訓練多層網絡結構的學習算法,在圖像處理領域廣泛使用。
        相關概念:
        機器模仿的是人類,所以無論哪種機器學習算法,統計處理的都是圖片的特征。而這里的特征主要指的是不同物體的邊緣線。大腦不斷抽象這些特征,並且最終認識物體。而機器模仿這一過程。
二、作為機器視覺工程師需要掌握的工具和技術;
        源自數學和生物學的機器學習理論,借助計算機的強大運算能力,不斷改造我們的工程實踐。作為一名專注於圖像處理和機器視覺的程序員,在初步理解機器學習相關概念的基礎上,我更關注1)現在已經存在了哪些工具;2)如何利用這些工具來解決現實問題。
        這里主要研究實現MLP和 CNNs。設計到的工具為Opencv和專門用來解決CNNs問題的代碼,數據集是Mnist。
三、實際項目和統計分析;
       1)簡介
       Mnist是一個專門用來進行神經網絡訓練的數據集,其中主要包含的內容是收集的手寫體阿拉伯數字。原始網站上面提供4個文件,分別對應的是訓練圖像、訓練圖像對應的標簽;測試圖像、測試圖像對應的標簽。由於Mnist的數據並不是采用圖片格式保持的,所以我這里采用的是處理好的Mnist的數據,分為Train和Test兩個文件夾,其中的數據都已經按照對應的名稱命名好了。
       這里實現兩項內容,即采用MLP的方法對Mnist的訓練數據進行交叉檢驗和對其Test數據進程測試。
       2)核心內容
       1.取特征的方法,由於MlP是需要自己設定特征的,這里借助<<master opencv >>書中的取特征方法,主要思想就是橫向縱向的投影。
    
    // 獲取垂直和水平方向直方圖
    Mat ProjectedHistogram(Mat img,  int t)
    {
     int sz =(t) ?img.rows :img.cols;
    Mat mhist =Mat : :zeros( 1,sz,CV_32F);
     for( int j = 0; j <sz; j ++){
        Mat data =(t) ?img.row(j) :img.col(j);
        mhist.at < float >(j) =countNonZero(data);   
    }
     //Normalize histogram
     double min, max;
    minMaxLoc(mhist,  &min,  &max);
     if(max > 0)
        mhist.convertTo(mhist, - 1 ,  1.0f /max,  0);
     return mhist;
    }
//獲得特征
   Mat features(Mat in,  int sizeData)
   {
     //Histogram features
    Mat vhist =ProjectedHistogram(in,VERTICAL);
    Mat hhist =ProjectedHistogram(in,HORIZONTAL);
     //Low data feature
    Mat lowData;
    resize(in, lowData, Size(sizeData, sizeData) );
     //Last 10 is the number of moments components
     int numCols =vhist.cols +hhist.cols +lowData.cols *lowData.cols;
    Mat out =Mat : :zeros( 1,numCols,CV_32F);
     int j = 0;
     for( int i = 0; i <vhist.cols; i ++)
    {
        out.at < float >(j) =vhist.at < float >(i);
        j ++;
    }
     for( int i = 0; i <hhist.cols; i ++)
    {
        out.at < float >(j) =hhist.at < float >(i);
        j ++;
    }
     for( int x = 0; x <lowData.cols; x ++)
    {
         for( int y = 0; y <lowData.rows; y ++){
            out.at < float >(j) =( float)lowData.at < unsigned  char >(x,y);
            j ++;
        }
    }
     //if(DEBUG)
     //    cout << out << "\n===========================================\n";
     return out;
}
           2.Opencv中提供的MLP相關函數, 核心為CNN的創建。這里的layers不是神經網絡層,而是Opencv對MLP創建定義的一種參數輸入方式。里面有兩點是可以修改的,一個是_neurons,這個對應的是神經網絡層數;一個是 CvANN_MLP : : SIGMOID_SYM 對應的是ann的訓練方法.
           
    Mat layers( 13, CV_32SC1);
    layers.at < int >( 0= TrainingData.cols;
    layers.at < int >( 1= _neurons;
    layers.at < int >( 2= numCharacter;
    ann.create(layers, CvANN_MLP : :SIGMOID_SYM,  11);
    //CvANN_MLP::IDENTITY, CvANN_MLP::SIGMOID_SYM, and CvANN_MLP::GAUSSIAN.
       訓練 
    ann.train( TrainingData, trainClasses, weights );
      預測
    ann.predict(f, output); 
     3 )具體內容請參考原始代碼,這里說一下代碼結構
     
     主要是5個文件。其中GOCvHelper實現的是文件輸入輸出查找等相關函數;GOMlpHelper實現的和MLP相關的函數;而maintest是主要過程
      //主要測試文件
#include "stdafx.h"
#include "GOCvhelper.h"
#include "GOMlpHelper.h"
//jsxyhelu.cnblogs.com 2015年3月
//基於opencv和mnist的mlp測試
void main()
{    
 
     int p[4]={5,10,15,20};
      int n[8]={20,40,60,80,100,120,140,160};
      for (int i=0;i<4;i++)
      {
          for (int j=0;j<8;j++)
          {        
            char *txt = new char[50];
            sprintf(txt,"交叉訓練,特征維度%d,神網層數%d",p[i],n[j]);
             AppendText("output.txt",txt);
                  //step 1
                  annPreper();
                  //step 2
                  annTrain(p[i],n[j],"ann_data.xml","ann.xml");
                  //step 3
                  annKfoldTest("ann.xml",p[i]);
          }
      }
    cout<<"交叉訓練結束!吼吼!"<<endl;
    getchar();
    return;
}
 
     4)結果。這里展現的是對於不同參數下面,Mnist數據交叉檢驗的結果(取平均准確率和最低准確率)。這里的不同參數,指的是特征的維度和神經網絡的層數。通過結果分析,在( 特征維度 5 ,神網層數 80 )的情況下,訓練的結果最好,那么以后再進行具體的預測的時候,就可以取這個參數。
交叉訓練,特征維度 5,神網層數 20
平均正確率 0. 924876,最低正確率 0. 697436
交叉訓練,特征維度 5,神網層數 40
平均正確率 0. 929420,最低正確率 0. 706840
交叉訓練,特征維度 5,神網層數 60
平均正確率 0. 910902,最低正確率 0. 684524
交叉訓練,特征維度 5,神網層數 80
平均正確率 0. 946602,最低正確率 0. 724638
交叉訓練,特征維度 5,神網層數 100
平均正確率 0. 863204,最低正確率 0.000000
交叉訓練,特征維度 5,神網層數 120
平均正確率 0. 630426,最低正確率 0.000000
交叉訓練,特征維度 5,神網層數 140
平均正確率 0. 670202,最低正確率 0.000000
交叉訓練,特征維度 5,神網層數 160
平均正確率 0. 579037,最低正確率 0.000000
交叉訓練,特征維度 10,神網層數 20
平均正確率 0. 905349,最低正確率 0. 718750
交叉訓練,特征維度 10,神網層數 40
平均正確率 0. 759788,最低正確率 0. 541284
交叉訓練,特征維度 10,神網層數 60
平均正確率 0. 940838,最低正確率 0. 620438
交叉訓練,特征維度 10,神網層數 80
平均正確率 0. 898533,最低正確率 0. 627737
交叉訓練,特征維度 10,神網層數 100
平均正確率 0. 723310,最低正確率 0.000000
交叉訓練,特征維度 10,神網層數 120
平均正確率 0. 668532,最低正確率 0.000000
交叉訓練,特征維度 10,神網層數 140
平均正確率 0. 663412,最低正確率 0.000000
交叉訓練,特征維度 10,神網層數 160
平均正確率 0. 713898,最低正確率 0.000000
交叉訓練,特征維度 15,神網層數 20
平均正確率 0. 668120,最低正確率 0. 043796
交叉訓練,特征維度 15,神網層數 40
平均正確率 0. 821110,最低正確率 0. 587302
交叉訓練,特征維度 15,神網層數 60
平均正確率 0. 717837,最低正確率 0.000000
交叉訓練,特征維度 15,神網層數 80
平均正確率 0. 740954,最低正確率 0. 509434
交叉訓練,特征維度 15,神網層數 100
平均正確率 0. 691856,最低正確率 0.000000
交叉訓練,特征維度 15,神網層數 120
平均正確率 0. 653666,最低正確率 0.000000
交叉訓練,特征維度 15,神網層數 140
平均正確率 0. 642795,最低正確率 0.000000
交叉訓練,特征維度 15,神網層數 160
平均正確率 0. 676031,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 20
平均正確率 0. 651077,最低正確率 0. 029762
交叉訓練,特征維度 20,神網層數 40
平均正確率 0. 731983,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 60
平均正確率 0. 704698,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 80
平均正確率 0. 747636,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 100
平均正確率 0. 790314,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 120
平均正確率 0. 726250,最低正確率 0. 009434
交叉訓練,特征維度 20,神網層數 140
平均正確率 0. 679839,最低正確率 0.000000
交叉訓練,特征維度 20,神網層數 160
平均正確率 0. 650891,最低正確率 0.000000
 
 
四、小結;
      這里提供的是一種基於Opencv這種工具和Mnist這個數據集的MLP的具體實現和測試.這種框架應該說稍加修改就能夠應用於不同的數據集中去。在整個訓練的過程中,感到比較困難的是對於數據的預處理。由於MLP要求所有的訓練和測試數據其維度都是一樣的,而且Opencv在實現的過程中,采用了將所有的數據壓縮到一個Mat中的方法,所以有一些麻煩。
     這里值得注意的一點是,MLP中圖像的特征是需要手動生成的。也就是將將圖像降維的方法是需要手動設定的。這個方法的選擇很大程度上決定了最終的結果是否理想。
     而對於CNNs來說,它以更為復雜的實現方法,達到了這樣一種效果:那就是不需要手動地設定特征選取的方法,計算機通過自己的訓練來自己選擇特征。這是非常令人激動的地方,我將在下一篇博文中展現其實現,感性關注。
 

代碼:http://pan.baidu.com/s/1hqvNmg0
mnist文件:http://pan.baidu.com/s/1kTuviAz   http://pan.baidu.com/s/1qWoLuPI




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM