基于CNN深度学习算实现手写字母识别系统python源码+训练好的模型+说明文档

手写字母识别

基于深度学习的手写字母识别 模型,用户可在画布上绘制大写字母(A-Z) ,由训练好的 CNN 模型进行预测识别。

✅ 功能特性

✔ 用户可在交互式画布上绘制字母

✔ 使用 OpenCV 进行图像预处理 ,提升识别效果

✔ 基于**训练好的卷积神经网络(CNN)**进行预测

✔ 模型在 EMNIST 数据集上训练

安装

1️⃣ 克隆仓库

bash 复制代码
git clone firc-projects
cd handwritten_letter_recognition

2️⃣ 安装依赖

bash 复制代码
pip install -r requirements.txt

使用方法

运行应用

bash 复制代码
python3 app.py
  • 在弹出的窗口中绘制大写字母(A-Z)
  • 's' 键进行字母识别。(按 'q' 退出)
  • 程序将输出识别结果及置信度

📊 输出示例

复制代码
Predicted Letter: W
Confidence: 96.85%

🧠 模型详情

  • 架构: 卷积神经网络(CNN)
  • 数据集:EMNIST Letters 数据集上训练(28x28 灰度图像)
  • 类别数: 26 个大写字母(A-Z)

📊 模型性能

测试准确率与损失

  • 测试准确率: 94.57%
  • 测试损失: 0.1703

📜 分类报告

复制代码
              precision    recall  f1-score   support

           A       0.93      0.96      0.95       800
           B       0.98      0.97      0.98       800
           C       0.97      0.96      0.97       800
           D       0.97      0.96      0.96       800
           E       0.97      0.98      0.97       800
           F       0.98      0.97      0.98       800
           G       0.91      0.81      0.86       800
           H       0.95      0.96      0.96       800
           I       0.78      0.73      0.76       800
           J       0.97      0.95      0.96       800
           K       0.98      0.97      0.98       800
           L       0.75      0.79      0.77       800
           M       0.99      1.00      0.99       800
           N       0.96      0.97      0.96       800
           O       0.96      0.98      0.97       800
           P       0.98      0.99      0.99       800
           Q       0.85      0.90      0.88       800
           R       0.97      0.96      0.97       800
           S       0.98      0.98      0.98       800
           T       0.97      0.98      0.97       800
           U       0.95      0.94      0.95       800
           V       0.93      0.94      0.93       800
           W       1.00      0.98      0.99       800
           X       0.97      0.98      0.98       800
           Y       0.95      0.96      0.96       800
           Z       0.99      1.00      0.99       800

    accuracy                           0.95     20800
   macro avg       0.95      0.95      0.95     20800
weighted avg       0.95      0.95      0.95     20800

📈 训练过程可视化

以下为模型的训练准确率与损失曲线图:

!

🛠 模型配置

yaml 复制代码
model:
  type: "CNN"
  layers:
    - Conv2D: {filters: 64, kernel_size: [3,3], activation: "LeakyReLU", input_shape: [28, 28, 1], kernel_initializer: "he_normal"}
    - MaxPooling2D: {pool_size: [2,2]}
    - Conv2D: {filters: 128, kernel_size: [3,3], activation: "LeakyReLU", kernel_initializer: "he_normal"}
    - MaxPooling2D: {pool_size: [2,2]}
    - Conv2D: {filters: 256, kernel_size: [3,3], activation: "LeakyReLU", kernel_initializer: "he_normal"}
    - Flatten: {}
    - Dense: {units: 512, activation: "LeakyReLU", kernel_initializer: "he_normal"}
    - Dropout: {rate: 0.4}
    - Dense: {units: 26, activation: "softmax"}
training:
  optimizer: "adam"
  loss_function: "categorical_crossentropy"
  batch_size: 64
  epochs: 30
  learning_rate_schedule: "ReduceLROnPlateau (patience=1, factor=0.5, min_lr=1e-5)"
dataset:
  name: "EMNIST Letters"
  input_shape: [28, 28, 1]
  classes: 26
  preprocessing:        # 数据预处理
    - "逆时针旋转 90°"
    - "水平翻转"
    - "将像素值归一化至 [0,1] 范围"
  augmentation:         # 数据增强
    - "RandomAffine: degrees=6, translate=(0.05, 0.05), scale=(0.98, 1.02)"
    - "RandomApply: ElasticTransform(alpha=2.0, p=0.2)"
    - "RandomApply: GaussianBlur(kernel_size=3, p=0.05)"

开发过程中遇到的挑战

在开发过程中,我遇到了多个技术挑战,并逐一进行了系统性解决:

1️⃣ 数据预处理与方向校正

  • 挑战: EMNIST 数据集中的图像存在顺时针旋转 90° 并镜像的问题,导致预测不准确。
  • 解决方案: 实现了自定义预处理 步骤,包括逆时针旋转 90° 和水平翻转,确保图像在输入模型前方向正确。

2️⃣ 使模型适应真实手写输入

  • 挑战: 模型在 EMNIST 上表现良好,但由于数据集偏差,对真实手写输入的识别能力较弱。
  • 解决方案: 引入了数据增强 ,包括弹性变换、高斯模糊及轻微仿射变换 ,有效提升了模型对不同书写风格的泛化能力

3️⃣ 解决相似字母的误分类问题(I、L、G、Q)

  • 挑战: 模型经常将外形相似的字母混淆,例如 I 与 LG 与 Q
  • 解决方案: 引入了针对性数据增强 ,包括对 I 和 L 进行轻微旋转调整

4️⃣ 防止过拟合与模型优化

  • 挑战: 模型在训练约 9 个 epoch 后开始出现过拟合,泛化能力下降。
  • 解决方案: 调整了 Dropout 层(0.4)、提前触发 ReduceLROnPlateau 以及优化 batch size,从而提升了在未见数据上的表现。

5️⃣ 使用早停法提升训练效率

  • 挑战: 难以确定最佳训练轮数,模型在超过最优 epoch 后继续训练,导致不必要的计算开销和严重过拟合。
  • 解决方案: 实现了 EarlyStopping(早停) ,监控验证损失,在其不再改善时停止训练,确保模型保持最佳性能。
    完整源码地址:https://download.csdn.net/download/FL1623863129/90010786
相关推荐
极创信息1 小时前
信创产品适配测试认证,域名和SSL是必须的吗?
java·开发语言·网络·python·网络协议·ruby·ssl
喵叔哟1 小时前
第3周学习笔记
python·langchain
码云骑士1 小时前
11-GIL不是性能杀手(上)-CPU密集vsIO密集的实测对比
开发语言·python
johnny2331 小时前
Python生态模版引擎:Django、Jinja2、Liquid、Mustache、Mako、Chameleon
python
喵叔哟2 小时前
Week 3 --Day 5:性能优化与监控
人工智能·python·性能优化·langchain
Kingairy2 小时前
python3装饰器
开发语言·python
努力写A题的小菜鸡2 小时前
PyTorch 搭建卷积神经网络:常规写法 vs Sequential 写法详解
人工智能·pytorch·cnn
暗黑小白2 小时前
第八篇:人在回路与内容安全 —— 当 AI 说“让我请示一下“
python·安全·架构·ai agent
大蚂蚁2号2 小时前
Python 项目架构深度解析:从混乱到清晰
开发语言·python·架构