树莓派手写数字识别:TensorFlow 与 OpenCV 实战部署
了解如何训练深度卷积神经网络识别手写数字,并利用树莓派摄像头、OpenCV 与 TensorFlow 在树莓派上实现实时部署。
项目概览
本项目将完整走通 AI 流水线:从数据准备、在笔记本上训练模型,到树莓派摄像头实时推理。技术栈包括用于图像处理的 Scikit-Learn 与 OpenCV 3.3,以及以 TensorFlow 为后端的 Keras 深度学习框架。
我们使用 MNIST 数据集——包含 60,000 张训练和 10,000 张测试的 28×28 像素灰度数字图像。树莓派摄像头捕获的图像经预处理后转为相同格式送入网络。
网络架构为标准卷积堆叠加全连接输出层,输出层包含 10 个神经元分别对应 0–9 十个数字。
模型训练完成后,将权重传输至树莓派。轻量级 Python 脚本捕获帧、灰度化、阈值化、缩放、反色,最后执行推理。
硬件搭建
演示中我用简易手持支架固定 Pi Camera 对准单个数字。实际部署建议使用固定支架或小型外壳以提升稳定性。
软件安装
在树莓派上创建 Python 虚拟环境并安装依赖库。以下命令假设已安装 Raspberry Pi OS 且 Python 版本 ≥ 3.7。
source ~/.profile
workon cv
python PiCameraApp.py --picamera 1
安装 TensorFlow
pip install tensorflow
安装 Keras
pip install keras
安装 OpenCV 3.3
OpenCV 需从源码编译以在树莓派上启用全部优化。详细步骤请参考 PyImageSearch 教程。
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/
最后安装带 NumPy 优化的 PiCamera 库:
pip install "picamera[array]"
模型训练
在笔记本(建议配备 GPU)上运行训练脚本。脚本在 Keras 中定义 CNN、编译、在 MNIST 上训练、验证性能,并将权重保存为 model_weights.h5。
python Train_MNIST.py
若有 NVIDIA GPU,安装 GPU 版 TensorFlow 与 CUDA 驱动可大幅加速训练;纯 CPU 也能完成,只是耗时更长。
训练完成后,通过 scp 或 WinSCP 将 model_weights.h5 传至树莓派。
实时数字识别
在树莓派上启动识别脚本。按 t 捕获帧,按 q 退出。识别准确率主要取决于光照、角度和书写清晰度。在清晰、高对比度数字上通常可达 95% 以上。
图像预处理流水线
- 捕获 RGB 帧为 NumPy 数组。
- 转灰度(丢弃两个颜色通道)。
- 像素值缩放为 8 位无符号整数(0–255)。
- 应用大津阈值获取干净的黑白图像。
- 缩放至 28×28 像素——匹配 MNIST 输入形状。
- 反色使数字为白底黑字,与训练数据一致。
- 展平图像并送入已加载模型。
模型输出长度为 10 的概率向量,概率最高的索引即为预测数字。
核心要点
本例演示了数据准备、模型训练、部署、单板推理的完整端到端工作流。代码已开源于 GitHub,欢迎实验与扩展。
参考资料
来源: PiCamera AI 数字识别
制造工艺
- 树莓派2上使用DS18B20读取温度完整指南
- 树莓派结合 Maxim 1-Wire 传感器与 DS2482 I2C 桥接器的多点温度测量
- 树莓派精准监测机柜温度:DS18B20 多点部署实战
- Posture Pal:Walabot 实时距离监测,预防颈背疼痛
- TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
- 树莓派自平衡Segway搭建全攻略
- 在树莓派 3 上扩展 GoPiGo v2 的 Windows 10 IoT Core 应用
- Acceed IGS-9822DGP:12 口千兆交换机含 4 个 SFP 口——高性能工业网络解决方案
- AAEON 与 Intel 联合交付 FWS-8600:40 核 2U 网络设备,400 Gbps 吞吐量
- Lanner 采用第二代 Intel Xeon Scalable 处理器强化网络设备
- 以IoT网络方案应对城市洪涝
- 无线网络设备公司携手Sigfox 部署全英物联网络