
把一台树莓派5塞进生产车间跑自己训练的YOLOv5模型听起来是个很酷的落地Demo真干起来才知道这活儿比配一台普通Linux服务器麻烦得多。车间里有粉尘、电压波动、没有标准网络环境设备还得被产线节拍追着跑。前前后后折腾了半个多月从给树莓派5安装Ubuntu系统、部署YOLOv5推理程序到解决供电和散热我数了一下真正卡住进度的始终是六件事。这篇文章就把这六件事挨个拆开讲顺带把我的部署方案和踩坑记录都贴出来。如果你也想用树莓派5做车间视觉检测这份内容可以直接当落地参考。1. 为什么选树莓派5进车间这笔账要这么算1.1 车间场景需要什么设备车间边缘计算设备和实验室玩具最大的区别在于它要同时满足四个条件算力够用、接口齐全、环境耐受、出了问题现场能修。树莓派5在这四点上恰好踩中了一个黄金平衡点。树莓派5的核心配置是四核Arm Cortex-A76处理器主频跑到2.4GHz内存有8GB版本可选。这个算力水平不是用来和服务器比的而是验证一句话YOLOv5s这类轻量级检测模型在它身上能跑起来、能连续跑还能留出余量做采集和通信。实测下来配合量化优化能达到产线可用的检测节奏这一点在选型阶段必须想清楚。接口方面树莓派5有双USB 3.0、双CSI摄像头接口、千兆网口还带一路PCIe 2.0接口可以扩展NVMe SSD。对车间视觉应用来说这意味着可以同时接一路全局快门CSI摄像头和一路USB工业相机数据走千兆有线网回传模型日志落在本机SSD上基本不用外接乱七八糟的转换线。1.2 和Jetson、x86工控机比一下选型阶段我认真比较过Jetson Orin Nano、x86工控机和树莓派5各有各的取舍这里直接列一张对比表设备类型算力表现软件开发效率功耗与散热价格与供货适合场景树莓派5YOLOv5s可跑量化后可用生态成熟Debian/Ubuntu通用峰值约12W需要主动散热裸板几百元容易买到中小批量视觉检测、原型验证Jetson Orin Nano算力强很多TensorRT成熟需要CUDA生态入门门槛高功耗高风扇噪音不小贵约三倍以上高性能多路检测、复杂模型x86工控机取决于CPU/GPU上限高兼容性最好驱动好找体积大功耗几十瓦起看配置中高端不便宜大算力、传统上位机集成我的结论是如果跑的是自己训练的YOLOv5不是那种几百层的超大模型树莓派5在能力、成本和可维护性之间是最平衡的。Jetson强在GPU加速但你会被TensorRT的版本兼容问题缠住x86工控机省心但不是所有产线都愿意塞一个庞然大物进去。树莓派5更像一个“能自己装进铁盒子里的微型工控机”前提是你愿意在底层配置上下点功夫。2. 树莓派5安装Ubuntu第一步就把系统底盘打好2.1 系统镜像选择Ubuntu还是Raspberry Pi OS树莓派5安装Ubuntu是热搜词也是很多人第一次上手的卡点。树莓派5能跑的系统很多但真正适合车间的就两条路线Ubuntu Server 24.04 LTS和Raspberry Pi OS基于Debian trixie。我最终选择了Ubuntu Server 24.04 LTS作为主力系统原因很简单LTS版本有五年维护周期arm64软件生态非常成熟Docker、ONNX Runtime、NCNN这些推理组件在Ubuntu上的安装体验最顺。如果你只跑纯CPU推理不依赖树莓派底层的GPU和摄像头硬件加速Ubuntu Server是最省心的选择。Raspberry Pi OS同样值得考虑它内置了树莓派硬件相关的firmware对CSI摄像头、硬件编解码、Vulkan驱动的支持更完整。但它的软件包更新节奏偏保守在某些第三方AI库的兼容性上需要多花时间。镜像写盘工具我推荐直接用Raspberry Pi Imager不要用手工dd。Imager能自动识别树莓派5型号写入时直接设置好用户名、密码和Wi-Fi第一次开机就能SSH连进去省掉外接显示器的麻烦。2.2 启动存储SD卡在车间撑不了太久如果说哪个部件在车间坏得最快SD卡绝对排第一。产线附近有振动、电压波动、突然断电SD卡在这种环境下的寿命会被急剧缩短。树莓派5支持从U盘和PCIe SSD启动这对我来说不是可选项而是必须项。最简单的替代方案是准备一块USB 3.0固态U盘速度和稳定性都比SD卡强一个量级。树莓派5的双USB 3.0口完全带得动安装系统时直接用Imager把Ubuntu镜像写到U盘里然后设置树莓派的Boot Order为USB优先即可。如果手头有NVMe SSD和PCIe扩展卡也可以走PCIe启动性能最好但发热和装配复杂度会上升车间环境反而不一定合适。我的建议是先上USB固态U盘把SD卡槽留给调试场景用。还有一个被很多人忽略的操作系统装好后把根文件系统挂载为只读日志和临时文件放到tmpfs内存盘里。这样即使突然断电文件系统也不会产生大量写入损坏。对树莓派5这种不带硬件RAID的小设备来说这招能直接避免很多莫名的启动失败。2.3 开机自启与底层恢复让板子“自己救自己”设备进了车间不可能每次断电或者死机都派人去现场按电源。所以系统装好后我做的第一件事不是部署模型而是把底层恢复机制铺好。推理程序一定用systemd托管不要用rc.local或者什么后台脚本加nohup。一个稳定的服务单元长这样[Unit] DescriptionYOLOv5 Detection Service Afternetwork-online.target [Service] Typesimple ExecStart/home/pi/venv/bin/python /home/pi/server.py Restartalways RestartSec5 Userpi EnvironmentOMP_NUM_THREADS4 [Install] WantedBymulti-user.target重点在Restartalways和RestartSec5程序崩了系统自动拉起来还能避免因为崩溃循环导致CPU满转。内核层面再加一道保险。在/boot/firmware/cmdline.txt的内核参数末尾加上systemd.watchdog10同时设置kernel.panic10。树莓派5的硬件看门狗会把僵死的系统在十几秒内强制重启这个机制在无人值守场景里救过我很多次。3. 把自己训练的YOLOv5模型搬到树莓派53.1 从PyTorch到ONNX导出细节决定成败很多人在PC上训练YOLOv5模型很顺利一到树莓派5上就傻眼问题八成出在模型导出的细节上。PyTorch模型不能直接在树莓派5上跑至少要先导出成ONNX格式这一步有四个关键点必须管住。固定batch size。导出时设置--batch 1这样ONNX模型的输入维度就是[1, 3, H, W]避免动态batch导致板端推理框架解析出错。固定输入尺寸也一样重要YOLOv5默认是640如果后续要在板端降到416推理训练时就按416训练或者导出后用简化工具处理不要跑到一半再改shape。opset版本要保守。官方默认导出有时会用较高的opset树莓派5的ONNX Runtime版本不一定全部支持。我实际用的命令是python export.py --weights best.pt --include onnx --opset 12 --batch 1opset控制在12以内向下兼容性最好。导出完再用onnx-simplifier过一遍python -m onnxsim best.onnx best_sim.onnx简化操作会把一些冗余节点合并体积变小板端推理时也能省一点时间。这一步虽然不起眼但实测能提升10%左右的加载和推理效率。3.2 板端选哪种推理后端模型到了树莓派5上推理后端的选择直接影响最终帧率。我实际对比过三条路线OpenCV DNN最省事Python环境里一个cv2.dnn.readNetFromONNX就能加载但它的问题在于优化有限适合验证模型能不能跑通不适合做产线长期跑。ONNX Runtime是主力选择CPU ExecutionProvider在ARM64上有专属优化支持线程数设置还能配合INT8量化。如果你的模型本身就是自己训练的优先走ONNX Runtime。NCNN和MNN则是极端性能导向的路线。NCNN对ARM平台做了深度适配MNN还支持Vulkan后端理论上能把一部分算子丢给树莓派5的VideoCore VII GPU处理。我实测下来Vulkan加速没有想象中那么神部分算子切到GPU后传输开销反而更大反而是MNN的CPU路径配合INT8量化最稳定。这里有一个新手常见误区TensorRT在树莓派上用不了因为TensorRT是NVIDIA生态的专属工具。树莓派没有NVIDIA GPU别在这上面浪费时间。3.3 一份能直接跑的推理程序骨架板端推理程序的核心逻辑几乎都是三段式加载模型、图像预处理、推理后处理。预处理里的letterbox是关键直接决定检测准确率。给一个最小骨架import cv2 import numpy as np import onnxruntime as ort session ort.InferenceSession( best_sim.onnx, providers[CPUExecutionProvider] ) session.set_providers( [CPUExecutionProvider], [{arena_extend_strategy: kSameAsRequested}] ) def letterbox(img, size(640, 640)): h, w img.shape[:2] scale min(size[0] / h, size[1] / w) nh, nw int(h * scale), int(w * scale) resized cv2.resize(img, (nw, nh)) canvas np.full((size[0], size[1], 3), 114, dtypenp.uint8) canvas[:nh, :nw] resized return canvas, scale def infer(img): input_tensor, _ letterbox(img) input_tensor cv2.cvtColor(input_tensor, cv2.COLOR_BGR2RGB) input_tensor input_tensor.astype(np.float32) / 255.0 input_tensor np.transpose(input_tensor, (2, 0, 1))[None] outputs session.run(None, {session.get_inputs()[0].name: input_tensor}) return outputs cap cv2.VideoCapture(0) while True: ok, frame cap.read() if not ok: break results infer(frame) # 后处理按照YOLOv5输出格式解析boxes、scores、class_ids在树莓派5上跑这个骨架YOLOv5s模型640输入在FP32下大概只有1.5FPS左右这个数字只能证明模型跑通了离产线可用还差很远。性能优化放到下一章的第四件事里详细说。4. 树莓派5进车间卡在六件事上4.1 第一件事供电不稳凌晨三点它自己重启树莓派5对供电的要求比前代高很多官方推荐5V/5A的PD电源峰值功耗能到12W左右。在车间里你不能指望插座旁边正好有一个稳定的稳压适配器。我遇到过最诡异的情况是设备凌晨三点自动重启查了系统日志才发现是瞬时电压跌落触发了欠压保护树莓派直接给自己断电重启。解决办法分三步走。第一步放弃消费级线性电源改用工业级DC-DC转换模块输入取车间设备侧的24V直流输出5V稳定给树莓派这样能和产线共用电源系统还能避免家庭适配器长期满载发热。第二步给系统加上自动恢复机制前面提到的kernel.panic10和systemdRestartalways就发挥作用了。第三步如果有条件加一个小型UPS模块不用太大能撑过几秒的断电波动就行这样树莓派不会因为一个电压毛刺就重启。4.2 第二件事没有合适的散热降频比宕机更坑树莓派5的A76处理器性能上来了发热也上来了。没有加装散热片和风扇的情况下全负荷跑YOLOv5推理CPU温度很快会逼近85度然后触发降频保护。降频的可怕之处在于它不是直接卡死而是把主频从2.4GHz慢慢降到1.5GHz以下检测帧率肉眼可见地往下掉你甚至不知道系统是什么时候开始变慢的。解决思路不能只追求低温度还要兼顾车间的粉尘环境。主动风扇散热效果好但小风扇进灰之后噪音变大、转速降低反而更麻烦。我最后采用的是金属外壳加导热硅脂垫做被动散热再配一个低速滚珠轴承风扇温度长期稳定在65度左右。日常监控不可少。板端部署一个定时脚本每十秒读取一次vcgencmd measure_temp超过75度就把检测任务降频处理或者干脆重启推理服务保证产线不会在高温下持续误检漏检。4.3 第三件事摄像头采集的坑比模型部署还多模型终于能跑了结果摄像头采集又出问题。USB工业相机在ARM64 Linux下的驱动兼容性参差不齐很多厂商只提供x86的SDKARM64要自己编译或者干脆没有。CSI摄像头倒是系统原生支持但树莓派5的双CSI接口对线缆长度和布线很敏感车间现场走线稍微远一点就会出现花屏或者频繁断流。我的建议是优先用CSI全局快门摄像头它的曝光控制比USB摄像头强得多拍快速运动的目标不会糊。树莓派5的libcamera框架对CSI摄像头支持最完善一条libcamera-still -o test.jpg就能快速验证。如果必须用USB工业相机一定在买之前确认厂商有没有ARM64 Linux SDK不要只看PC上的Windows Demo。采集程序里设置缓冲区数量通常至少四到八个缓冲否则拍摄速度一上来就会丢帧。4.4 第四件事模型跑起来了但检测速度不够产线用这是最扎心的一环FP32模型在树莓派5上只有1.5FPS距离产线要求的五到八帧差距很大。优化路径我按效果排序走下来操作顺序也很重要。先降低输入尺寸。把YOLOv5推理输入从640降到416检测精度下降不明显但推理时间能缩短将近一半。如果目标很小降到320也不是不行但漏检率会明显上升需要现场调。再考虑INT8量化。模型量化是树莓派5 CPU推理提升最大的手段做法是先把PyTorch模型导出为ONNX再用ONNX Runtime的量化工具或者NCNN的量化工具拿一批现场图片做校准集把权重从FP32压到INT8。实测下来YOLOv5s在416分辨率下INT8推理能到七到八FPS基本满足一些中低节拍的产线。操作系统的线程配置也要配合。ONNX Runtime的SetIntraOpNumThreads设置为4不要开八线程十六线程树莓派5只有四个核心线程过多反而会增加切换开销。程序运行时用taskset绑定CPU核心能有额外两三个百分点的提升。4.5 第五件事断网之后设备直接“失忆”产线网络大概率没有机房那么干净断网是常态。树莓派5的推理结果如果全部依赖实时上传网络一断后端系统就收不到数据整条线都会被连累。我的做法是让设备具备“断网缓存”能力。推理结果先写入本地SQLite数据库程序同时维护一个网络心跳状态在线时实时通过MQTT上报断网时继续往本地库写等网络恢复再把缓存数据补传。这个逻辑听起来简单但必须处理两个细节缓存文件不能无限膨胀超过一定条数就覆盖旧数据时间戳必须用本地系统时间加设备ID标记防止补传时数据错乱。网络策略上树莓派5的千兆有线网口一定比Wi-Fi可靠。车间里金属设备多Wi-Fi信号衰减严重而且工业路由器的信道干扰很难控制。能走有线就走有线实在要走Wi-Fi至少把电源管理里的Wi-Fi省电模式关掉否则传输延迟会间歇性飙高。4.6 第六件事远程把新模型推上去太难车间设备最怕改动尤其是远程更新模型。一开始我直接scp覆盖ONNX模型文件结果有一次传输中断模型文件损坏板端推理服务直接崩溃现场停了十分钟。这种事故多出几次操作工都不敢让你远程操作了。稳定方案是给模型文件设计版本目录每次更新新模型都写入新目录然后通过软链接切换。程序启动时读取软链接指向的模型路径更新时先传完整文件再用校验工具比对md5校验通过后才切换软链接最后重启推理服务。这个机制能在十秒内完成切换而且失败也不影响旧模型继续跑。还有一个小技巧树莓派5上保持一个额外的启动脚本远程更新时不要直接修改正在运行的程序文件而是把更新脚本放到临时目录执行。防止程序文件被占导致段错误这个坑我在初期踩过不止一次。5. 现场排查实录与速查表5.1 三个现场故障复盘第一个故障是凌晨三点重启循环。现象树莓派5每隔二十多分钟重启一次没有任何规律。排查journalctl -b看上次启动日志发现大量voltage low警告最终定位是车间该路插座电压波动。解决方式就是改成DC-DC工业电源模块之后一个月内再没出现过。第二个故障是摄像头图像花屏。现象连续运行几个小时后CSI摄像头画面出现条纹和丢帧。排查dmesg里有大量CSI-2错误。原因是风扇积灰导致散热下降摄像头排线附近温度过高接口信号不稳定。清灰并调整排线走位后恢复正常。第三个故障是模型更新后漏检率突变。现象换成新训练的模型文件后检测框位置正确但置信度普遍低大量目标漏检。排查发现新模型是用640分辨率训练的而板端的letterbox预处理器一直按416跑模型没见过这个尺度的特征。重新按416导出模型后问题消失。5.2 排查速查表与常用命令现象最可能原因优先级解决方案经常重启供电电压不足高换工业DC-DC电源CPU降频变慢散热不良高加散热片和风扇看温度摄像头花屏CSI排线干扰/过热高重走线清灰推理特别慢没做量化/线程配置错误中INT8量化调线程数断网丢数据没有本地缓存中加SQLite缓存和MQTT补传模型更新后崩溃文件损坏低软链接切换md5校验现场最常用到的命令也就这几个记住它们能快速定位大部分问题# 系统与硬件状态 vcgencmd measure_temp vcgencmd measure_volts dmesg | grep -i error # 服务与日志 systemctl status yolov5.service journalctl -u yolov5.service -f # 存储与网络 df -h ip addr show eth0 ping -c 4 192.168.1.100分享一点个人体会这六个问题没有一个是高深技术全是底层的现场工程问题。树莓派5的计算能力决定了它适合跑轻量级YOLOv5而能不能长期稳定跑下去取决于你有多认真对待供电、散热、存储、网络和运维这些看似不起眼的环节。最后再补一句经验模型部署进去之后不要急着改程序。先让它在现场无干预跑三天记录温度曲线、帧率波动、日志大小、网络断连次数。根据这些数据再去调参比拍脑袋调代码有用得多。树莓派5进车间这件事本质上是把一个开发板重新教育成工业设备的过程教育的顺序对了它就能变成一个还算靠谱的边缘检测节点。