利用給定的車牌影象庫中(在指定的資料夾之中),任意選擇其中的多副車牌影象,對其中包含的數位(0~9)或英文字元(A~F)進行手工提取,由於提取以後的影象大小可能不一致,為了便於特徵提取,可以對各個圖形進行歸一化處理(例如:歸一化為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個,則輸出向量可以簡單表示為: targets=eye(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中的最大值可以判斷屬於何種故障模式