基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識別
一、BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識別簡介
道路交通標(biāo)志用以禁止、警告、指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自動識別道路交通標(biāo)志, 則將極大減少道路交通事故的發(fā)生.但是由于道路交通錯綜復(fù)雜, 且智能識別技術(shù)尚未成熟, 為了得到高效實(shí)用的道路標(biāo)志識別系統(tǒng), 仍需進(jìn)行大量的研究.限速交通標(biāo)志的檢測識別作為道路交通標(biāo)志識別系統(tǒng)的一個重要組成部分, 對它的研究具有非常重要的意義。
目前國內(nèi)已有不少學(xué)者針對道路交通標(biāo)志牌的智能識別進(jìn)行了研究, 針對復(fù)雜環(huán)境背景下交通標(biāo)志牌難以定位識別的問題, 提出一種基于交通標(biāo)志牌特定顏色以及多尺度Retinex的圖像增強(qiáng)和仿射變換的道路交通標(biāo)志牌定位算法以及基于支持向量機(jī)的標(biāo)志牌識別算法, 經(jīng)試驗(yàn)驗(yàn)證, 該檢測識別方法可將目標(biāo)識別率達(dá)到90%以上, 但是其基于個人計(jì)算機(jī) (Personal Computer, PC) 實(shí)現(xiàn)的檢測算法, 不適用于影像序列的交通標(biāo)志牌檢測.文獻(xiàn)[7]提出一種Adaboost算法與支持向量機(jī) (Support Vector Machine, SVM) 算法融合用于自然場景下的交通標(biāo)志識別的算法.該算法首先通過Adaboost篩選出最可能的候選子圖像集合, 接著利用SVM對候選集合進(jìn)行最終識別, 從而將識別正確率提升至96%以上.以上這些算法雖然在一定程度上取得了一定的識別效果, 但是目前常用方法均存在誤識別率較高, 檢測時(shí)間過長等缺陷.筆者提出算法的創(chuàng)新之處在于, 橢圓檢測定位過程中采用幀間加速法、連續(xù)自適應(yīng)均值漂移算法 (Continuously adaptive mean-Shift, CamShift) 和光流法縮短定位時(shí)間, 再對定位結(jié)果進(jìn)行反向傳播 (Back Propagation, BP) 神經(jīng)網(wǎng)絡(luò)識別, 從而提高檢測效率, 能夠?qū)崿F(xiàn)實(shí)時(shí)視頻處理。
1 限速交通標(biāo)志的檢測與識別
文中提出的算法主要包括兩部分:限速交通標(biāo)志的檢測與識別.首先利用交通標(biāo)志牌的顏色以及形狀特征將交通標(biāo)志牌從復(fù)雜環(huán)境背景下檢測出來;接著利用BP神經(jīng)網(wǎng)絡(luò)對正負(fù)樣本進(jìn)行訓(xùn)練, 形成訓(xùn)練集, 從而實(shí)現(xiàn)對檢測出的交通標(biāo)志牌的識別;最后再通過幀間加速法、CamShift法和光流法比較智能檢測識別的耗時(shí)情況.
1.1 限速交通標(biāo)志的檢測
交通標(biāo)志的自動識別首先需要對標(biāo)志牌進(jìn)行準(zhǔn)確定位.為了解決復(fù)雜環(huán)境背景下的限速標(biāo)志牌定位問題, 通過查閱《道路交通標(biāo)志和標(biāo)線》中對限速標(biāo)志牌制作的規(guī)定, 按照規(guī)定限速標(biāo)志牌外圍均呈紅色, 利用這一特征首先對原始影像進(jìn)行顏色分割, 將紅色區(qū)域分割出來, 排除一些不必要的噪聲, 接著對影像進(jìn)行濾波;然后進(jìn)行邊緣提取, 橢圓擬合;最終將圓形標(biāo)志檢測出來.
1.1.1 顏色分割
數(shù)碼相機(jī)拍攝的彩色影像一般分為紅綠藍(lán) (Red Green Blue, RGB) 3個通道, 有時(shí)為了突出某些顏色的特征, 需要將其轉(zhuǎn)換到色度-飽和度-純度色彩模型 (Hue-Saturation-Value, HSV) 空間, 文中為了對比RGB和HSV空間中紅色信息的區(qū)別, 分別在RGB和HSV空間進(jìn)行顏色分割, 其原理分別是:
(1) RGB空間顏色分割.對RGB影像逐像素進(jìn)行判斷, 若G-B R<0.1, R≥160, G-B<30, G<120, B<120這5個條件同時(shí)滿足, 則將該區(qū)域賦為白色;否則, 將其變?yōu)楹谏?這樣白色區(qū)域即為感興趣區(qū)域, 分割完畢.得到的顏色分割效果圖如圖1 © 所示.
(2) HSV空間顏色分割.首先將原始影像 (圖1 (a) ) 從RGB轉(zhuǎn)到HSV空間, 然后逐像素進(jìn)行判斷, 若V≥0.15且S≥0.1且H≤7或H≥170, 則將該區(qū)域賦為白色;否則, 將其變?yōu)楹谏?這樣白色區(qū)域即為感興趣區(qū)域, 分割完畢.得到的顏色分割效果如圖1 (b) 所示.
圖1 顏色分割實(shí)驗(yàn)
通過對比實(shí)驗(yàn)可見, 基于RGB空間的顏色分割在影像光照條件不足的情況下難以將標(biāo)志牌分割出來, 而HSV空間對光線要求較低, 可以較好地識別紅色區(qū)域, 所以文中采用HSV空間的顏色分割優(yōu)于其他文獻(xiàn)提出的RGB顏色分割效果。
1.1.2 影像平滑與邊緣提取
由于道路交通背景較為復(fù)雜, 顏色分割之后仍有部分噪聲, 為了過濾該噪聲, 文中采用3次高斯平滑的方法除去噪聲, 為下一步邊緣提取提供便利, 實(shí)驗(yàn)結(jié)果如圖2所示.由實(shí)驗(yàn)結(jié)果可以看出, 經(jīng)過高斯濾波后, 圖像既保持了基本輪廓, 同時(shí)對噪聲也起到一定的抑制作用。
圖2 影像平滑與邊緣提取
邊緣是圖像灰度變化率最大的地方, 一般含有十分重要的特征信息, 常被用于物體檢測方面.圖像邊緣不但保留了原始圖像中非常重要的信息, 而且極大降低了數(shù)據(jù)量, 完全符合特征提取的要求, 因此文中采用canny邊緣提取進(jìn)行圖像邊緣提取.
1.1.3 橢圓擬合
橢圓擬合法即從一組樣本點(diǎn)尋找一最接近樣本點(diǎn)的橢圓, 也就是說, 將圖像中的一組數(shù)據(jù)以橢圓方程為模型進(jìn)行擬合, 使某一橢圓方程盡量滿足這些數(shù)據(jù), 最終確定最佳擬合橢圓.
最小二乘法作為數(shù)據(jù)擬合中的基本方法, 最早被應(yīng)用于橢圓擬合, 其基本思路就是使方程整體誤差最小化, 即根據(jù)給定數(shù)據(jù)集不斷假設(shè)橢圓方程, 計(jì)算每個待定點(diǎn)到該橢圓的距離之和, 最終求出距離之和最小的橢圓方程即為最佳擬合橢圓.
文中利用最小二乘法對橢圓進(jìn)行擬合, 由于道路背景較為復(fù)雜, 初步擬合的橢圓含有較多干擾信息 (如圖3 (a) 所示) , 因此, 對擬合出的橢圓扁率進(jìn)行限制, 若扁率e介于0.8~1.2之間, 即0.8≤e≤1.2時(shí), 則認(rèn)為是圓形交通標(biāo)志牌區(qū)域;否則, 為干擾信息.其最終檢測結(jié)果如圖3 (b) 所示.
圖4 同心圓去除
1.1.4 同心圓去除
由于在提取邊緣操作之后會出現(xiàn)內(nèi)外兩個紅色圓形標(biāo)志圈, 所以進(jìn)行橢圓擬合后易出現(xiàn)同心圓現(xiàn)象, 如圖4 (a) 所示.針對這一問題, 文中采用一種排列組合距離比較法進(jìn)行同心圓去除, 即對所有檢測出的橢圓中心距離進(jìn)行兩兩比較, 若兩中心之間的歐式距離小于最小設(shè)置距離, 那么只保留最大圓, 去除最小圓;反之, 則認(rèn)為這兩個圓非同心圓, 全部進(jìn)行保留.圖4 (b) 為去除同心圓之后的檢測結(jié)果.
1.2 基于BP神經(jīng)網(wǎng)絡(luò)的限速標(biāo)志識別
在上節(jié)中, 從復(fù)雜環(huán)境背景下將道路交通標(biāo)志牌檢測了出來, 接下來需要對檢測出的交通標(biāo)志牌進(jìn)行自動識別, 因此需要用到圖像識別技術(shù).近年來, 人工神經(jīng)網(wǎng)絡(luò)因其強(qiáng)大的學(xué)習(xí)能力和并行計(jì)算能力, 常被應(yīng)用于圖像識別等領(lǐng)域.雖然該方法屬于機(jī)器學(xué)習(xí)范疇, 無法完全跟人腦進(jìn)行媲美, 但其擁有自適應(yīng)學(xué)習(xí)能力, 能夠通過一系列指定的學(xué)習(xí)特征對樣本進(jìn)行學(xué)習(xí), 即通過對人腦神經(jīng)元進(jìn)行抽象, 形成某種簡單的模型, 接著依照不同的連接方式形成不同的網(wǎng)絡(luò), 從而實(shí)現(xiàn)適應(yīng)性處理信息的能力.目前人工神經(jīng)網(wǎng)絡(luò)因其強(qiáng)大的模糊學(xué)習(xí)能力已被應(yīng)用于醫(yī)療、交通、工業(yè)、運(yùn)輸、航空和航天等各個領(lǐng)域.文中項(xiàng)目需要對交通標(biāo)志進(jìn)行實(shí)時(shí)檢測識別, 因此, 可通過BP神經(jīng)網(wǎng)絡(luò)對標(biāo)志牌進(jìn)行識別.
1.2.1 BP神經(jīng)網(wǎng)絡(luò)的算法描述
BP神經(jīng)網(wǎng)絡(luò)包括訓(xùn)練過程和學(xué)習(xí)過程.
(1) 訓(xùn)練過程.首先輸入層接收來自外界的信號, 然后傳遞給中間層的各神經(jīng)元;中間層通過改變不同的隱層結(jié)構(gòu)將這些信息進(jìn)行變換;最后信息被傳遞到輸出層, 這就是一次學(xué)習(xí)的正向傳播處理過程.
當(dāng)實(shí)際輸出與期望輸出存在差異時(shí), 將會進(jìn)入誤差反向傳播過程.誤差反傳即通過隱含層反傳輸出誤差到輸入層, 在反傳過程中將誤差分配到每一層, 從而在各層獲得調(diào)整各單元權(quán)值的依據(jù).通過正向反向傳播, 直到達(dá)到訓(xùn)練終止條件為止.
(2) 學(xué)習(xí)過程.人工神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程首先需要對網(wǎng)絡(luò)進(jìn)行初始化, 即分配連接權(quán), 設(shè)定誤差函數(shù), 學(xué)習(xí)的最大次數(shù)等;接著輸入訓(xùn)練樣本, 計(jì)算各隱藏層的輸入和輸出, 調(diào)整連接權(quán)值;最后計(jì)算全局誤差, 判斷其是否滿足終止條件, 從而完成學(xué)習(xí)過程[10].
1.2.2 輸入向量的計(jì)算
輸入向量用來代表圖案的特征向量, 不同的標(biāo)志具有不同的特征向量, 利用特征向量的差異來區(qū)分不同的標(biāo)志圖案, 從而達(dá)到識別分類的目的.
文中樣本圖像均統(tǒng)一至30×30像素, 并設(shè)定63個輸入節(jié)點(diǎn), 以圖案的紅綠藍(lán) (RGB) 3個通道灰度值為基礎(chǔ)進(jìn)行特征向量的計(jì)算, 充分利用圖像顏色信息, 從而較大增加了識別率.
前3個節(jié)點(diǎn)的計(jì)算方法為:計(jì)算紅綠藍(lán)3個通道的平均值, 并將其歸一化到0~1范圍內(nèi), 計(jì)算公式如下:
然后, 計(jì)算30個垂直方向vi和水平方向hi上的投影值:
其中, Y為灰度矩陣, T為閾值.Yi, j和T的表達(dá)式為
這63個節(jié)點(diǎn)依序作為輸入向量的值, 進(jìn)行網(wǎng)絡(luò)訓(xùn)練。
1.2.3 期望輸出的確定
期望輸出用來判定網(wǎng)絡(luò)的訓(xùn)練誤差和決定輸出值, 該輸出可以是一個值或者一個向量, 文中以6種不同限速標(biāo)志為訓(xùn)練樣本.由于期望輸出得到的值在0~1區(qū)間內(nèi), 為了更好地區(qū)分不同類別限速標(biāo)志, 這里將期望輸出設(shè)定為一個六維向量.向量構(gòu)造方法為:第N個訓(xùn)練樣本的期望輸出向量的第N維的值為1, 其他維的值都為0.即6種訓(xùn)練標(biāo)志的期望輸出向量按行排列在一起會形成一個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) %% 提取標(biāo)志 % 按照顏色來分 Color = 0; % 顏色標(biāo)記 1是紅 2 是藍(lán) 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
三、運(yùn)行結(jié)果
到此這篇關(guān)于基于Matlab實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)交通標(biāo)志識別的文章就介紹到這了,更多相關(guān)Matlab交通標(biāo)志識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考
今天小編就為大家分享一篇關(guān)于C++實(shí)踐分?jǐn)?shù)類中運(yùn)算符重載的方法參考,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02詳解C++異常處理(try catch throw)完全攻略
這篇文章主要介紹了詳解C++異常處理(try catch throw)完全攻略,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C語言標(biāo)準(zhǔn)庫<math.h>和<setjmp.h>的實(shí)現(xiàn)
本文主要介紹了C語言標(biāo)準(zhǔn)庫<math.h>和<setjmp.h>的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11C語言高效實(shí)現(xiàn)向量循環(huán)移位
這篇文章主要為大家詳細(xì)介紹了C語言高效實(shí)現(xiàn)向量循環(huán)移位,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03C語言運(yùn)用回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用回調(diào)函數(shù)實(shí)現(xiàn)計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10c++語言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理詳解
這篇文章主要給大家介紹了關(guān)于c++語言中虛函數(shù)實(shí)現(xiàn)多態(tài)的原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05