基於Matlab實現BP神經網絡交通標志識別

一、BP神經網絡交通標志識別簡介

道路交通標志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自動識別道路交通標志, 則將極大減少道路交通事故的發生.但是由於道路交通錯綜復雜, 且智能識別技術尚未成熟, 為瞭得到高效實用的道路標志識別系統, 仍需進行大量的研究.限速交通標志的檢測識別作為道路交通標志識別系統的一個重要組成部分, 對它的研究具有非常重要的意義。

目前國內已有不少學者針對道路交通標志牌的智能識別進行瞭研究, 針對復雜環境背景下交通標志牌難以定位識別的問題, 提出一種基於交通標志牌特定顏色以及多尺度Retinex的圖像增強和仿射變換的道路交通標志牌定位算法以及基於支持向量機的標志牌識別算法, 經試驗驗證, 該檢測識別方法可將目標識別率達到90%以上, 但是其基於個人計算機 (Personal Computer, PC) 實現的檢測算法, 不適用於影像序列的交通標志牌檢測.文獻[7]提出一種Adaboost算法與支持向量機 (Support Vector Machine, SVM) 算法融合用於自然場景下的交通標志識別的算法.該算法首先通過Adaboost篩選出最可能的候選子圖像集合, 接著利用SVM對候選集合進行最終識別, 從而將識別正確率提升至96%以上.以上這些算法雖然在一定程度上取得瞭一定的識別效果, 但是目前常用方法均存在誤識別率較高, 檢測時間過長等缺陷.筆者提出算法的創新之處在於, 橢圓檢測定位過程中采用幀間加速法、連續自適應均值漂移算法 (Continuously adaptive mean-Shift, CamShift) 和光流法縮短定位時間, 再對定位結果進行反向傳播 (Back Propagation, BP) 神經網絡識別, 從而提高檢測效率, 能夠實現實時視頻處理。

1 限速交通標志的檢測與識別

文中提出的算法主要包括兩部分:限速交通標志的檢測與識別.首先利用交通標志牌的顏色以及形狀特征將交通標志牌從復雜環境背景下檢測出來;接著利用BP神經網絡對正負樣本進行訓練, 形成訓練集, 從而實現對檢測出的交通標志牌的識別;最後再通過幀間加速法、CamShift法和光流法比較智能檢測識別的耗時情況.

1.1 限速交通標志的檢測

交通標志的自動識別首先需要對標志牌進行準確定位.為瞭解決復雜環境背景下的限速標志牌定位問題, 通過查閱《道路交通標志和標線》中對限速標志牌制作的規定, 按照規定限速標志牌外圍均呈紅色, 利用這一特征首先對原始影像進行顏色分割, 將紅色區域分割出來, 排除一些不必要的噪聲, 接著對影像進行濾波;然後進行邊緣提取, 橢圓擬合;最終將圓形標志檢測出來.

1.1.1 顏色分割

數碼相機拍攝的彩色影像一般分為紅綠藍 (Red Green Blue, RGB) 3個通道, 有時為瞭突出某些顏色的特征, 需要將其轉換到色度-飽和度-純度色彩模型 (Hue-Saturation-Value, HSV) 空間, 文中為瞭對比RGB和HSV空間中紅色信息的區別, 分別在RGB和HSV空間進行顏色分割, 其原理分別是:

(1) RGB空間顏色分割.對RGB影像逐像素進行判斷, 若G-B R<0.1, R≥160, G-B<30, G<120, B<120這5個條件同時滿足, 則將該區域賦為白色;否則, 將其變為黑色.這樣白色區域即為感興趣區域, 分割完畢.得到的顏色分割效果圖如圖1 © 所示.

(2) HSV空間顏色分割.首先將原始影像 (圖1 (a) ) 從RGB轉到HSV空間, 然後逐像素進行判斷, 若V≥0.15且S≥0.1且H≤7或H≥170, 則將該區域賦為白色;否則, 將其變為黑色.這樣白色區域即為感興趣區域, 分割完畢.得到的顏色分割效果如圖1 (b) 所示.

圖1 顏色分割實驗

通過對比實驗可見, 基於RGB空間的顏色分割在影像光照條件不足的情況下難以將標志牌分割出來, 而HSV空間對光線要求較低, 可以較好地識別紅色區域, 所以文中采用HSV空間的顏色分割優於其他文獻提出的RGB顏色分割效果。

1.1.2 影像平滑與邊緣提取

由於道路交通背景較為復雜, 顏色分割之後仍有部分噪聲, 為瞭過濾該噪聲, 文中采用3次高斯平滑的方法除去噪聲, 為下一步邊緣提取提供便利, 實驗結果如圖2所示.由實驗結果可以看出, 經過高斯濾波後, 圖像既保持瞭基本輪廓, 同時對噪聲也起到一定的抑制作用。

