手写数字识别系统
项目介绍
本项目实现了一套完整的手写数字识别方案,涵盖了从数据集生成、神经网络训练到实际图像中多数字定位与识别的全流程。系统利用数学建模模拟手写样本进行训练,并结合计算机视觉技术处理复杂的背景图像,最终实现对整张测试画布中所有手写数字的自动识别与实时标注。
功能特性
- 自主数据合成:内置数据生成模块,通过模拟旋转和文本渲染生成训练样本,无需依赖外部庞大的数据集文件。
- 端到端训练流程:通过BP(反向传播)算法训练自定义的三层神经网络模型,掌握从原始像素到抽象数字类别的映射。
- 鲁棒的图像预处理:集成灰度化、Otsu二值化、中值滤波及形态学闭运算等多种处理手段,确保在不同环境下的特征提取质量。
- 多目标自动分割:基于连通域标记算法,动态识别图像中数字的数量、位置及大小,实现精准的单体分割。
- 可视化识别结果:识别结果通过图形界面实时反馈,在原始图像上以矩形框定位并叠加预测数字。
逻辑流程说明
系统启动后,核心逻辑按照以下步骤有序执行:
- 数据构建阶段:调用内部函数生成0-9的数字样本。该过程利用文本渲染技术并在生成过程中引入角度旋转增强,将28x28的像素矩阵平坦化为784维向量作为训练输入。
- 模型训练阶段:初始化一个具备784个输入节点、100个隐藏节点和10个输出节点的感知器模型。通过50轮次的迭代学习,利用Sigmoid激活函数处理隐含层,Softmax函数处理输出层,并根据交叉熵原理通过BP算法更新权重和偏置。
- 测试场景创建:生成一张包含多个随机排列数字的模拟手写画布。
- 图像预处理流程:
*
色彩变换:将彩色或灰度图像统一转换为标准灰度格式。
*
二值化与反色:通过自适应阈值处理将图像转为黑白二值空间,并执行反色操作,使数字区域为白色(1),背景为黑色(0)。
*
去噪与强化:应用中值滤波消除孤立噪声点,利用膨胀与腐蚀(闭运算)填充数字笔画间的微小断裂。
- 目标定位与分割:利用连通域标记技术检索所有潜在数字区域。针对每个区域进行最小外接矩形计算,并过滤掉尺寸过小的噪声干扰。
- 推理与标注:将分割出的各异数额区域进行等比例缩放和正方形填充,使其符合28x28的输入规范。输入神经网络后,取输出概率最大的索引作为识别结果,并在原图上绘制红色识别框和黄色预测标签。
关键实现细节
- 神经网络架构:采用经典的三层全连接网络。前向传播中使用数值稳定的Softmax计算方法(减去最大值防止溢出)。权重更新采用学习率控制的梯度下降法。
- 形态学处理:使用磁盘形状的结构元素(strel('disk', 2))进行形态学操作,有效增强了手写笔画的连续性,提高了复杂形状下的分割成功率。
- 归一化处理:在分割后,系统会将长宽比不一的数字区域先嵌入到正方形背景中,再进行尺寸调整,这一步避免了直接拉伸导致的数字形态畸变。
- 偏移修正:在识别展示时,由于感知器输出索引为1-10,系统自动执行减1操作以准确对应0-9的物理含义。
使用方法
- 确保计算机已安装MATLAB及其图形处理工具箱。
- 将项目代码保存为.m文件。
- 在MATLAB命令行窗口运行该脚本。
- 程序首先会进行模型训练(命令行显示进度),随后自动弹出识别结果窗口。
- 在命令行窗口中可直接查看识别出的数字序列。
系统要求
- 软件环境:MATLAB R2016b 或更高版本。
- 必备工具箱:Image Processing Toolbox(图像处理工具箱)。
- 硬件要求:标准桌面配置即可,由于采用轻量化神经网络架构,无需GPU加速。