基于Matlab实现BP神经网络交通标志识别

目录
  • 一、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交通标志识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于MATLAB神经网络图像识别的高识别率代码

    MATLAB神经网络图像识别高识别率代码 I0=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\0 (1).png')); I1=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\1 (1).png')); I2=pretreatment(imread('Z:\data\PictureData\TestCode\SplitDataTest\

  • 利用Matlab仿真实现图像烟雾识别(k-means聚类图像分割+LBP+PCA+SVM)

    目录 一.算法简介 1.1 c-means聚类算法 1 .2 LBP算法 1.3 PCA算法 1.4 SVM算法 二.算法实现 2.1 烟雾识别算法流程 2.2 c-means算法实现 2.3 LBP算法实现 2.4 SVM算法实现 三.结果分析 一.算法简介 1.1 c-means聚类算法 聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象进行分组.目的是使组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的).组内相似性越大,组间差距越大,说明聚类效果越好.

  • Python3+OpenCV实现简单交通标志识别流程分析

    由于该项目是针对中小学生竞赛并且是第一次举行,所以识别的目标交通标志仅仅只有直行.右转.左转和停车让行. 数据集: 链接: https://pan.baidu.com/s/1SL0qE-qd4cuatmfZeNuK0Q 提取码: vuvi  源代码:https://github.com/ccxiao5/Traffic_sign_recognition 整体流程如下: 数据集收集(包括训练集和测试集的分类) 图像预处理 图像标注 根据标注分割得到目标图像 HOG特征提取 训练得到模型 将模型带入识

  • 基于Matlab实现BP神经网络交通标志识别

    目录 一.BP神经网络交通标志识别简介 二.部分源代码 三.运行结果 一.BP神经网络交通标志识别简介 道路交通标志用以禁止.警告.指示和限制道路使用者有秩序地使用道路, 保障出行安全.若能自动识别道路交通标志, 则将极大减少道路交通事故的发生.但是由于道路交通错综复杂, 且智能识别技术尚未成熟, 为了得到高效实用的道路标志识别系统, 仍需进行大量的研究.限速交通标志的检测识别作为道路交通标志识别系统的一个重要组成部分, 对它的研究具有非常重要的意义. 目前国内已有不少学者针对道路交通标志牌的智

  • 基于python的BP神经网络及异或实现过程解析

    BP神经网络是最简单的神经网络模型了,三层能够模拟非线性函数效果. 难点: 如何确定初始化参数? 如何确定隐含层节点数量? 迭代多少次?如何更快收敛? 如何获得全局最优解? ''' neural networks created on 2019.9.24 author: vince ''' import math import logging import numpy import random import matplotlib.pyplot as plt ''' neural network

  • Python机器学习应用之基于BP神经网络的预测篇详解

    目录 一.Introduction 1 BP神经网络的优点 2 BP神经网络的缺点 二.实现过程 1 Demo 2 基于BP神经网络的乳腺癌分类预测 三.Keys 一.Introduction 1 BP神经网络的优点 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数.这使得其特别适合于求解内部机制复杂的问题,即BP神经网络具有较强的非线性映射能力. 自学习和自适应能力:BP神经网络在训练时,能够通过学习自动提取输

  • 基于Matlab LBP实现植物叶片识别功能

    目录 一.LBP简介 1.1 课题的提出与研究意义 1.2 国内外相关研究情况 1.3 论文的主要研究工作 1.4 论文结构 二.部分源代码 三.运行结果 一.LBP简介 第一章 引言 植物在我们的身边随处可见,它们从产生发展进化到现在,其间经历了漫长的岁月.地球上的植物种类繁多.数量浩瀚,它们是生物圈的重要组成部分,在维持整个生物界的平衡方面发挥着巨大的作用:它们同时也是构成人类生存环境的重要组成部分,是人类社会延续和发展不可或缺的重要因素.由于植物对于地球和人类都具有如此重要的意义,对它们的

  • Java实现BP神经网络MNIST手写数字识别的示例详解

    目录 一.神经网络的构建 二.系统架构 服务器 客户端 采用MVC架构 一.神经网络的构建 (1):构建神经网络层次结构 由训练集数据可知,手写输入的数据维数为784维,而对应的输出结果为分别为0-9的10个数字,所以根据训练集的数据可知,在构建的神经网络的输入层的神经元的节点个数为784个,而对应的输出层的神经元个数为10个.隐层可选择单层或多层. (2):确定隐层中的神经元的个数 因为对于隐层的神经元个数的确定目前还没有什么比较完美的解决方案,所以对此经过自己查阅书籍和上网查阅资料,有以下的

  • Python实现的三层BP神经网络算法示例

    本文实例讲述了Python实现的三层BP神经网络算法.分享给大家供大家参考,具体如下: 这是一个非常漂亮的三层反向传播神经网络的python实现,下一步我准备试着将其修改为多层BP神经网络. 下面是运行演示函数的截图,你会发现预测的结果很惊人! 提示:运行演示函数的时候,可以尝试改变隐藏层的节点数,看节点数增加了,预测的精度会否提升 import math import random import string random.seed(0) # 生成区间[a, b)内的随机数 def rand(

  • Python使用numpy实现BP神经网络

    本文完全利用numpy实现一个简单的BP神经网络,由于是做regression而不是classification,因此在这里输出层选取的激励函数就是f(x)=x.BP神经网络的具体原理此处不再介绍. import numpy as np class NeuralNetwork(object): def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate): # Set number of nodes in i

  • python实现BP神经网络回归预测模型

    神经网络模型一般用来做分类,回归预测模型不常见,本文基于一个用来分类的BP神经网络,对它进行修改,实现了一个回归模型,用来做室内定位.模型主要变化是去掉了第三层的非线性转换,或者说把非线性激活函数Sigmoid换成f(x)=x函数.这样做的主要原因是Sigmoid函数的输出范围太小,在0-1之间,而回归模型的输出范围较大.模型修改如下: 代码如下: #coding: utf8 '''' author: Huangyuliang ''' import json import random impo

随机推荐