基于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) 所示.

基于Matlab实现BP神经网络交通标志识别_第1张图片

图1 颜色分割实验

通过对比实验可见, 基于RGB空间的颜色分割在影像光照条件不足的情况下难以将标志牌分割出来, 而HSV空间对光线要求较低, 可以较好地识别红色区域, 所以文中采用HSV空间的颜色分割优于其他文献提出的RGB颜色分割效果。

1.1.2 影像平滑与边缘提取

由于道路交通背景较为复杂, 颜色分割之后仍有部分噪声, 为了过滤该噪声, 文中采用3次高斯平滑的方法除去噪声, 为下一步边缘提取提供便利, 实验结果如图2所示.由实验结果可以看出, 经过高斯滤波后, 图像既保持了基本轮廓, 同时对噪声也起到一定的抑制作用。

基于Matlab实现BP神经网络交通标志识别_第2张图片

图2 影像平滑与边缘提取

边缘是图像灰度变化率最大的地方, 一般含有十分重要的特征信息, 常被用于物体检测方面.图像边缘不但保留了原始图像中非常重要的信息, 而且极大降低了数据量, 完全符合特征提取的要求, 因此文中采用canny边缘提取进行图像边缘提取.

1.1.3 椭圆拟合

椭圆拟合法即从一组样本点寻找一最接近样本点的椭圆, 也就是说, 将图像中的一组数据以椭圆方程为模型进行拟合, 使某一椭圆方程尽量满足这些数据, 最终确定最佳拟合椭圆.

最小二乘法作为数据拟合中的基本方法, 最早被应用于椭圆拟合, 其基本思路就是使方程整体误差最小化, 即根据给定数据集不断假设椭圆方程, 计算每个待定点到该椭圆的距离之和, 最终求出距离之和最小的椭圆方程即为最佳拟合椭圆.

文中利用最小二乘法对椭圆进行拟合, 由于道路背景较为复杂, 初步拟合的椭圆含有较多干扰信息 (如图3 (a) 所示) , 因此, 对拟合出的椭圆扁率进行限制, 若扁率e介于0.8~1.2之间, 即0.8≤e≤1.2时, 则认为是圆形交通标志牌区域;否则, 为干扰信息.其最终检测结果如图3 (b) 所示.

基于Matlab实现BP神经网络交通标志识别_第3张图片

基于Matlab实现BP神经网络交通标志识别_第4张图片

图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范围内, 计算公式如下:

基于Matlab实现BP神经网络交通标志识别_第5张图片

然后, 计算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神经网络交通标志识别_第6张图片

基于Matlab实现BP神经网络交通标志识别_第7张图片

到此这篇关于基于Matlab实现BP神经网络交通标志识别的文章就介绍到这了,更多相关Matlab交通标志识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(基于Matlab实现BP神经网络交通标志识别)