基于BP神经网络的交通标志识别(包含GUI)

基于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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神来回复

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值