基于BP神经网络的交通标志识别是一种常见的图像识别应用,可以帮助汽车驾驶辅助系统、自动驾驶系统等更好地理解交通标志并做出相应的控制决策。
数据集准备:首先需要建立一个包含各种交通标志样本的数据集,包括速限标志、禁止标志、警告标志等。数据集的质量对于神经网络的训练至关重要。
图像预处理:对数据集中的图像进行预处理,包括大小调整、灰度化、图像增强等,以便于神经网络更好地学习和识别。
BP神经网络结构设计:设计一个适合交通标志识别的BP神经网络结构,包括输入层、隐藏层和输出层的神经元数量、激活函数选择等。
训练神经网络:使用数据集对设计好的BP神经网络进行训练,通过反向传播算法不断调整神经网络的权重和偏置,使其能够准确识别各种交通标志。
模型评估:使用测试集评估训练好的神经网络模型的准确率、召回率等指标,进一步优化神经网络的性能。
数据收集
收集常见的9种交通标志:
这9种标签的含义分别是:
禁止机动车通行,禁止停车,禁止左转弯,T型路口,窄桥,限制6吨,注意行人,人行横道,向右转弯,右侧行驶
2、训练BP神经网络模型
(1)调整图形对比度
(2)调整图像大小为40X40
(3)图形二值化
(4)将不同标志的图形的特征作为输入,对应的标签作为输出
(5)设定BP神经网络参数:
①net_BP = feedforwardnet(ly);隐藏藏节点数目为23
②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; % 最小梯度
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];
%% 参数设置
rng(152,'twister'); % 这里 固定随机数 里面数值可以随意换
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);
% 计算误差
% 训练误差
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
(6)神经网络结构图
(7)结果
(8)GUI可视化
①对图像进行膨胀和腐蚀操作,并移除小对象(噪点)。
②标记连通域并计算区域个数。
③对每个区域计算面积,并按面积大小降序排序。
④计算每个区域的范围和长宽比。
⑤判断区域的长宽比是否符合条件,找到符合条件的区域。
⑥根据条件处理每个区域,选择合适的区域进行显示。
⑦最后将处理后的图像在 GUI 中显示,并更新 handles 数据结构。
(9)可视化结果
完整代码获取:https://mbd.pub/o/bread/Zpaamply