1 简介
近年来,交通标志识别在车辆视觉导航系统中是一个热门研究课题。为了安全驾驶和高效运输,交通部门在公路道路上设置了各类重要的交通标志,以提醒司机和行人有关道路交通信息,如指示标志、警告标志、禁止标志等。交通标志具有特殊的形状、色彩、符号和尺寸,以区别于环境。交通标志识别需要处理的信息量大,而且由于存在大量干扰因素,如光照条件不同,道路情况复杂等,待识别的图像往往存在噪声干扰,因此要求交通标志识别方法要有足够的快速性、稳定性。神经网络具有强大的学习分类以及大规模并行计算能力,被广泛地应用于图像处理、模式识别等领域。人工神经网络由许多具有非线性映像能力的神经元组成,神经元之间通过权系数相连接,其信息分布式存储于连接权系数中,使网络具有很强的容错性和鲁棒性,有效地解决了模式识别中的噪声干扰和输入模式部分损失问题[2]。应用神经网络可以有效地解决这个问题。BP神经网络是神经网络的一种,在模式识别中应用相当广泛。本文提出了一种基于BP神经网络的交通标志识别算法。本文对传统识别交通标志的方法进行了改进,用内核符号作为特征区域,使各标志的特征差异最大化,通过分类器训练减小识别误差来进行交通标志检测。实验结果表明该算法准确,可行。
2 部分代码
clear;clc;close all;
%%
Name = {'禁止机动车通行','禁止停车','禁止左转弯'...
'T型路口','窄桥,限制6吨','注意行人'...
'人行横道','向右转弯','右侧行驶'}; % 这个编号号 第一个就对应 1.png 第二个就是2.png
Num = 9; % 标识图片个数
Image = cell(1,Num); % 用来存放图像
Scale = 40; % 统一处理图片大小
Data = zeros(Scale*Scale,Num);
figure
for i = 1:Num
Image{i} = imread(strcat(num2str(i),'.png'));
if size(Image{i},3) ~= 1
Image{i} = rgb2gray(Image{i});
end
Image{i} = imadjust(Image{i}); % 调整对比度
Image{i} = imresize(Image{i},[Scale,Scale]); % 都变成40*40的图像
Image{i} = im2bw(Image{i}); % 二值化
subplot(4,5,i);
imshow(Image{i});
Data(:,i) = Image{i}(:); % 转换成向量
end
Dist = dist(Data);
Input = Dist;
Output = -1*ones(Num,Num);
Label = 1:Num;
for i = 1:Num
Output(i,i) = 1;
end
% 转换成向量 每列Num个 模式所对应的那一行等于1 其余为0
Input = [Input Input Input Input]; % 重复训练
Output = [Output Output Output Output];
%% 参数设置
% 迭代次数 epochs
% 训练目标 goal
% 学习效率 lr
% 学习函数 trainFcn
% 'trainrp' 弹性梯度下降
% 'traingdm' 附加动量
% 'traingdx' 自适应
% 'trainlm' LM算法
rng(152,'twister'); % 这里 固定随机数 里面数值可以随意换
% 这个的意思是这样:每次跑程序 如果不固定这个 结果就是随机的 里面的数值 是可以随便换的 换一组就是一个结果
% 参数 这个我给先解释一下 matlab的ANN 一旦有一个目标满足 那就终止算法了
% 并且 比如我们输入了100个样本 它会自己分成若干组 然后分别训练的 具体细节我也没有仔细研究
ly = [23]; %隐层和节点数目 [20,5] 的意思是 两个隐层 第一个20 第二个5 [3] 的意思就是 一层 3个神经元
net_BP = feedforwardnet(ly);
net_BP.trainParam.epochs = 1e3; % 训练次数设置
net_BP.trainParam.goal = 1e-32; % 训练目标设置
net_BP.trainParam.lr = 0.05; % 学习率
net_BP.trainParam.max_fail = 1e1; % 检测次数
net_BP.trainParam.min_grad = 1e-15; % 最小梯度
[net_BP,tr] = train(net_BP,Input,Output);
%nntraintool('close'); % 关闭训练窗口
% 计算误差
% 训练误差
T = sim(net_BP,Input);
Lab = zeros(1,Num); % 查找每一列最接近1的
for i = 1:Num
[~,id] = min(abs(T(:,i)-1));
Lab(i) = id(1);
end
E1 = (Lab-Label);
% 画图
% 迭代误差图
figure;
plot(tr.perf);
title('迭代误差');
% 输出结果
clc;
fprintf('\n\n>>训练误差:\n'); % 训练误差
fprintf(' %d\n',sqrt(sum(E1.^2)/(numel(E1)-1)));
fprintf('\n\n>>迭代次数:\n'); % 迭代次数
fprintf(' %d\n',numel(tr.perf));
% 误差画图
figure; % 真实数据跟仿真数据对比
plot(Lab,'ro');
hold on;
plot(Label,'.b');
legend('仿真数据','真实数据');
xlim([1 Num]);
title(strcat('识别错误个数:',num2str(sum(Lab~=Label))));
% 保存训练好的网络以便我们用到GUI中
Trained_BP = net_BP;
save Trained_BP Trained_BP
save Name Name
save Data Data
3 仿真结果
4 参考文献
[1]焦金星, 赵建辉, 王福钊. 基于BP神经网络的交通标志识别算法研究[C]// 中国智能交通年会. 2013.
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页头条