尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

树莓派Zero部署谷歌Teachable Machine模型:边缘AI实战指南

树莓派Zero部署谷歌Teachable Machine模型:边缘AI实战指南 1. 项目概述当树莓派Zero遇上谷歌Teachable Machine最近在捣鼓一个挺有意思的小项目在树莓派Zero上跑谷歌的Teachable Machine。这听起来可能有点“小马拉大车”的感觉毕竟树莓派Zero的性能和资源都相当有限而Teachable Machine作为谷歌推出的一个在线机器学习模型训练工具通常给人的印象是在浏览器里点点鼠标就能训练出图像、声音或姿态识别模型。但把训练好的模型部署到Zero这块小小的板子上让它脱离云端、脱离强大的电脑在本地独立运行这背后的想法和实践对于想做嵌入式AI、边缘智能设备的朋友来说非常有吸引力。简单来说这个项目的核心就是将云端训练的轻量级机器学习模型部署到资源极度受限的嵌入式硬件树莓派Zero上实现离线、低功耗的实时推理。它能做什么比如你可以训练一个识别特定手势的模型让Zero控制一个玩具小车或者训练一个声音分类模型让Zero在听到特定关键词如“开灯”时做出反应甚至做一个简单的垃圾分类小装置。它特别适合那些对AI和物联网感兴趣想从“玩具级”项目入手深入理解模型训练、转换、优化和嵌入式部署全流程的开发者、创客和学生。为什么是树莓派Zero因为它便宜、功耗极低、体积小巧是很多微型嵌入式项目的首选。为什么是Teachable Machine因为它极大地降低了机器学习的入门门槛无需编写复杂的训练代码通过网页界面和摄像头/麦克风就能快速收集数据、训练模型。将两者结合正是探索“边缘AI”落地最直接、最有趣的路径之一。接下来我将详细拆解从模型训练、导出、转换到在Zero上部署运行的完整过程并分享其中踩过的坑和积累的经验。2. 核心思路与技术选型解析2.1 为什么选择Teachable Machine 树莓派Zero组合这个组合的核心优势在于极低的入门门槛与完整的流程体验。对于初学者或快速原型开发Teachable Machine解决了最头疼的数据标注和模型训练问题。你不需要安装TensorFlow或PyTorch不需要理解损失函数和优化器甚至不需要写一行训练代码。它的图形化界面让你能专注于“教”机器认识什么而不是“编”程序怎么学。而选择树莓派Zero作为部署平台则是对“边缘计算”概念的一次亲手实践。边缘计算强调在数据产生的源头就近处理减少对云端的依赖降低延迟、保护隐私、节省带宽。树莓派Zero作为一款售价仅数十元、功耗仅1W左右的微型计算机是验证边缘AI想法的绝佳沙盒。在这个项目里我们追求的不是极高的准确率或复杂的模型而是在严苛的资源限制单核CPU、512MB内存下让一个有用的AI功能跑起来。技术路径上Teachable Machine训练出的模型可以导出为多种格式其中对我们最有用的两种是TensorFlow.js模型和TensorFlow Lite模型。前者主要用于Web环境后者则是为移动和嵌入式设备设计的轻量级格式。我们的目标就是将模型最终转换为能在树莓派Zero上高效运行的TensorFlow Lite格式。2.2 关键挑战与应对策略在Zero上部署模型主要面临三大挑战性能瓶颈Zero的ARM11单核处理器主频仅1GHz性能孱弱。直接运行未经优化的模型推理速度可能慢到无法接受例如数秒一帧。内存限制512MB的共享内存需要同时承载操作系统、Python环境、运行时库和模型本身容易导致内存不足。模型兼容性Teachable Machine导出的模型需要经过正确的转换和优化才能与树莓派上的TensorFlow Lite运行时完美配合。应对策略如下模型轻量化优先使用Teachable Machine中结构简单的模型如MobileNetV2的轻量级变体并在导出时选择较小的输入尺寸如224x224甚至更小。格式转换与优化确保将模型转换为TensorFlow Lite格式并可能使用量化技术如INT8量化来减小模型体积、提升推理速度这对Zero至关重要。高效的代码实现在Python中使用tflite_runtime而非完整的TensorFlow包以节省资源和加速加载。同时优化图像预处理和结果后处理的代码逻辑。3. 从训练到部署完整实操流程3.1 第一步使用Teachable Machine训练模型首先访问Teachable Machine官网。我们以最常用的“图像项目”为例。收集数据为每个类别例如“有猫”、“无猫”采集样本。直接用电脑摄像头或上传图片均可。每个类别建议至少提供30-50个样本尽可能覆盖不同的角度、光照和背景以提高模型泛化能力。训练模型点击“训练模型”按钮。这里有一个关键选择训练时长。对于在Zero上部署我建议选择“标准”或“更少”的训练周期。过长的训练可能导致模型轻微过拟合且对最终在嵌入式设备上的精度提升有限反而可能增加模型复杂度。Teachable Machine底层使用的是迁移学习基于预训练网络如MobileNet进行微调因此训练很快。导出模型训练完成后进入“导出模型”页面。导出格式选择“TensorFlow Lite”。这是为嵌入式设备准备的格式。模型类型选择“量化”。量化会将模型权重从浮点数转换为整数能显著减小模型文件大小可缩减至1/4并加速推理这对树莓派Zero是必选项。精度可能会有微小损失但在大多数简单分类任务中可接受。下载点击“下载我的模型”。你会得到一个压缩包里面包含model.tflite和labels.txt文件。注意在训练时务必考虑树莓派Zero的实际使用场景。如果你最终用Zero的摄像头模块采集图像那么在Teachable Machine上收集数据时最好也用类似的摄像头并模拟相似的环境这样可以减少“领域差距”提升部署后的准确率。3.2 第二步准备树莓派Zero开发环境在将模型部署到Zero之前需要先准备好它的软件环境。由于Zero性能弱推荐使用轻量级的操作系统如Raspberry Pi OS Lite无桌面环境并通过SSH进行远程操作。系统安装与基础配置将Raspberry Pi OS Lite镜像刷入SD卡启动并完成基础设置地区、语言、网络等。建议启用SSH并配置Wi-Fi方便无头运行。安装必要软件包sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-pil python3-numpy libatlas-base-devpython3-pipPython包管理器。python3-pilPillow用于图像处理。python3-numpy科学计算库许多AI框架依赖它。libatlas-base-dev优化数学库能加速NumPy运算。安装TensorFlow Lite运行时不要安装完整的TensorFlow那对Zero来说太庞大。安装专门为嵌入式设备优化的tflite_runtime。pip3 install --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime这个索引源提供了针对ARM架构预编译的轮子安装更快更稳定。3.3 第三步模型部署与推理代码编写将下载的model.tflite和labels.txt文件上传到树莓派Zero上。然后我们编写一个Python脚本进行推理。这里以使用树莓派官方摄像头CSI接口为例。import tflite_runtime.interpreter as tflite from PIL import Image import numpy as np import picamera import time import io # 1. 加载标签 with open(labels.txt, r) as f: labels [line.strip() for line in f.readlines()] # 2. 加载TFLite模型并分配张量 interpreter tflite.Interpreter(model_pathmodel.tflite) interpreter.allocate_tensors() # 3. 获取输入输出详情 input_details interpreter.get_input_details() output_details interpreter.get_output_details() # 通常Teachable Machine导出的是浮点量化模型输入是uint8 height input_details[0][shape][1] width input_details[0][shape][2] # 4. 初始化摄像头 camera picamera.PiCamera() camera.resolution (width, height) # 设置摄像头分辨率与模型输入一致 camera.rotation 180 # 根据摄像头安装方向调整 time.sleep(2) # 让摄像头预热 def preprocess_image(image_data): 预处理图像转换为数组调整尺寸归一化如果需要 image Image.open(io.BytesIO(image_data)).convert(RGB) image image.resize((width, height)) # 对于量化模型输入通常是uint8无需归一化到0-1 input_array np.array(image, dtypenp.uint8) # 添加批次维度 (1, height, width, 3) input_array np.expand_dims(input_array, axis0) return input_array try: while True: # 捕获图像到内存流 stream io.BytesIO() camera.capture(stream, formatjpeg, use_video_portTrue) # use_video_port更快 stream.seek(0) # 预处理 input_data preprocess_image(stream.getvalue()) # 设置输入张量 interpreter.set_tensor(input_details[0][index], input_data) # 执行推理 start_time time.time() interpreter.invoke() inference_time time.time() - start_time # 获取输出 output_data interpreter.get_tensor(output_details[0][index]) # output_data形状通常是 (1, num_classes) predicted_class_idx np.argmax(output_data[0]) confidence output_data[0][predicted_class_idx] # 对于量化模型输出可能是整数需要根据模型详情解量化 # Teachable Machine导出的量化模型输出通常已经是近似的概率值 # 简单处理将整数输出除以255.0如果输出是0-255的整数或直接使用 # 更严谨的做法是检查output_details中的量化参数 scale, zero_point output_details[0][quantization] if scale: # 如果存在量化参数 confidence scale * (confidence - float(zero_point)) predicted_label labels[predicted_class_idx] print(f预测: {predicted_label}, 置信度: {confidence:.2f}, 推理时间: {inference_time:.3f}秒) time.sleep(1) # 控制推理频率 except KeyboardInterrupt: print(程序停止) finally: camera.close()代码关键点解析use_video_portTrue在picamera中这能利用视频端口进行捕获速度比静态捕获模式快很多对于实时推理至关重要。量化处理代码中包含了处理量化模型输出的逻辑。这是部署量化模型时最容易出错的地方。务必通过output_details检查输出的量化参数scale和zero_point并据此将整数输出转换回浮点数概率。Teachable Machine导出的模型通常已处理好但显式检查是良好习惯。输入数据类型通过input_details确认模型期望的输入数据类型dtype是uint8还是float32。我们的代码按uint8处理因为之前导出时选择了量化。3.4 第四步性能优化与实用化调整在Zero上直接运行上述代码你可能会发现推理速度在1-3秒左右这离“实时”还有差距。以下是几个优化方向降低输入分辨率重新在Teachable Machine中训练模型时尝试选择更小的输入尺寸如128x128。这是提升速度最有效的方法但可能会降低精度。模型量化确保导出时选择了“量化”选项。如果第一次没有需要重新导出。减少预处理开销PIL的resize操作可能较慢。可以尝试使用picamera的resize参数在捕获时直接生成小图或者使用OpenCV如果安装的cv2.resize但安装OpenCV在Zero上比较繁琐。调整推理频率如果不是每帧都需要可以降低推理频率比如每5秒或检测到画面有变化时才推理。使用Coral USB加速器如果预算允许这是一个为边缘设备设计的AI加速棒通过USB连接到树莓派Zero可以大幅提升TensorFlow Lite模型的推理速度数十倍提升。但这需要模型编译成适用于Coral的版本.tflite兼容但需特定编译且增加了成本。4. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到下面这些问题。这里是我的排查记录和解决方案。4.1 模型在电脑上测试正常在Zero上预测结果混乱现象推理能执行但输出的置信度都很低或者类别预测完全错误。排查检查输入预处理这是最常见的原因。对比电脑上测试时的预处理代码和Zero上的代码是否完全一致。重点关注颜色通道顺序RGB vs BGR、归一化范围0-255 vs 0-1、图像尺寸是否严格resize到模型输入大小。检查量化参数如果使用了量化模型必须正确处理输入输出的量化/反量化。使用input_details和output_details打印出量化参数确保代码中的处理逻辑正确。验证模型和标签再次确认上传到Zero的model.tflite和labels.txt文件是最新导出的且没有损坏。可以计算一下文件的MD5哈希值进行对比。解决我通常会在预处理函数中加入调试语句打印出输入数组的形状、数据类型和前几个像素值与在电脑上运行时的值进行比对。确保完全一致。4.2 运行脚本时出现内存不足Memory Error或卡死现象运行一段时间后程序崩溃或系统响应极其缓慢。排查检查内存使用在另一个SSH会话中运行free -h命令查看可用内存。树莓派Zero的512MB内存非常紧张。检查交换空间运行swapon --show和df -h查看交换分区是否启用以及空间是否充足。默认的Raspberry Pi OS可能会启用100MB的交换文件。解决增加交换空间这是最直接的方法。可以编辑/etc/dphys-swapfile文件将CONF_SWAPSIZE从100增加到512单位MB然后重启交换服务sudo systemctl restart dphys-swapfile。注意这会影响SD卡寿命因为频繁读写。优化代码释放资源确保在循环中及时释放大对象如大的图像数据流。使用del语句或确保变量离开作用域。关闭不必要的进程用sudo systemctl stop停止不需要的系统服务如蓝牙、桌面环境相关服务如果你用的是Lite版则已最小化。4.3 摄像头初始化失败或图像捕获异常现象picamera模块报错如“Camera is not enabled”或捕获的图像全黑/花屏。排查检查硬件连接确保CSI排线已正确插入摄像头模块已通过sudo raspi-config在接口选项中启用。检查摄像头独占访问确保没有其他程序如libcamera相关进程正在占用摄像头。可以尝试重启树莓派。检查供电树莓派Zero的供电要求是5V/1.2A以上。供电不足可能导致摄像头无法正常工作。使用质量好的电源和USB线。解决一个实用的技巧是在初始化摄像头后增加一个time.sleep(2)给摄像头传感器和自动对焦如果有足够的启动时间。对于picamera捕获静态图片时使用camera.capture()而用于视频流或连续捕获时使用camera.capture(..., use_video_portTrue)能获得更稳定的性能。4.4 推理速度太慢无法满足实时性要求现象每张图片推理时间超过2秒。排查与解决基准测试单独测试模型推理时间不包括图像捕获和预处理。在代码中只对一张静态图片反复进行interpreter.invoke()计算平均时间。这能确定瓶颈是模型本身还是IO/预处理。模型层面换用更小的模型在Teachable Machine中重新训练选择更小的输入尺寸和更轻量的基础网络如果有选项。确认量化模型必须是量化过的.tflite。代码层面使用tflite_runtime确保没有误装完整的tensorflow。预热在正式循环前先对一张虚拟图片执行一次allocate_tensors()和invoke()这能完成运行时的一些初始化使后续推理时间更稳定。减少操作如前述尝试优化图像读取和resize的流程。5. 项目扩展与进阶思路让模型在Zero上跑起来只是第一步。一个完整的项目通常需要将其集成到一个具体的应用场景中。5.1 与硬件交互从识别到控制假设我们做了一个“手势开关灯”的项目。当识别出“开灯”手势时控制GPIO引脚输出高电平驱动一个继电器模块打开台灯。import RPi.GPIO as GPIO # GPIO设置 LED_PIN 17 GPIO.setmode(GPIO.BCM) GPIO.setup(LED_PIN, GPIO.OUT) # 在主循环的推理结果判断部分加入 if predicted_label open_hand and confidence 0.8: # 置信度阈值 GPIO.output(LED_PIN, GPIO.HIGH) print(灯已打开) elif predicted_label fist and confidence 0.8: GPIO.output(LED_PIN, GPIO.LOW) print(灯已关闭)注意事项GPIO操作涉及硬件务必注意安全。添加适当的防抖逻辑例如连续识别到3次同一手势再触发动作避免因误识别导致设备频繁开关。5.2 模型更新与持续学习Teachable Machine训练好的模型是静态的。如果部署后发现了新的识别错误或者想增加新的类别传统做法是回到网页重新训练、导出、再部署。我们可以设计一个简单的机制让Zero在本地收集“困难样本”即低置信度或错误分类的图片并保存下来。定期将这些样本传回给主电脑用于在Teachable Machine上增量训练生成新模型后再更新到Zero。这就构成了一个简单的“边缘数据采集-中心模型优化”的闭环。5.3 探索其他传感器与模型类型Teachable Machine不仅支持图像还支持声音分类和姿态识别。声音项目可以训练一个关键词识别模型比如识别拍手声、口哨声或简单的语音命令。在Zero上部署时需要使用麦克风采集音频并按照模型要求的格式如MFCC特征进行预处理。这涉及到音频信号处理库如librosa但在Zero上安装可能较慢。姿态项目训练一个识别身体姿势如站立、坐下、举手的模型。这需要使用PoseNet等姿态估计算法对Zero的计算能力要求更高。可能需要使用Teachable Machine导出的TensorFlow.js模型并通过tfjs的Node版本在Zero上运行或者寻找更轻量级的TFLite姿态估计模型。在树莓派Zero这块小小的板子上成功运行自己训练的AI模型那种成就感是巨大的。它让你真切地触摸到“智能”从云端落到实体的过程。整个过程里最大的收获往往不是最终的识别准确率有多高而是在解决一个个具体问题中积累的经验如何为资源受限的环境优化模型如何调试跨平台的推理代码如何平衡速度与精度。这个项目就像一个微缩的实验室涵盖了边缘AI应用从数据到部署的完整链条。如果你也感兴趣不妨就从手头的一个小想法开始用Teachable Machine和树莓派Zero把它实现出来。
返回列表