【2024 DigiKey 创意大赛】”双光融合“智能热像仪第四部分:手写数字识别
# 【2024 DigiKey 创意大赛】”双光融合“智能热像仪第四部分:手写数字识别## 一、实现tensorflow的硬件说明
在前面的部分当中,我们已经实现了触摸屏的驱动,并将提供的openmv4升级为openmv4plus(官方数据:运行tensorflow-lite在OpenMV4 H7 Plus上面运行大概每秒45帧,在OpenMV4 H7上面运行大概每秒25帧左右,两者都是可以运行的),这都让我们在openmv上对较高性能的单片机运行神经网络做出更好的尝试。
## 二、tensorflow-lite介绍
TensorFlow Lite(TFLite)是 TensorFlow 团队推出的轻量级深度学习框架,专门为移动设备和嵌入式设备的机器学习推理进行优化。它支持在设备端(Edge)进行高效的推理操作,具有低延迟、低功耗、无需网络连接等特点。
### 1. **模型转换与优化**
TensorFlow Lite 提供了强大的工具来将标准 TensorFlow 模型转换为 TFLite 格式。转换后的模型体积更小,运行更高效,适合在资源受限的设备上运行。TFLite 支持以下几种优化技术:
- **量化(Quantization)**:通过降低模型权重的精度(例如,将浮点数转为 8 位整数),来减少模型大小和内存占用,同时加速推理速度。
- **修剪和剪枝(Pruning & Trimming)**:减少模型中不必要的参数,以降低模型复杂度和计算负担。
- **模型分片(Model Splitting)**:将模型分成多块,以适应更小内存的设备:contentReference{index=0}。
### 2. **多平台支持**
TensorFlow Lite 设计为多平台兼容,能够运行在多种设备上,包括:
- **Android 和 iOS 设备**:TFLite 提供了适用于 Java、Swift 和 Objective-C 的 SDK,使开发者能够在主流移动平台上集成机器学习功能。
- **嵌入式 Linux 设备**:例如树莓派等,可以运行基于 Linux 的 TFLite 推理引擎。
- **微控制器(Microcontrollers)**:如 Arduino、ESP32 等低功耗设备,这些设备在资源上非常有限,因此 TFLite 的微控制器版本经过极致优化,适合用于 IoT 设备:contentReference{index=1}:contentReference{index=2}。
### 3. **硬件加速**
TensorFlow Lite 支持硬件加速,以充分利用设备上的计算资源,实现更快的推理速度。这包括:
- **GPU 加速**:在支持的 Android 和 iOS 设备上,TFLite 能够调用 GPU 来处理计算密集型任务,适合计算机视觉等应用。
- **专用 AI 加速器**:例如,许多手机和嵌入式设备上配备的神经网络处理单元(NPU)或谷歌 Edge TPU,可以极大地加速机器学习推理。
- **多线程支持**:可以在多个 CPU 线程上运行模型,进一步提高计算效率:contentReference{index=3}。
### 4. **应用场景与性能分析**
TensorFlow Lite 特别适合需要实时推理、低延迟的应用场景,如:
- **计算机视觉**:如物体检测、人脸识别、图像分类等。
- **自然语言处理**:包括文本分类、情感分析、问答系统等。
- **语音处理**:如语音识别、关键词检测等。
参考文献:
- (https://www.tensorflow.org/lite)
- (https://blog.tensorflow.org)
## 三、tensorflow-lite的数据集训练
### 1. **数据集采集**
我所使用的触摸屏大小为2.4寸,分辨率为320*240。使用画图软件,将画布设置到相同的大小,白底黑字,使用鼠标写数字1~4各50张,如果可以的话,建议叫上你的朋友一起写~
### 2. **模型训练**
方法一:使用星瞳科技提供的云端训练平台来训练,无需配置环境,较为简单。
网站:https://ai.singtown.com/zh-hans/
方法二:使用openmv官方提供的ipynb脚本文件来训练,详情见附件
### 3. **训练结果导入并验证**
将训练好的trained.tflite,并复制到OpenMV的存储
直接使用摄像头识别的测试代码:
'''python
# This code run in OpenMV4 H7 or OpenMV4 H7 Plus
import sensor, image, time, os, tf
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240)) # Set 240x240 window.
sensor.skip_frames(time=2000) # Let the camera adjust.
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot().binary([(0,64)])
for obj in tf.classify("trained.tflite", img, min_scale=1.0, scale_mul=0.5, x_overlap=0.0, y_overlap=0.0):
output = obj.output()
number = output.index(max(output))
print(number)
print(clock.fps(), "fps")
'''
使用触摸屏输入的测试代码:
'''python
import sensor, image, time
import os, tf
from screen import screen
screen.init()
#创建用于绘图的画布,并填充黑色
img_drawing_board=sensor.alloc_extra_fb(320,240,sensor.GRAYSCALE)
img_drawing_board.draw_rectangle(0,0,320,240,fill=True,color=(255, 255, 255))
fps=0 #帧速变量
last_x=0 #上一次x坐标
last_y=0 #上一次y坐标
first_time_press=True #第一次按下(抬笔后线条不连续)
is_drawing = False
clock = time.clock() #声明时钟,用于获取帧速
while(1):
if screen.press: # 如果触屏被按下
if first_time_press: # 如果首次按下,绘制一个点
img_drawing_board.draw_line(screen.x, screen.y, screen.x, screen.y, color=(0, 0, 0), thickness=3)
last_x = screen.x# 记录本次坐标到‘上一次’变量
last_y = screen.y
first_time_press = False# 解除首次标识
is_drawing = True# 开始绘制
else: # 非首次按下,绘制连续线条
img_drawing_board.draw_line(screen.x, screen.y, last_x, last_y, color=(0, 0, 0), thickness=3)
last_x = screen.x# 记录本次坐标到‘上一次’变量
last_y = screen.y
elif is_drawing: # 如果之前正在绘制且现在不再按下
for obj in tf.classify("03.tflite", img_drawing_board, min_scale=1.0, scale_mul=0.5, x_overlap=0.0, y_overlap=0.0):
output = obj.output()
number = output.index(max(output))
print(number)
img_drawing_board.draw_rectangle(0,0,320,240,fill=True,color=(255, 255, 255))
first_time_press = True # 置首次标识为True,等待下一次绘制
is_drawing = False# 结束绘制状态
screen.display(img_drawing_board) #显示图像到屏幕,并获取触摸信息。不运行此函数,不会更新触屏信息。
'''
可以看到,终端中准确的识别出了我们写的数字,实验成功! <p>好厉害</p>
<p>这个和之前咱们做的AI活动数字识别是不是相似?</p>
wangerxian 发表于 2024-10-29 19:23
这个和之前咱们做的AI活动数字识别是不是相似?
<p>不好意思,没有了解过这个活动。<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan68.gif" width="48" /></p>
页:
[1]