基于BP神经网络的26个英文字母识别

本课题旨在设计并实现一个基于BP(反向传播)神经网络的英文字母识别系统,实现对手写或打印的26个英文字母(A-Z)的自动分类识别。项目首先对字母图像进行预处理(如灰度化、归一化、二值化和特征提取),随后将图像特征作为神经网络输入,通过训练BP网络识别字母类别。BP神经网络具有结构简单、可调性强的优点,通过调整隐含层数量、学习率和训练函数可有效提高分类准确率。本系统可应用于OCR(光学字符识别)、人机交互和教育辅助等领域。最终在 MATLAB 平台上完成网络构建、训练和测试,并通过混淆矩阵等方式评估识别性能。

clc
clear
close all%% 数据读取和预处理
% 定义文件路径
train_images_file = '英文字母数据集/emnist-letters-train-images-idx3-ubyte.gz';
train_labels_file = '英文字母数据集/emnist-letters-train-labels-idx1-ubyte.gz';
test_images_file = '英文字母数据集/emnist-letters-test-images-idx3-ubyte.gz';
test_labels_file = '英文字母数据集/emnist-letters-test-labels-idx1-ubyte.gz';% 解压文件
gunzip(train_images_file);
gunzip(train_labels_file);
gunzip(test_images_file);
gunzip(test_labels_file);% 读取数据
[train_images, train_labels] = readEMNIST(strrep(train_images_file, '.gz', ''),strrep(train_labels_file, '.gz', ''));
[test_images, test_labels] = readEMNIST(strrep(test_images_file, '.gz', ''),strrep(test_labels_file, '.gz', ''));
train_images = [train_images;test_images];
train_labels =[train_labels;test_labels];
%% 手工特征提取(修正版HOG + LBP)
fprintf('开始手工特征提取...\n');% HOG参数配置
hogCellSize = [4 4];  % 每个cell的大小
hogBlockSize = [2 2]; % 每个block包含的cell数
hogNumBins = 9;       % 方向分箱数% 计算HOG特征维度
imgSize = [28 28];
cellsPerBlock = hogBlockSize(1)*hogBlockSize(2);
blocksPerImage = floor((imgSize./hogCellSize - hogBlockSize)./[1 1] + 1);
hogSize = prod(blocksPerImage) * cellsPerBlock * hogNumBins;% LBP参数配置
lbpRadius = 2;
lbpNeighbors = 8;
lbpSize = 59; % 对于8邻域uniform LBP固定为59维% 提取训练集特征
train_features = zeros(size(train_images,1), hogSize + lbpSize);
for i = 1:size(train_images,1)img = reshape(train_images(i,:), [28 28]);% HOG特征hog = extractHOGFeatures(img, 'CellSize', hogCellSize, ...'BlockSize', hogBlockSize, ...'NumBins', hogNumBins);% LBP特征lbp = extractLBPFeatures(img, 'Radius', lbpRadius, ...'NumNeighbors', lbpNeighbors);train_features(i,:) = [hog, lbp];% 显示进度if mod(i,1000) == 0fprintf('已处理 %d/%d 训练样本\n', i, size(train_images,1));end
end% 提取测试集特征
test_features = zeros(size(test_images,1), size(train_features,2));
for i = 1:size(test_images,1)img = reshape(test_images(i,:), [28 28]);hog = extractHOGFeatures(img, 'CellSize', hogCellSize, ...'BlockSize', hogBlockSize, ...'NumBins', hogNumBins);lbp = extractLBPFeatures(img, 'Radius', lbpRadius, ...'NumNeighbors', lbpNeighbors);test_features(i,:) = [hog, lbp];
end% 特征归一化
mu = mean(train_features);
sigma = std(train_features);
train_features = (train_features - mu) ./ sigma;
test_features = (test_features - mu) ./ sigma;%% 筛选大写字母A-Z (1-26)
uppercase_indices = find(train_labels >= 1 & train_labels <= 26);
train_features = train_features(uppercase_indices, :);
train_labels = train_labels(uppercase_indices);test_indices = find(test_labels >= 1 & test_labels <= 26);
test_features = test_features(test_indices, :);
test_labels = test_labels(test_indices);% 转换为one-hot编码
train_labels_onehot = full(ind2vec(train_labels', 26))';
test_labels_onehot = full(ind2vec(test_labels', 26))';%% 构建BP神经网络
inputSize = size(train_features,2);
net = patternnet([256 128]);  % 输入 -> 256 -> 128 -> 26% 配置网络参数
net.inputs{1}.size = inputSize;
net.trainFcn = 'trainscg';
net.performFcn = 'crossentropy';
net.trainParam.epochs = 200;
net.trainParam.showCommandLine = true;
net.trainParam.max_fail = 15; % 早停
net.performParam.regularization = 0.01; % L2正则化% 数据划分
net.divideParam.trainRatio = 0.8;
net.divideParam.valRatio = 0.1;
net.divideParam.testRatio = 0.1;%% 训练网络
fprintf('开始训练BP神经网络(HOG+LBP特征)...\n');
[net, tr] = train(net, train_features', train_labels_onehot');%% 测试网络性能
test_output = net(test_features');
[~, predicted_labels] = max(test_output);
true_labels = test_labels';% 计算准确率
accuracy = sum(predicted_labels == true_labels) / numel(true_labels);
fprintf('整体测试集准确率: %.2f%%\n', accuracy*100);%% 计算并显示各字母准确率
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
class_accuracies = zeros(1, 26);
confusion_mat = zeros(26, 26);
sample_counts = zeros(1, 26); % 记录每个字母的测试样本数% 预存每个字母的错误分析结果
top_errors = cell(1, 26); for i = 1:26idx = (true_labels == i);sample_counts(i) = sum(idx); % 统计当前字母的测试样本数if sample_counts(i) > 0correct = sum(predicted_labels(idx) == i);class_accuracies(i) = correct / sample_counts(i);% 填充混淆矩阵for j = 1:26confusion_mat(i,j) = sum(predicted_labels(idx) == j);end% 分析前3个错误分类[sorted_err, err_idx] = sort(confusion_mat(i,:), 'descend');error_list = {};for j = 1:26if err_idx(j) ~= i && sorted_err(j) > 0 && length(error_list) < 3error_list{end+1} = sprintf('%c(%.1f%%)',...letters(err_idx(j)),...100*sorted_err(j)/sample_counts(i));endendtop_errors{i} = error_list;elseclass_accuracies(i) = NaN;top_errors{i} = {};end
end%% 格式化输出结果(修正版)
fprintf('\n%-5s %-8s %-12s %s\n', '字母', '准确率', '测试样本数', '错误分析');
fprintf('--------------------------------------------\n');for i = 1:26if sample_counts(i) > 0% 安全处理错误分析显示if isempty(top_errors{i})err_str = '无错误样本';elseerr_str = strjoin(top_errors{i}, ', ');endfprintf('%-5c %-8.2f%% %-12d %s\n',...letters(i),...class_accuracies(i)*100,...sample_counts(i),...err_str);elsefprintf('%-5c %-8s %-12d (无测试样本)\n',...letters(i), 'N/A', 0);end
end%% 可视化展示(改进版)
% 创建结果表格
results = cell(26, 4);
for i = 1:26results{i,1} = letters(i);if sample_counts(i) > 0results{i,2} = sprintf('%.2f%%', class_accuracies(i)*100);results{i,3} = sample_counts(i);if isempty(top_errors{i})results{i,4} = '无错误';elseresults{i,4} = strjoin(top_errors{i}, ', ');endelseresults{i,2} = 'N/A';results{i,3} = 0;results{i,4} = '无样本';end
end% 显示表格
f = figure('Position', [100 100 700 500]);
t = uitable(f, 'Data', results,...'ColumnName', {'字母', '准确率', '样本数', '主要错误'},...'ColumnWidth', {50, 80, 80, 300},...'Position', [20 20 660 460]);
title('字母识别详细结果');% 2. 混淆矩阵(改进版)
figure;
imagesc(confusion_mat./sum(confusion_mat,2));
colormap(jet); colorbar; caxis([0 1]);
xticks(1:26); yticks(1:26);
xticklabels(cellstr(letters')); yticklabels(cellstr(letters'));
xlabel('预测标签'); ylabel('真实标签');
title('归一化混淆矩阵');% 3. 随机样本展示
figure('Position', [100, 100, 1000, 800]);
for i = 1:20idx = randi(length(test_indices));original_idx = test_indices(idx);img = reshape(test_images(original_idx,:), [28,28]);subplot(4,5,i);imshow(img);true_label = letters(test_labels(idx));pred_label = letters(predicted_labels(idx));if true_label == pred_labelcolor = 'g';elsecolor = 'r';endtitle(sprintf('True: %s\nPred: %s', true_label, pred_label), 'Color', color);
end%% 保存模型
save('emnist_hog_lbp_bp.mat', 'net', 'tr', 'class_accuracies');%% 辅助函数
function [images, labels] = readEMNIST(imageFile, labelFile)% 读取图像文件fid = fopen(imageFile, 'r', 'b');magicNum = fread(fid, 1, 'int32');numImages = fread(fid, 1, 'int32');numRows = fread(fid, 1, 'int32');numCols = fread(fid, 1, 'int32');images = fread(fid, [numCols*numRows, numImages], 'uint8');images = images';fclose(fid);% 读取标签文件fid = fopen(labelFile, 'r', 'b');magicNum = fread(fid, 1, 'int32');numLabels = fread(fid, 1, 'int32');labels = fread(fid, numLabels, 'uint8');fclose(fid);% 调整图像方向(EMNIST图像需要旋转和翻转)images = reshape(images, [size(images,1), numRows, numCols]);for i = 1:size(images,1)img = squeeze(images(i,:,:));img = imrotate(img, -90);img = flip(img, 2);images(i,:,:) = img;endimages = reshape(images, [size(images,1), numRows*numCols]);
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89206.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师论文分享-论云原生技术的应用

我的软考历程 摘要 2023年2月&#xff0c;我所在的公司做了开发纱线MES系统的决定&#xff0c;该系统为国内纱线工厂提供SAAS服务&#xff0c;旨在提高纱线工厂的智能化和数字化水平。我在该项目中被任命为系统架构设计师&#xff0c;全面掌管该项目的架构设计工作。该项目涉…

重置 MySQL root 密码

引言 在linux可能存在安装mysql安装失败&#xff0c;一直不出现默认密码 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面试八股---HTML

面试八股 1、HTML 1.1 src和href的区别 src 用于替换当前元素&#xff0c;href 用于在当前文档和引用资源之间确立联系。 核心区别在于 href 关联的资源&#xff08;主要是 CSS&#xff09;是用于描述页面外观的&#xff0c;浏览器可以先生成内容再应用样式&#xff0c;因此…

气候智能体:AI如何重构人类应对气候危机的决策体系?

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 《气候智能体&#xff1a;AI如何重构人类应对气候危机的决策体系&#xff1f;》 展开全景式论述。文章结合2025年最新技术突破与…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用详情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;苹果引入了安全区域&#xff08;Safe Area&#xff09;的概念,当UITableView的frame超出了安全区域,系统会自定调整SafeAreaInsets的值,它可以自动调整内容的内边距&#xff0c;使得内容不会被导航栏遮挡。…

腾讯云RayData全新推出“行业解决方案模板”,一键快捷制作3D数据可视化作品

点击蓝字⬆ 关注我们 本文共计958字 预计阅读时长3分钟 腾讯云RayData Plus是一款专注于高视效的3D数据可视化的实时渲染工具。 功能全面&#xff1a;提供了三维、二维、动画、数据、交互逻辑等各类能力&#xff1b; 零代码制作&#xff1a;灵活的节点式创作&#xff0c;即便没…

深度解析基于贝叶斯的垃圾邮件分类

贝叶斯垃圾邮件分类的核心逻辑是基于贝叶斯定理&#xff0c;利用邮件中的特征&#xff08;通常是单词&#xff09;来计算该邮件属于“垃圾邮件”或“非垃圾邮件”的概率&#xff0c;并根据概率大小进行分类。它是一种朴素贝叶斯分类器&#xff0c;因其假设特征&#xff08;单词…

WPF 3D 开发全攻略:实现3D模型创建、旋转、平移、缩放

&#x1f3ae; WPF 3D 入门实战&#xff1a;从零打造一个可交互的立方体模型 标题&#xff1a; &#x1f680;《WPF 3D 开发全攻略&#xff1a;实现旋转、平移、缩放与法线显示》 &#x1f4a1; 引言 在现代图形应用中&#xff0c;3D 可视化已经成为不可或缺的一部分。WPF 提供…

Ruby 安装使用教程

一、Ruby 简介 Ruby 是一种简单快捷的面向对象脚本语言&#xff0c;以优雅、简洁、易读著称。它常被用于 Web 开发&#xff08;如 Ruby on Rails 框架&#xff09;、自动化脚本、DevOps、命令行工具等领域。 二、Ruby 安装教程 2.1 支持平台 Ruby 支持跨平台运行&#xff0c…

python | numpy小记(五):理解 NumPy 中的 `np.arccos`:反余弦函数

python | numpy小记&#xff08;五&#xff09;&#xff1a;理解 NumPy 中的 np.arccos&#xff1a;反余弦函数 一、函数签名与核心参数二、数学定义与取值范围三、基础使用示例四、与 Python 内建 math.acos 的对比五、常见问题与注意事项六、典型应用场景1. 三维向量夹角计算…

华为云Flexus+DeepSeek征文 | 华为云ModelArts与Reor的完美结合:创建高效本地AI笔记环境

华为云FlexusDeepSeek征文 | 华为云ModelArts与Reor的完美结合&#xff1a;创建高效本地AI笔记环境 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、Reor介绍Reor简介Reor主要特点 三、安装Reor工具下载Reor软件安装Reor工具 四、开…

【启发式算法】Dynamic A*(D*)算法详细介绍(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

报告怎么写

替代方案&#xff08;按场景选择&#xff09; 岗前准备阶段 ✅ "熟悉业务流程/系统操作" ✅ "掌握XX工具/平台的核心功能" ✅ "完成上岗前技术对接" 知识转化场景 ✅ "梳理产品知识体系" ✅ "转化技术文档为实操方案" ✅ &…

大模型——怎么让 AI 写出好看有设计感的网页

大模型——怎么让 AI 写出好看有设计感的网页 你让 AI 给你写的网页大概都是这样的: 或者这样: 好点的时候能这样: 但都不够高级,尤其是那个像引用一样的边框,太 AI 了。 今天教大家一个小技巧,写出下面这样的网页: 或者这样的

【Torch】nn.Linear算法详解

1. 定义 nn.Linear 是 PyTorch 中最基础的全连接&#xff08;fully‐connected&#xff09;线性层&#xff0c;也称仿射变换层&#xff08;affine layer&#xff09;。它对输入张量做一次线性变换&#xff1a; output x W T b \text{output} x W^{T} b outputxWTb 其中&a…

ZGC收集器

ZGC收集器 欢迎来到我的博客&#xff1a;TWind的博客 我的CSDN:&#xff1a;Thanwind-CSDN博客 我的掘金&#xff1a;Thanwinde 的个人主页 0.前言 ZGC收集器完全可以说是Java收集器的一个跨时代的收集器&#xff0c;他真正意义上实现了停顿时间在10ms以内并且几乎全时段都是…

隧道技术篇2frp代理nps代理shisel代理

FRP代理 1.实现湖北内网控制北京的内网C2上线 2.实现湖北内网探针北京内网 信息收集 &#xff08;socks建立和端口映射&#xff09; 1.连接47.98.210.85 7000端口服务端 2.尝试将服务端的6666转到127.0.0.1 5555采用tcp协议&#xff0c;备注名proxies serverAddr"47.98…

[Python 基础课程]PyCharm 的安装

Python 的编辑器目前主流的有 PyCharm 和 Vscode。 PyCharm 是 Python 目前最主流、最常用、最推荐的 Python 编辑器。 https://www.jetbrains.com/pycharm/ PyCharm 有社区版和专业版&#xff0c;可以根据自己的需要下载对应的版本。社区版是收费的&#xff0c;对于初学者或…

Spread Ribbon 工具栏控件:在WinForms中高效编辑Spread工作簿

引言 在数据密集型应用中&#xff0c;电子表格功能是提升用户体验的关键要素。GrapeCity Spread.NET V17 推出的独立 Ribbon工具栏控件&#xff0c;为WinForms开发者提供了与Excel高度一致的UI交互体验。通过集成此控件&#xff0c;用户可直观地进行数据编辑、格式调整等操作&…

leedcode:找到字符串中所有字母异位词

问题&#xff1a;给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 package com.text;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;…