圖2 影像平滑與邊緣提取

邊緣是圖像灰度變化率最大的地方, 一般含有十分重要的特征信息, 常被用於物體檢測方面.圖像邊緣不但保留瞭原始圖像中非常重要的信息, 而且極大降低瞭數據量, 完全符合特征提取的要求, 因此文中采用canny邊緣提取進行圖像邊緣提取.

1.1.3 橢圓擬合

橢圓擬合法即從一組樣本點尋找一最接近樣本點的橢圓, 也就是說, 將圖像中的一組數據以橢圓方程為模型進行擬合, 使某一橢圓方程盡量滿足這些數據, 最終確定最佳擬合橢圓.

最小二乘法作為數據擬合中的基本方法, 最早被應用於橢圓擬合, 其基本思路就是使方程整體誤差最小化, 即根據給定數據集不斷假設橢圓方程, 計算每個待定點到該橢圓的距離之和, 最終求出距離之和最小的橢圓方程即為最佳擬合橢圓.

文中利用最小二乘法對橢圓進行擬合, 由於道路背景較為復雜, 初步擬合的橢圓含有較多幹擾信息 (如圖3 (a) 所示) , 因此, 對擬合出的橢圓扁率進行限制, 若扁率e介於0.8~1.2之間, 即0.8≤e≤1.2時, 則認為是圓形交通標志牌區域;否則, 為幹擾信息.其最終檢測結果如圖3 (b) 所示.

圖4 同心圓去除

1.1.4 同心圓去除

由於在提取邊緣操作之後會出現內外兩個紅色圓形標志圈, 所以進行橢圓擬合後易出現同心圓現象, 如圖4 (a) 所示.針對這一問題, 文中采用一種排列組合距離比較法進行同心圓去除, 即對所有檢測出的橢圓中心距離進行兩兩比較, 若兩中心之間的歐式距離小於最小設置距離, 那麼隻保留最大圓, 去除最小圓;反之, 則認為這兩個圓非同心圓, 全部進行保留.圖4 (b) 為去除同心圓之後的檢測結果.

1.2 基於BP神經網絡的限速標志識別

在上節中, 從復雜環境背景下將道路交通標志牌檢測瞭出來, 接下來需要對檢測出的交通標志牌進行自動識別, 因此需要用到圖像識別技術.近年來, 人工神經網絡因其強大的學習能力和並行計算能力, 常被應用於圖像識別等領域.雖然該方法屬於機器學習范疇, 無法完全跟人腦進行媲美, 但其擁有自適應學習能力, 能夠通過一系列指定的學習特征對樣本進行學習, 即通過對人腦神經元進行抽象, 形成某種簡單的模型, 接著依照不同的連接方式形成不同的網絡, 從而實現適應性處理信息的能力.目前人工神經網絡因其強大的模糊學習能力已被應用於醫療、交通、工業、運輸、航空和航天等各個領域.文中項目需要對交通標志進行實時檢測識別, 因此, 可通過BP神經網絡對標志牌進行識別.

1.2.1 BP神經網絡的算法描述

BP神經網絡包括訓練過程和學習過程.

(1) 訓練過程.首先輸入層接收來自外界的信號, 然後傳遞給中間層的各神經元;中間層通過改變不同的隱層結構將這些信息進行變換;最後信息被傳遞到輸出層, 這就是一次學習的正向傳播處理過程.

當實際輸出與期望輸出存在差異時, 將會進入誤差反向傳播過程.誤差反傳即通過隱含層反傳輸出誤差到輸入層, 在反傳過程中將誤差分配到每一層, 從而在各層獲得調整各單元權值的依據.通過正向反向傳播, 直到達到訓練終止條件為止.

(2) 學習過程.人工神經網絡的學習過程首先需要對網絡進行初始化, 即分配連接權, 設定誤差函數, 學習的最大次數等;接著輸入訓練樣本, 計算各隱藏層的輸入和輸出, 調整連接權值;最後計算全局誤差, 判斷其是否滿足終止條件, 從而完成學習過程[10].

1.2.2 輸入向量的計算

輸入向量用來代表圖案的特征向量, 不同的標志具有不同的特征向量, 利用特征向量的差異來區分不同的標志圖案, 從而達到識別分類的目的.

文中樣本圖像均統一至30×30像素, 並設定63個輸入節點, 以圖案的紅綠藍 (RGB) 3個通道灰度值為基礎進行特征向量的計算, 充分利用圖像顏色信息, 從而較大增加瞭識別率.

前3個節點的計算方法為:計算紅綠藍3個通道的平均值, 並將其歸一化到0~1范圍內, 計算公式如下:

然後, 計算30個垂直方向vi和水平方向hi上的投影值:

