概率神經網絡 (PNN) 應用的簡單DEMO


      概率神經網絡的全稱是Probabilistic neural network,它主要用於模式分類,是基於貝葉斯策略前饋神經網絡。它有着堅實的數學理論基礎,當然本文並不打算從數學符號來對它進行介紹(有興趣的可翻閱推薦書目),而是通過一個簡單的C語言程序來認知它。

      介紹程序之前,先看下它基本模型的結構示意圖:

 

概率神經網絡(PNN)

      圖中可以看到基本分為三層,如果有了解神經網絡的話就很熟悉了。第一層是輸入層,就如它的名字負責接收數據的輸入;第二層是模式層,對數據進行收集整理;第三層是類別層,就是數據整理完后歸屬於哪一個類別的信息。最后就根據類別的信息輸出了,如果把輸出也作為一層的話,也可以看成四層結構。其中模式層神經元激活函數取高斯型函數 e(net-1)/Q*Q ,其中net = wkX (注:公式的來由涉及數學理論推導感興趣請參考其他文獻)

      PNN神經網絡主要是用於模式分類,在此我們就運用它實現一個識別車牌號圖像中的號碼與背景的程序,也就是車牌號圖像的二值化。本文僅用這個程序作為PNN神經網絡運用的簡單DEMO,因此對圖像進行些處理以簡化編程,采用8位BMP帶調色板的圖片格式存儲。

 

      想想我們看到上面這個車牌識別出上面的車牌號碼的原因,很明顯是由於車牌的號碼白色和它周圍的背景藍色有着鮮明的不同因此才能很容易的識別出車牌號碼。對於要完成的程序同樣也可以運用顏色差來完成識別。我們知道計算機顯示bmp圖片時采用的是RBG的值來描繪每一點的像素顏色,雖然看到圖像車牌背景都是藍色,但是如果放大來看藍色並不完全相同而且還有夾雜着些其他顏色,同樣車牌號也並非全部白色。分析到這里目標就清楚了,運用PNN神經網絡采集圖片中每個像素點的顏色RBG值,將接近藍色或者背景中出現的其他顏色分為A類,表示背景色;將接近白色的顏色分為B類,表示車牌號色。再用0、1這兩個數值來表示A類、B類,重新設置圖片中像素的顏色實現了車牌號圖像的二值化。

      程序的流程就比較明晰了,大致可分為三步,第一步,選取背景色和號碼色的樣本圖片收集它們各自的顏色樣本數據;第二步,運用收集的顏色數據訓練PNN神經網絡;第三步,將需要識別的車牌圖片中每個像素的顏色數據輸入PNN神經網絡完成分類,然后重置圖片顏色數據完成二值化。

      PNN神經網絡的設計,將RBG三個值作為輸入數據(還可以考慮YCbCr ),模式層里的每個神經元代表一種樣本顏色(可以看到即使訓練完了再添加樣本顏色非常方便,只要添加一個神經元即可無須改動先前訓練好的神經網絡,PNN神經網絡的一個很大的優勢),類別層的兩個單元分別代表背景色類和號碼色類。輸入層和模式層之間的權重存儲在二維指針 **w 中,模式層到類別層的關系存儲在**a 中,**a 中的值只能 0和1,每個模式層里的神經元對應的類別有且僅有一條邊值為1 用來說明該模式層神經元存儲的樣本顏色屬於該邊連接的類別。

      數據收集及神經網絡結構實現的偽代碼如下:

{

    讀取號碼顏色樣本;

    記錄號碼顏色樣本的顏色,並統計總數countHM;

    讀取背景顏色樣本;

    記錄背景顏色樣本的顏色,並統計總數countBJ;

 

    w = (long double **)malloc((countBJ+countHM)*sizeof(long double *));

    a = (int **)calloc((countBJ+countHM),sizeof(int *));

    for(i=0; i<(countBJ+countHM); i++){

        w[i]=(long double *)malloc(3*sizeof(long double));   //RBG  三個值

        a[i]=(int *)calloc(2,sizeof(int));

    }

}

   PNN神經網絡訓練偽代碼:

{

    FOR 記錄到的每一種顏色也就是每個模式層單元 j

        Xr,b,g = Xr,b,g/ sqrt(Xr*Xr+Xb*Xb+Xg*Xg); //這里歸一化時須采用這種方式

         w[j][Xr,b,g]= Xr,b,g

         IF 顏色屬於車牌號碼  a[j][1]=1;

         IF 顏色屬於車牌背景 a[j][0]=1;

}

     PNN 神經網絡分類算法為代碼:

{

         FOR 每一行

                FOR 每一列

                     判斷該像素點所屬類別 estimate(Xr,b,g){

                          FOR 每一個模式層神經元{

                               net=w[i][0]*Xr+w[i][1]*Xb+w[i][2]*Xg;

                               IF (a[i][0] == 1)

                                    BJ +=exp((net-1)/(Q * Q)); //Q為判別顏色相似窗口大小

                               IF (a[i][1] == 1)

                                    HM +=exp((net-1)/(Q * Q));

                          }

                        BJ 與 HM 誰大?

                        如果 BJ 則為背景,否則就是號碼;// 在BJ於HM 取相同值時默認為號碼類

                    }

     根據類別二值化該像素點;

     保存二值化后的圖像;

}

  完成程序后測試結果如下:

  采用的 背景樣本圖片y1  號碼樣本圖片y2(由於不支持BMP格式圖片上傳,在此貼出的是轉為gif格式后的圖片)

  y1   

   y2

  用該兩個樣本圖片訓練后,將以下車牌號碼圖片二值化后效果如下:

          

          

          

  實現的C語言源碼比較簡陋雜亂、很多考慮不周之處,在此就不打包出來了。

      如果對於PNN概率神經網絡的原理和數學推導感興趣的可翻閱推薦書目,里面講解很詳實。


 

推薦書目:

 《模式分類》 作者: Richard O. Duda / Peter E. Hart / David G. Stork


免責聲明!

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



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