手写数字识别NB-260509

更新-260509 | 发布-260508

✳️ 目录

实验简介

关于MNIST


MNIST(Modified National Institute of Standards and Technology)是一个广泛用于图像分类入门的手写数字数据集。它由 0 到 9 的灰度数字图像组成,每张图像的大小为 28×28 像素。数据集共包含 70,000 个样本,其中 60,000 个用于训练,10,000 个用于测试。每个样本均带有对应的真实数字标签。

MNIST 数据集因其规模适中、格式统一、预处理简单,被视为机器学习领域的“Hello World”基准。在人工智能实验课程中,它常用于演示从数据加载、模型训练到性能评估的完整流程。学生可以通过该数据集直观地理解分类任务的基本概念,例如特征提取、损失函数、优化算法以及过拟合现象,并验证不同模型(如全连接网络、卷积神经网络)的识别效果。

关于朴素贝叶斯


本次实验将使用 朴素贝叶斯(NB, Naive Bayes) 实现 MNIST 分类,即将原始 MNIST 图像的 灰度像素值 通过一个阈值(通常为 127 或 0.5 归一化后)转化为 0/1 二值特征,然后使用 伯努利朴素贝叶斯(BernoulliNB) 模型进行分类。

朴素贝叶斯基于贝叶斯定理,并假设 特征之间条件独立。对于二值特征,每个类别的似然函数采用 伯努利分布

P(x|C_k) = ∏_{i=1}^{784} P(x_i|C_k)

其中:

  • x_i ∈ {0,1} 是第 i 个像素的二值取值。

模型需要估计:

  • 先验概率 P(C_k) = 类别 k 的样本数 / 总样本数。
  • 条件概率 P(x_i|C_k) = (类别 k 中第 i 个像素为 1 的样本数 + α) / (类别 k 的样本数 + 2α) (α 是拉普拉斯平滑参数,默认 α=1.0,避免零概率)

预测时,对于新样本 x,计算后验概率:

P(C_k|x) ∝ P(C_k) · ∏ P(x_i|C_k)

取使后验概率最大的类别作为预测结果。

关于开发板


本次实验将使用 ascend-log 昇腾开发板kunpeng-log 鲲鹏开发板,完成 MNIST 模型训练和推理验证。

本文部分步骤的思路借鉴了“零基础AI入门指南” 1。在此致谢文章作者。


实验目的


通过本次实验,期望达成以下目的:

  1. 了解 MNIST
  2. 了解 NB(朴素贝叶斯)
  3. 进一步掌握开发板的使用
  4. 进一步熟悉 Linux 相关操作
  5. 增加解决问题的经验

对号入座


小组 + 桌号 + 开发板编号,安排如下。✅请对号入座。

b102ted

小组 桌号 开发板 人数
1 1 昇腾1 3
2 1 昇腾2 3
3 3 昇腾3 3
4 3 昇腾4 3
5 4 昇腾5 2
6 5 昇腾6 3
7 4 昇腾7 2
8 4 昇腾8 2
9 5 昇腾9 3
10 6 昇腾10 3
11 8 昇腾11 2
12 7 昇腾12 2
13 7 昇腾13 2
14 7 昇腾14 2
15 6 昇腾16 3
16 8 鲲鹏1 2
17 9 鲲鹏2 3
18 9 鲲鹏3 3
19 8 鲲鹏4 2
20 10 鲲鹏5 3
21 11 鲲鹏6 2
22 10 鲲鹏7 3
23 11 鲲鹏8 2
24 12 鲲鹏9 3
25 12 鲲鹏10 3
26 11 鲲鹏11 2
27 2 鲲鹏12 1

注意事项


敬请关注以下事项:

  • 🚫 禁止:水杯、水瓶等,不要放在桌子上。临时放在桌子上,一定要拧紧盖子。否则液体泼洒出来,会损坏开发板。

  • ✅ 建议:书包和其他物品,请放在实验室四周的地上,或四周空闲的椅子上。


0-上电开机