其中, Y為灰度矩陣, T為閾值.Yi, j和T的表達式為

這63個節點依序作為輸入向量的值, 進行網絡訓練。

1.2.3 期望輸出的確定

期望輸出用來判定網絡的訓練誤差和決定輸出值, 該輸出可以是一個值或者一個向量, 文中以6種不同限速標志為訓練樣本.由於期望輸出得到的值在0~1區間內, 為瞭更好地區分不同類別限速標志, 這裡將期望輸出設定為一個六維向量.向量構造方法為:第N個訓練樣本的期望輸出向量的第N維的值為1, 其他維的值都為0.即6種訓練標志的期望輸出向量按行排列在一起會形成一個6×6的單位矩陣。

二、部分源代碼

function varargout = Traffic_Iden(varargin)
% TRAFFIC_IDEN MATLAB code for Traffic_Iden.fig
%      TRAFFIC_IDEN, by itself, creates a new TRAFFIC_IDEN or raises the existing
%      singleton*.
%
%      H = TRAFFIC_IDEN returns the handle to a new TRAFFIC_IDEN or the handle to
%      the existing singleton*.
%
%      TRAFFIC_IDEN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in TRAFFIC_IDEN.M with the given input arguments.
%
%      TRAFFIC_IDEN('Property','Value',...) creates a new TRAFFIC_IDEN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Traffic_Iden_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Traffic_Iden_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help Traffic_Iden

% Last Modified by GUIDE v2.5 01-Jan-2022 11:02:35

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Traffic_Iden_OpeningFcn, ...
                   'gui_OutputFcn',  @Traffic_Iden_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before Traffic_Iden is made visible.
function Traffic_Iden_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to Traffic_Iden (see VARARGIN)

% Choose default command line output for Traffic_Iden
handles.output = hObject;
handles.cd0 = cd;
handles.Color = 0;
handles.I = [];

axes(handles.axes1);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;

axes(handles.axes2);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;

axes(handles.axes3);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;

axes(handles.axes4);
set(gca,'Xtick',[]);
set(gca,'Ytick',[]);
box on;
% Update handles structure
guidata(hObject, handles);

% UIWAIT makes Traffic_Iden wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = Traffic_Iden_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton3


% --- Executes on button press in radiobutton4.
function radiobutton4_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton4


% --- Executes on button press in radiobutton5.
function radiobutton5_Callback(hObject, eventdata, handles)
% hObject    handle to radiobutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hint: get(hObject,'Value') returns toggle state of radiobutton5


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%%  讀圖
[filename, cd1] = uigetfile( ...
    {'*.tif;*.TIF;*.JPG;*.jpg;*.bmp;*.BMP;*.jpeg;*.JPEG;','Image file';...
    '*.*', 'All file (*.*)'},'Pick an Image');
axes(handles.axes1);
cla;
axes(handles.axes2);
cla;
axes(handles.axes3);
cla;
axes(handles.axes4);
cla;
if filename

    cd(cd1);
    d = imread(filename);
    cd(handles.cd0);
    handles.I = d;
    axes(handles.axes1);
    imshow(d);
    handles.filename = filename; 

    box on;
    
end

handles.Color = 0;
cd(handles.cd0);
set(handles.text2,'string','');
guidata(hObject, handles);


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%% 提取標志
% 按照顏色來分
Color = 0; % 顏色標記  1是紅 2 是藍 3是黃色

if get(handles.radiobutton3,'Value')
    
    Color = 1;
    
elseif get(handles.radiobutton4,'Value')
    
    Color = 2;
    
elseif get(handles.radiobutton5,'Value')
    
    Color = 3;

end

handles.Color = Color;

Image = handles.I;

switch Color
    
    case 1
        
        DI = Image(:,:,1);
        GI = (Image(:,:,1)>110 & Image(:,:,2)<150 & Image(:,:,3)<150 ...
            & abs(double(Image(:,:,2))-double(Image(:,:,3)))<50 & abs(double(Image(:,:,1))-double(Image(:,:,2)))>30);
        
    case 2
        
        DI = Image(:,:,3);
        GI = (Image(:,:,1)<100 & Image(:,:,2)<150 & Image(:,:,3)>120 ...
             & abs(double(Image(:,:,2))-double(Image(:,:,3)))>30);
        
    case 3
        
        DI = rgb2gray(Image);
        GI = (Image(:,:,1)>160 & Image(:,:,2)>90 & Image(:,:,3)<90 ...
            & abs(double(Image(:,:,1))-double(Image(:,:,2)))<100 & abs(double(Image(:,:,1))-double(Image(:,:,3)))>90);
        
end

三、運行結果

到此這篇關於基於Matlab實現BP神經網絡交通標志識別的文章就介紹到這瞭,更多相關Matlab交通標志識別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: