手写数字识别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)
取使后验概率最大的类别作为预测结果。
关于开发板
本次实验将使用 昇腾开发板 和
鲲鹏开发板,完成 MNIST 模型训练和推理验证。
本文部分步骤的思路借鉴了“零基础AI入门指南” 1。在此致谢文章作者。
实验目的
通过本次实验,期望达成以下目的:
- 了解 MNIST
- 了解 NB(朴素贝叶斯)
- 进一步掌握开发板的使用
- 进一步熟悉 Linux 相关操作
- 增加解决问题的经验
对号入座
小组 + 桌号 + 开发板编号,安排如下。✅请对号入座。

| 小组 | 桌号 | 开发板 | 人数 |
|---|---|---|---|
| 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-上电开机
插上电源即可开机:
-
昇腾:开发板上电后,3个指示灯会依次绿色常亮,表示启动正常。
鲲鹏:前面板有2个 Type-C,电源插入➡️边上那个。
鲲鹏:拿掉顶部的磁吸盖子,看到2个绿灯亮,就表示开机完成。
✅ 建议:电源线、网线等,都从桌子中间的六角形空洞穿出,到桌面上。
1-连接外网
开发板上电开机后,先让开发板连接外网,即能访问互联网。后续创建本次实验所需的 Python 虚拟环境,需要开发板能访问外网。相关请参考如下:
2-创建环境
创建本次实验所需环境,主要包括:
- 创建 Python 虚拟环境。在虚拟环境中开展实验,可做到和开发板的其他项目互不影响。
- 在 Python 虚拟环境中安装相关包。
-
HwHiAiUser 用户登录开发板
用 MobeXterm 软件登录,或在本地电脑执行:
ssh HwHiAiUser@192.168.137.100✴️ 鲲鹏开发板的默认IP地址,也改为 192.168.137.100 了。
或者已用 root 登录开发板,则切换到 HwHiAiUser:
su - HwHiAiUser✳️ 在权限满足实验要求的前提下,尽量不用超级用户 root 做实验。
-
用 conda 创建 Python 3.10 的虚拟环境:
conda create -n nbm0509 python=3.10✳️ nbm0509 是虚拟环境的名字。可以是其他名字。本文以 nbm0509 为例。
✳️ Python 3.10 可以完成本次实验。更高或更低版本,可能也可以完成本次实验。
-
激活刚创建的虚拟环境:
conda activate nbm0509 -
在虚拟环境中安装相关包:
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-获取源码
下载样例压缩包(源码+数据),并上传开发板,然后解压缩。
-
下载样例压缩包:江大云盘链接↗
压缩包文件名是: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 # 模型训练程序 -
在开发板上新建实验用目录:
mkdir ~/nbm0509该实验目录的完整路径是:/home/HwHiAiUser/nbm0509
-
上传压缩包到开发板的实验目录中
用 MobaXterm 软件传文件。请参考:MobaXterm简要说明↗ | 传文件
或者在本地电脑敲命令传文件。请参考:Linux常用操作↗ | scp 远程复制文件/目录
scp nbm260509.zip HwHiAiUser@192.168.137.100:/home/HwHiAiUser/nbm0509 -
在开发板上解压缩
先进入实验目录:
cd ~/nbm0509再解压缩:
unzip nbm260509.zip解压缩后生成子目录 mnist-nb,完整路径应该是:/home/HwHiAiUser/nbm0509/mnist-nb。
4-体验样例
训练模型
使用压缩包中的数据集,对朴素贝叶斯模型做训练。
-
先进入样例代码目录
cd ~/nbm0509/mnist-nb -
并确保虚拟环境已激活
命令行提示符首部有
(nbm0509)字样,即表示本次实验用虚拟环境已激活。如需激活,可执行以下命令:conda activate nbm0509 -
训练模型
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 界面手写数字、要求识别,并得到识别结果。
-
开发板上启动 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 -
本地电脑浏览器访问开发板
在本地电脑浏览器输入以下 IP:端口 访问:
192.168.137.100:5000在本地电脑的浏览器界面,用鼠标手逐个写 0 ~ 9 共 10 个数字,点击识别,并获得识别结果。