插上电源即可开机:

  • ascend-log 昇腾:开发板上电后,3个指示灯会依次绿色常亮,表示启动正常。

  • kunpeng-log 鲲鹏:前面板有2个 Type-C,电源插入➡️边上那个。
  • kunpeng-log 鲲鹏:拿掉顶部的磁吸盖子,看到2个绿灯亮,就表示开机完成。

✅ 建议:电源线、网线等,都从桌子中间的六角形空洞穿出,到桌面上。


1-连接外网


开发板上电开机后,先让开发板连接外网,即能访问互联网。后续创建本次实验所需的 Python 虚拟环境,需要开发板能访问外网。相关请参考如下:


2-创建环境


创建本次实验所需环境,主要包括:

  • 创建 Python 虚拟环境。在虚拟环境中开展实验,可做到和开发板的其他项目互不影响。
  • 在 Python 虚拟环境中安装相关包。
  1. HwHiAiUser 用户登录开发板

    用 MobeXterm 软件登录,或在本地电脑执行:

    ssh HwHiAiUser@192.168.137.100
    

    ✴️ 鲲鹏开发板的默认IP地址,也改为 192.168.137.100 了。

    或者已用 root 登录开发板,则切换到 HwHiAiUser:

    su - HwHiAiUser
    

    ✳️ 在权限满足实验要求的前提下,尽量不用超级用户 root 做实验。

  2. 用 conda 创建 Python 3.10 的虚拟环境:

    conda create -n nbm0509 python=3.10
    

    ✳️ nbm0509 是虚拟环境的名字。可以是其他名字。本文以 nbm0509 为例。

    ✳️ Python 3.10 可以完成本次实验。更高或更低版本,可能也可以完成本次实验。

  3. 激活刚创建的虚拟环境:

    conda activate nbm0509
    
  4. 在虚拟环境中安装相关包:

    pip3 install numpy Pillow flask opencv-python
    

    ✳️ 亦可用 conda 安装,效果是一样的。命令是:

    conda install numpy Pillow flask opencv-python
    


✅ 可以执行以下命令,删除虚拟环境。然后重复上述2、3、4步骤,重新创建虚拟环境。

  • 如果当前在虚拟环境 nbm0509 中,则先去激活:

    conda deactivate
    
  • 删除虚拟环境:

    conda remove -n nbm0509 --all
    

3-获取源码


下载样例压缩包(源码+数据),并上传开发板,然后解压缩。

  1. 下载样例压缩包江大云盘链接↗

    压缩包文件名是:nbm260509.zip,包含以下样例文件和数据:

    ├── apphw.py    # Web界面鼠标手写数字识别
    ├── apptk.py    # 摄像头拍摄手写数字识别
    ├── data        # MNIST数据集
    │   └── MNIST
    │       └── raw
    │           ├── t10k-images-idx3-ubyte.gz
    │           ├── t10k-labels-idx1-ubyte.gz
    │           ├── train-images-idx3-ubyte.gz
    │           └── train-labels-idx1-ubyte.gz
    ├── infer.py    # 模型推理程序
    ├── input       # 测试图片
    │   ├── test-0.png
    │   ├── test-1.png
    │   ├── test-2.png
    │   ├── test-3.png
    │   ├── test-4.png
    │   ├── test-5.png
    │   ├── test-6.png
    │   ├── test-7.png
    │   ├── test-8.png
    │   └── test-9.png
    ├── templates    # Web页面
    │   ├── handwrite.html
    │   └── takephoto.html
    └── train.py     # 模型训练程序
    
  2. 在开发板上新建实验用目录:

    mkdir ~/nbm0509
    

    该实验目录的完整路径是:/home/HwHiAiUser/nbm0509

  3. 上传压缩包到开发板的实验目录中

    用 MobaXterm 软件传文件。请参考:MobaXterm简要说明↗ | 传文件

    或者在本地电脑敲命令传文件。请参考:Linux常用操作↗ | scp 远程复制文件/目录

    scp nbm260509.zip HwHiAiUser@192.168.137.100:/home/HwHiAiUser/nbm0509
    
  4. 在开发板上解压缩

    先进入实验目录:

    cd ~/nbm0509
    

    再解压缩:

    unzip nbm260509.zip
    

    解压缩后生成子目录 mnist-nb,完整路径应该是:/home/HwHiAiUser/nbm0509/mnist-nb。


