基於神經網路的車輛牌照字元識別技術

2020-10-04 11:00:20

利用給定的車牌影象庫中(在指定的資料夾之中),任意選擇其中的多副車牌影象,對其中包含的數位(09)或英文字元(AF)進行手工提取,由於提取以後的影象大小可能不一致,為了便於特徵提取,可以對各個圖形進行歸一化處理(例如:歸一化為10×20大小)。

字元分為訓練(每個字元至少有5個訓練樣本)和測試(每種字元可以選擇10個加以測試)兩大類。通過建立一個三層BP神經網路進行訓練,網路的各個引數自己設定。訓練完畢,對樣本進行測試,並計算測試的準確率。

 

 

四、實驗結果和分析

1、軟體的偵錯結果(包括偵錯出的內容和實驗的波形、資料、程式出現的現象或介面等)

2、結果分析(程式結果與實驗要求之間的差別和原因分析)

 

 

包含車牌號的汽車圖片。

 

 

 

 

通過程式執行提取的車牌區域

 

 

 

 

 

神經網路訓練二次均方差的收斂情況和學習率變化曲線

 

 

神經網路訓練時,其學習率和二次方差變化為

TRAINBPX: 0/5000 epochs,   lr = 0.1,      SSE = 68.1032.

TRAINBPX: 50/5000 epochs,  lr = 1.14674,  SSE = 10.093.

TRAINBPX: 100/5000 epochs, lr = 0.321983, SSE = 0.821155.

TRAINBPX: 150/5000 epochs, lr = 3.69231,  SSE = 0.314939.

TRAINBPX: 200/5000 epochs, lr = 42.3412,  SSE = 0.0345176.

TRAINBPX: 225/5000 epochs, lr = 143.382,  SSE = 0.00973975.

 

從最終輸出的a值可以看出,圖形識別還是有一定的誤差,但是都比較小。這主要是因為本來在程式設計中就有誤差率,所以最後的結果難免有偏差。

 

五、源程式清單

 

1:車牌號提取

% license plate recognition - car plate location based on color model

% modified by KouLiangzhi, Oct 10th,2007

I=imread('Car.jpg');

[y,x,z]=size(I);

myI=double(I);

 

%%%%%%%%%%% 統計分析 %%%%%%%%%%%%%%%

%%%%%%%% Y 方向 %%%%%%%%%%

Blue_y=zeros(y,1);

for i=1:y

    for j=1:x

            if((myI(i,j,1)<=121)&&myI(i,j,1)>=110&&((myI(i,j,2)<=155)&&(myI(i,j,2)>=141))&&((myI(i,j,3)<=240)&&(myI(i,j,3)>=210)))

% 藍色RGB的灰度範圍

               Blue_y(i,1)= Blue_y(i,1)+1;     % 藍色象素點統計

           end

    end

end

[temp MaxY]=max(Blue_y);        % Y方向車牌區域確定

PY1=MaxY;

while ((Blue_y(PY1,1)>=5)&&(PY1>1))

       PY1=PY1-1;

end   

PY2=MaxY;

while ((Blue_y(PY2,1)>=5)&&(PY2<y))

       PY2=PY2+1;

end

IY=I(PY1:PY2,:,:);

 

%%%%%%%% X 方向 %%%%%%%%%%

Blue_x=zeros(1,x);             % 進一步確定X方向的車牌區域

for j=1:x

    for i=PY1:PY2

            if((myI(i,j,1)<=121)&&myI(i,j,1)>=110&&((myI(i,j,2)<=155)&&(myI(i,j,2)>=141))&&((myI(i,j,3)<=240)&&(myI(i,j,3)>=210)))

               Blue_x(1,j)= Blue_x(1,j)+1;              

           end 

    end      

end

 

PX1=1;

while ((Blue_x(1,PX1)<3)&&(PX1<x))

       PX1=PX1+1;

end   

PX2=x;

while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

       PX2=PX2-1;

end

PX1=PX1+17;

PX2=PX2-1;

PY1=PY1+5;

PY2=PY2-2; % 對車牌區域的修正

 

Plate=I(PY1:PY2,PX1:PX2,:);

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

figure,imshow(Plate);

m=PX2-PX1;

n=PY2-PY1;

S=ones(n,m);

for j=1:m

    for i=1:n

            if((Plate(i,j,1)<=121)&&Plate(i,j,1)>=110&&((Plate(i,j,2)<=155)&&(Plate(i,j,2)>=141))&&((Plate(i,j,3)<=240)&&(Plate(i,j,3)>=210)))

               S(i,j)=0;       

           end 

    end      

end

 

 

2:神經網路訓練

%【步驟一、樣本輸入】

nntwarn off;

A=[0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1]';

B=[1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0]';

C=[0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 0]';

D=[1 1 1 1 0 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0]';

E=[1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1]';

F=[1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0]';

zer=[1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1]';

one=[0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0]';

two=[1 1 1 1 1 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1]';

thr=[1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1]';

fou=[1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0]';

fiv=[1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1]';

six=[1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1]';

sev=[1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]';

eig=[1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1]';

nin=[1 1 1 1 1 1 0 0 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1]';

% 則對訓練樣本的矩陣初始化如下:

alphabet=[A,B,C,D,E,F,zer,one,two,thr,fou,fiv,six,sev,eig,nin];

p=alphabet;

targets=eye(16,16);

t=targets;

%------------樣本的輸出值,即輸出目標向量,希望在每一種模式輸入時,在輸出的位置上輸出為1,其他的位置應該為0。若共有模式為16

%------------每種模式的樣本訓練為1個,則輸出向量可以簡單表示為: targetseye(16,16)

%----------------確定網路的輸入、隱層和輸出層

[r,q]=size(p);   %輸入

[s2,q]=size(t);  %輸出

s1=13;           %隱層神經元的數目,可以根據實際需要選擇,一般其數目不能超過訓練樣本的個數。

%-----------------確定網路訓練的初值

[w1,b1]=nwlog(s1,r);

[w2,b2]=rands(s2,s1);

 

 

【步驟二、設定網路引數並訓練】

%----------------確定網路訓練的引數

disp_freq=50;    %網路訓練的顯示頻率

max_epoch=5000;  %最大訓練次數

err_goal=0.01;   %訓練的誤差

lr=0.1;         %學習率大小

lr_inc=1.05;     %增量

lr_dec=0.5;      %減量

momentum=0.75;   %動量因子

err_ratio=1.05;  %誤差率

 

%-------------訓練開始

tp=[disp_freq max_epoch err_goal lr lr_inc lr_dec momentum err_ratio]';

[w1,b1,w2,b2,epochs,TR]=trainbpx(w1,b1,'logsig',w2,b2,'logsig',p,t,tp);

save digit.mat w1 b1 w2 b2;    %--------儲存權值,以方便測試

 

 

%【步驟三、測試】

%---------------測試,輸入的測試樣本為p

load digit_noise.mat

layer1=logsig(w1*p,b1);

a=logsig(w2*layer1,b2);

%-----------------根據a中的最大值可以判斷屬於何種故障模式