拍摄并识别
增加 Web 界面。可在 Web 界面指引用连接开发板的 USB 摄像头,拍摄手写数字、要求识别,并得到识别结果。
-
开发板上启动 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✴️ 如果无法访问摄像头,请参考:普通用户访问摄像头↗
-
本地电脑浏览器访问开发板
在本地电脑浏览器输入以下 IP:端口 访问:
192.168.137.100:5000参考在本地电脑的浏览器界面上的指引,用和开发板相连的USB摄像头,逐个拍摄 0 ~ 9 共 10 个数字,点击识别,并获得识别结果。

实验任务
本次实验主要完成以下任务:
-
完成 4-体验样例 任务
-
输出个人独特版本的程序
- 建议结合AI辅助编程
- 程序包括:模型训练
train.py、模型推理infer.py、产品化apphw.py、拍摄并识别apptk.py - 可在开发板上(活着个人电脑上)完成
- 截图保存执行结果
-
尝试提高准确率
比如:如果想进一步调优,可尝试调整 binarize 阈值(如 100 或 150)和 alpha 平滑参数。
✅ 建议:每个同学都可以同时使用开发板
-
小组成员,一起体验样例
-
随后,小组成员可以同时使用开发板,完成个人独特版本的程序。方法:同时登录使用开发板,在不同的目录中运行调试。比如:
- 同学1:使用
/home/HwHiAiUser/m1 - 同学2:使用
/home/HwHiAiUser/m2 - 同学3:使用
/home/HwHiAiUser/m3 - 虚拟环境,共用一个就可以了。也可创建 3 个虚拟环境。
- 同学1:使用
-
昇腾,可以使用以下命令同时登录:
ssh HwHiAiUser@172.18.145.xxx✴️ 1、开发板通过实验室网线连外网;2、PC 要先连校园网
-
鲲鹏,可以使用以下命令同时登录:
ssh HwHiAiUser@192.168.31.xxx✴️ 1、开发板连接WiFi
b102访问外网;2、PC 要先连校连接WiFib102 -
如何查看开发板 IP 地址,请参考:Linux常用操作↗ | ifconfig 查看IP地址
相关提示词参考(基础版)
训练和推理
1、用朴素贝叶斯实现MNIST分类。
2、输出训练的样例代码:
- 训练结果保存为模型
- MNIST的4个数据集 gz 文件已下载,放在 ./data/MNIST/raw 目录下,直接加载使用
- 使用其他方法加载数据集,不使用 torchvision
- 训练代码中,要有对测试集的验证
3、输出推理的样例代码:
- 待识别图片是白底黑字
- 图片文件名作为命令行参数传入推理程序
- 除了输出预测数字外,还要输出其他数字的概率
产品化
1、增加web 界面
- 可在web界面用鼠标手写数字
- 点击预测,后台推理识别
- 在web界面上显示推理结果(识别到是哪个数字)
拍摄并识别
1、增加一个app,可用浏览器访问
- 显示接在开发板上的 USB 摄像头的画面
- 点击拍照,可以拍摄手写数字。
- 拍到的手写数字,也要显示在界面上。
- 点击预测,后台推理识别
- 在web界面上显示推理结果(识别到是哪个数字)
关机断电复位离开
实验结束后,请完成以下事项,再离开实验课。
-
关机断电
开发板要先关机、再断电。🚫 严谨开机状态直接断电(拔电源)!
✴️ 上次实验课后,发现有1个开发板无法启动。重新烧录镜像后解决。镜像损坏(大概率是文件系统损坏引起的),可能和 SD 卡质量相关,也可能是开机状态直接断电引起的。
-
归还实验器材,给实验室老师
- 开发板(每组1个)
- 开发板电源(每组1个)
- 网线(每组1个)
- USB摄像头(每桌共用1个)
- 借用的其他器材
-
椅子复位
- 每个桌子,配套 6 个椅子。请将椅子推到桌子下面。
- 西侧玻璃门,前中后靠墙,各 6 个。共 18 个。请按此数量靠墙摆放。
-
带齐随身物品
✅ 上述事项完成后,可离开实验室。
THE END