4-体验样例

训练模型


使用压缩包中的数据集,对朴素贝叶斯模型做训练。

  1. 先进入样例代码目录

    cd ~/nbm0509/mnist-nb
    
  2. 并确保虚拟环境已激活

    命令行提示符首部有 (nbm0509) 字样,即表示本次实验用虚拟环境已激活。如需激活,可执行以下命令:

    conda activate nbm0509
    
  3. 训练模型

    python3 train.py
    

    训练耗费数秒时间。训练完成后,可在屏幕上看到如下信息:

    (nbm0509) HwHiAiUser@davinci-mini:~/nbm0509/mnist-nb$ python3 train.py
    加载训练集...
    加载测试集...
    训练集大小: (60000, 784), 测试集大小: (10000, 784)
    训练 Bernoulli Naive Bayes 模型...
    测试集准确率: 0.8427 (84.27%)
    模型已保存为 mnist_nb_model.npz
    

推理验证


样例中的目录 input 有 0 ~ 9 共 10 张图片。可执行以下命令体验推理验证:

python3 infer.py <图片路径>

比如验证识别数字 0:

python3 infer.py input/test-0.png

可在屏幕看到如下提示信息:

(nbm0509) HwHiAiUser@davinci-mini:~/nbm0509/mnist-nb$ python3 infer.py input/test-0.png
预测数字: 0
其他数字概率:
  0: 1.000000
  1: 0.000000
  2: 0.000000
  3: 0.000000
  4: 0.000000
  5: 0.000000
  6: 0.000000
  7: 0.000000
  8: 0.000000
  9: 0.000000

产品化


增加 Web 界面。可在 Web 界面手写数字、要求识别,并得到识别结果。

  1. 开发板上启动 Web 服务端

    在开发板上执行以下命令:

    python3 apphw.py
    

    启动完成后,可看到屏幕如下类似提示信息:

    (nbm0509) HwHiAiUser@davinci-mini:~/nbm0509/mnist-nb$ python3 apphw.py
    模型加载成功
           * Serving Flask app 'apphw'
           * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
           * Running on all addresses (0.0.0.0)
           * Running on http://127.0.0.1:5000
           * Running on http://172.18.145.46:5000
    Press CTRL+C to quit
           * Restarting with stat
    模型加载成功
           * Debugger is active!
           * Debugger PIN: 921-919-078
    
  2. 本地电脑浏览器访问开发板

    在本地电脑浏览器输入以下 IP:端口 访问:

    192.168.137.100:5000
    

    在本地电脑的浏览器界面,用鼠标手逐个写 0 ~ 9 共 10 个数字,点击识别,并获得识别结果。

    handwrite

拍摄并识别


增加 Web 界面。可在 Web 界面指引用连接开发板的 USB 摄像头,拍摄手写数字、要求识别,并得到识别结果。

  1. 开发板上启动 Web 服务端

    在开发板上执行以下命令:

    python3 apptk.py
    

    启动完成后,可看到屏幕如下类似提示信息:

    (nbm0509) HwHiAiUser@davinci-mini:~/nbm0509/mnist-nb$ python3 apptk.py
    模型加载成功
    找到可用摄像头: /dev/video0
           * Serving Flask app 'apptk'
           * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
           * Running on all addresses (0.0.0.0)
           * Running on http://127.0.0.1:5000
           * Running on http://172.18.145.46:5000
    Press CTRL+C to quit
           * Restarting with stat
    模型加载成功
    找到可用摄像头: /dev/video0
           * Debugger is active!
           * Debugger PIN: 921-919-078
    

    ✴️ 如果无法访问摄像头,请参考:普通用户访问摄像头↗

  2. 本地电脑浏览器访问开发板

    在本地电脑浏览器输入以下 IP:端口 访问:

    192.168.137.100:5000
    

    参考在本地电脑的浏览器界面上的指引,用和开发板相连的USB摄像头,逐个拍摄 0 ~ 9 共 10 个数字,点击识别,并获得识别结果。

    takephoto


实验任务


本次实验主要完成以下任务:

  1. 完成 4-体验样例 任务

  2. 输出个人独特版本的程序

    • 建议结合AI辅助编程
    • 程序包括:模型训练train.py、模型推理infer.py、产品化apphw.py、拍摄并识别apptk.py
    • 可在开发板上(活着个人电脑上)完成
    • 截图保存执行结果
  3. 尝试提高准确率

    比如:如果想进一步调优,可尝试调整 binarize 阈值(如 100 或 150)和 alpha 平滑参数。


建议:每个同学都可以同时使用开发板

  • 小组成员,一起体验样例

  • 随后,小组成员可以同时使用开发板,完成个人独特版本的程序。方法:同时登录使用开发板,在不同的目录中运行调试。比如:

    • 同学1:使用 /home/HwHiAiUser/m1
    • 同学2:使用 /home/HwHiAiUser/m2
    • 同学3:使用 /home/HwHiAiUser/m3
    • 虚拟环境,共用一个就可以了。也可创建 3 个虚拟环境。
  • ascend-log 昇腾,可以使用以下命令同时登录:

    ssh HwHiAiUser@172.18.145.xxx
    

    ✴️ 1、开发板通过实验室网线连外网;2、PC 要先连校园网

  • kunpeng-log 鲲鹏,可以使用以下命令同时登录:

    ssh HwHiAiUser@192.168.31.xxx
    

    ✴️ 1、开发板连接WiFi b102 访问外网;2、PC 要先连校连接WiFi b102

  • 如何查看开发板 IP 地址,请参考:Linux常用操作↗ | ifconfig 查看IP地址

相关提示词参考(基础版)


训练和推理

1、用朴素贝叶斯实现MNIST分类。

2、输出训练的样例代码:

  • 训练结果保存为模型
  • MNIST的4个数据集 gz 文件已下载,放在 ./data/MNIST/raw 目录下,直接加载使用
  • 使用其他方法加载数据集,不使用 torchvision
  • 训练代码中,要有对测试集的验证

3、输出推理的样例代码:

  • 待识别图片是白底黑字
  • 图片文件名作为命令行参数传入推理程序
  • 除了输出预测数字外,还要输出其他数字的概率

产品化

1、增加web 界面

  • 可在web界面用鼠标手写数字
  • 点击预测,后台推理识别
  • 在web界面上显示推理结果(识别到是哪个数字)

拍摄并识别

1、增加一个app,可用浏览器访问

  • 显示接在开发板上的 USB 摄像头的画面
  • 点击拍照,可以拍摄手写数字。
  • 拍到的手写数字,也要显示在界面上。
  • 点击预测,后台推理识别
  • 在web界面上显示推理结果(识别到是哪个数字)

关机断电复位离开


实验结束后,请完成以下事项,再离开实验课。

  1. 关机断电

    开发板要先关机、再断电。🚫 严谨开机状态直接断电(拔电源)!

    ✴️ 上次实验课后,发现有1个开发板无法启动。重新烧录镜像后解决。镜像损坏(大概率是文件系统损坏引起的),可能和 SD 卡质量相关,也可能是开机状态直接断电引起的。

  2. 归还实验器材,给实验室老师

    • 开发板(每组1个)
    • 开发板电源(每组1个)
    • 网线(每组1个)
    • USB摄像头(每桌共用1个)
    • 借用的其他器材
  3. 椅子复位

    • 每个桌子,配套 6 个椅子。请将椅子推到桌子下面。
    • 西侧玻璃门,前中后靠墙,各 6 个。共 18 个。请按此数量靠墙摆放。
  4. 带齐随身物品

✅ 上述事项完成后,可离开实验室。

THE END