做工业视觉这些年我一直是 x86 平台的忠实用户。工控机、迷你主机、二手工作站都试了个遍直到前阵子接了一个车间改造的小项目才真正把树莓派 5 塞进了生产现场。先说背景客户那边需要给一台热压机加装一个物料到位检测装置要求低成本、本地推理、不依赖云端。我看了一眼现场环境再瞄了一眼预算单决定试试树莓派 5 跑 YOLOv5。说实话刚拿到手的时候信心满满心想这好歹是 8GB 内存的四核 A76跑个轻量级检测模型还不是洒洒水。结果真进了车间从刷系统到稳定运行前后卡了六件事每一件都让我记忆深刻。这篇就聊聊我在实际部署过程中踩过的坑和最终的解决办法给想在小钢炮上跑 YOLOv5 的朋友一些参考。1. 树莓派 5 的选购与装机准备1.1 版本选择和散热方案的权衡树莓派 5 的 CPU 性能确实比 4B 强了一大截主频最高能到 2.4GHz而且是四核 A76 架构IPC 提升明显。但性能上来了发热问题也一并跟着来了。我之前在 4B 上用的是那种小铝鳍片加风扇的方案跑个分类任务倒还压得住。但到了 5 代这招不灵了。用官方系统跑个压力测试不到五分钟温度就直接顶到 85 度频率咔咔往下掉推理速度也跟着掉了一半还多。注意树莓派 5 最大的散热坑在于 SoC 封装位置和 4B 不一样传统的树莓派 4B 散热片尤其那种居中设计的装上以后贴合度很差导热效果大打折扣。我最终换成了带热管的大面积散热器风扇转速调到 60% 恒定运行温度稳定在 55 度上下。如果你打算长期在车间环境跑推理散热这块千万别省钱。1.2 电源适配器的隐藏标准树莓派 5 改用 PCIe 接口供电当然实际是通过 USB-C 口输入官方要求 5V/5A 的电源。我之前偷懒直接用了手头 4B 的 5V/3A 电源结果开机就提示欠压系统频繁降频SSD 偶尔还会掉盘。这里解释一下为什么 5A 这么重要树莓派 5 在高负载下峰值电流能飙到 4A 以上如果电源余量不足电压跌落导致欠压保护后果就是外设随机失灵。SSD、摄像头、继电器模块全部跟着遭殃。经验之谈给树莓派 5 配电源时别只看标称电流尽量选线损小的线材USB-C 线越短越好我用的是 0.5 米的短线比 1 米的稳定不少。2. 系统安装从 Ubuntu 到树莓派 OS 的选择2.1 安装 Ubuntu 的诱惑与陷阱很多人一上来就想着给树莓派 5 装 Ubuntu我一开始也是这个思路。毕竟网上关于 Ubuntu 的教程多遇到问题好搜而且心理上觉得 Ubuntu “更专业”。实际装的是 Ubuntu Server 24.04装完以后发现几个问题树莓派 5 的 PCIe SSD 支持在 Ubuntu 下需要额外配置 bootloader否则启动引导会从 SD 卡找。GPU 驱动V3D的 OpenGL 支持不如树莓派 OS 成熟某些依赖 OpenGL 的视觉库会出现渲染异常。硬件编解码器HEVC 解码的驱动在 Ubuntu 下不如官方系统完善虽然我们用不到视频流解码但这表明整体适配度有差距。我折腾了一个下午以后果断换回树莓派 OSBookworm64位。事实证明在树莓派上跑视觉应用官方系统的底层支持更稳妥。2.2 系统烧录时的网络配置技巧烧录系统时有个容易被忽略的细节树莓派 OS 镜像工具可以在烧录前就预设 WiFi 和 SSH 配置这比开机以后再去接显示器配置方便多了。但如果你的车间现场没有 WiFi只有网线口那就要注意树莓派 5 的板载网口是千兆的插上网线以后默认走 DHCP。如果你现场的交换机没有 DHCP 服务就需要在cmdline.txt里手动配置静态 IP否则系统起不来你也不知道它到底跑没跑起来。我当时用的是最土的办法先在家里的路由器下把系统配好把静态 IP 写死在/etc/dhcpcd.conf然后拿到车间插网线直接就能 SSH 进去。这个步骤花费不到五分钟但给我省了后续两天的麻烦。3. 构建 Python 环境的宝藏与天坑3.1 Python 版本和虚拟环境的兼容性问题树莓派 OS 2024 年后的版本默认 Python 是 3.11Bookworm 带的是 3.9 和 3.11 并存这对跑 YOLOv5 来说是个好消息因为 YOLOv5 官方要求 Python 3.8。但天坑在于 Bookworm 系统默认启用了externally-managed-environment机制直接pip install会被系统拦截报一个“externally-managed-environment”的错误。很多新手这步就卡住了。我的解决方案是直接建虚拟环境python3 -m venv yolov5_env source yolov5_env/bin/activate pip install --upgrade pip然后所有依赖全装在虚拟环境里面日后哪怕系统 Python 环境被搞崩了也不影响项目的正常运行。3.2 换源问题别全盘照抄 PyPI 源国内部署 Python 环境换 PyPI 源是常规操作。但 YOLOv5 的requirements.txt里有几个包比如torch、torchvision在 PyPI 镜像源下的版本是专门为 ARM 架构编译的 wheel 包。如果你用阿里云的 PyPI 源需要确认是否支持linux_aarch64平台的 torch wheel。实测下来清华源对 ARM 的 torch 支持比较好可以直接下载预编译版本不需要现场编译。pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu重要PyTorch 官方对树莓派 5 的 CPU 推理支持非常完善--index-url直接指向官方 CPU 版 wheel 仓库即可。千万别用默认源否则会触发在树莓派上编译 PyTorch 的绝望流程编译几个小时以后报错你是真的会想砸东西。4. 部署 YOLOv5从 PC 到 ARM 的模型迁移4.1 模型导出和精度损失我的办公电脑上训练好的 YOLOv5s 模型.pt格式直接搬到树莓派上跑理论上没问题。但实际运行推理的时候发现检测框有少量偏移精度明显下降。排查了半天发现原因是训练时用的是 GPU 版本的 PyTorchCUDNN backends模型在推理时启用了半精度FP16。而树莓派是 CPU 推理ARM 平台上某些算子对 FP16 的支持不好导致计算精度变化。解决办法很简单导出模型时强制使用 FP32并且用torch.jit的 traced 模型进行部署。model.model[-1].export True model.eval() dummy_input torch.zeros(1, 3, 640, 640) traced_model torch.jit.trace(model, dummy_input) traced_model.save(best_fp32.pt)这样转换出来的模型在树莓派上跑精度和 GPU 推理基本对齐。4.2 模型剪枝和尺寸优化YOLOv5s 的参数量大概在 7.2M权重文件 14MB 左右。看起来不大但推理延迟在树莓派 5 上仍然偏高——实测 640x640 输入单帧推理时间在 1.8 秒到 2.1 秒之间。如果是静态场景检测比如我这个工位物料到位检测2 秒一帧也能用。但如果场景需要更实时就要考虑轻量化模型比如 YOLOv5n参数量只有 1.9M推理速度能提到 0.8 秒左右。我最终选的是折中方案保留 YOLOv5s但把输入尺寸从 640 降到 416。检测精度依旧满足需求推理速度提升到 1.2 秒一帧。4.3 使用 NCNN 前传框架如果觉得 YOLOv5 原生 PyTorch 部署在树莓派上太慢可以考虑用 NCNN 进行推理加速。NCNN 是腾讯开源的神经网络前向计算框架专门针对移动端和嵌入式平台做了优化对 ARM 平台的支持相当到位。我的尝试结果是同样一个模型NCNN 的推理速度比 PyTorch 原生快 2 倍左右取决于量化程度。NCNN 部署的难点在于模型转换需要先.pt→.onnx→.param/.bin中间偶发算子不支持的问题但好在 YOLOv5 的算子相对简单转换起来比较顺利。5. 摄像头接入与数据流5.1 USB 摄像头还是 CSI 摄像头我的建议车间环境复杂一开始我直接用了一个普通的 USB 摄像头以为插上就能用。事实上也确实能用但有几个问题USB 摄像头在树莓派 5 上默认走 UVC 协议CPU 占用偏高。帧率不稳定尤其在高分辨率模式下偶尔掉帧。车间里有电焊机等大功率设备USB 线容易受电磁干扰画面出现水波纹。后来换了 CSI 接口的树莓派官方摄像头模块Camera Module 3情况改善很多CSI 接口走专用数据通道不占 USB 控制器带宽。树莓派 OS 对 CSI 摄像头的底层支持非常完善画质和帧率都更稳定。支持自动对焦调试方便很多。5.2 图像采集参数设置无论用哪种摄像头都需要在代码里设定合理的采集参数。这里给出一个参考配置import cv2 cap cv2.VideoCapture(0, cv2.CAP_V4L2) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 20) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) # 其他参数 cap.set(cv2.CAP_PROP_BRIGHTNESS, 128) cap.set(cv2.CAP_PROP_CONTRAST, 128) cap.set(cv2.CAP_PROP_SATURATION, 128) cap.set(cv2.CAP_PROP_GAIN, 0)注意BUFFERSIZE设置为 1这很关键。默认的缓冲区会积压好几帧导致你取到的图像是几百毫秒前的对于实时检测任务来说就是灾难。6. 图像预处理与推理流水线的打磨6.1 图像格式转换的性能瓶颈YOLOv5 要求输入是 RGB 格式、归一化到 0~1 区间的 Tensor。但 OpenCV 默认读出来是 BGR且取值范围是 0~255。如果直接对每一帧都做这些转换会白白消耗 CPU 算力。我的做法是提前把 YOLOv5 的预处理步骤集成到推理代码里用torchvision.transforms处理。减少图像数据在 Python 层和底层之间的拷贝次数。更极致一点直接用cap.read()读出的 numpy 数组转换为 torch tensor 后直接推理避免cv2.cvtColor和np.transpose的额外开销。img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1)) img_tensor torch.from_numpy(img).unsqueeze(0)这段代码放在循环外面做一次推理循环里只做 Tensor 和模型的交互性能提升还是很明显的。6.2 推理结果后处理和 IO 控制推理完成以后拿到的是检测框坐标、置信度和类别 ID。在车间场景里除了在画面上画框还需要把检测结果转成 IO 信号比如当检测到“物料到位”时输出一个高电平给 PLC 或者继电器。我用的方案是树莓派的 GPIO 控制。import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) # 物料到位信号 # 在推理循环内 if detections: GPIO.output(17, GPIO.HIGH) else: GPIO.output(17, GPIO.LOW)细节是GPIO 输出电平变化不能太快。如果一帧检测有物料、下一帧没有PLC 那边会接到一个抖动的信号。我的处理方式是加一个保持计数——连续三帧检测到才输出高电平连续三帧没检测到才拉低。这个简单的防抖逻辑在现场实际运行中非常有效。7. 长时间运行的稳定性和鲁棒性7.1 看门狗与自动重启车间设备要求 7x24 小时不间断运行树莓派虽然皮实但遇到电压波动或者系统死锁还是需要自动恢复机制。我给树莓派加了一个硬件看门狗基于树莓派 GPIO 实现的看门狗脚本用 systemd 服务监控推理进程和网络状态。如果进程崩溃或者网络失联超过指定秒数就自动重启树莓派或者至少重启 Python 服务。sudo apt install watchdog sudo systemctl enable watchdog在/etc/watchdog.conf里配置监控的服务名称和 GPIO 引脚实测下来基本能保证系统“跑不死”。7.2 日志记录和远程监控现场调试的一大痛点是不能随时过去看屏幕。我加了一个简单的主循环日志系统推理日志写到/var/log/yolo_detect.log用logging模块的RotatingFileHandler做日志轮转避免日志文件无限膨胀。如果检测到连续 30 帧都没有任何识别结果往日志里写入告警级信息方便远程排查是画面模糊、摄像头掉线还是模型失效。再配合 SSH 远程登录大部分问题都能在办公室就解决。8. 现场部署和维护的几个补充建议8.1 供电和接地车间里电焊机、大电机、变频器全开的时候电网质量非常恶劣。我之前在实验室跑得好好的 PCIe SSD到了车间连续两次出现文件系统损坏后来排查发现是供电瞬时跌落导致的掉盘。解决方案树莓派 5 的电源接线不要从普通插座取电改成从工业开关电源明纬等单独拉一路直流供电。给电源加个 EMI 滤波器。在树莓派的 USB-C 口前加一个防反接和过压保护的电路模块。这一套加完供电环节再没出过问题。8.2 散热和防尘车间环境粉尘普遍比较重。树莓派 5 的风扇用了不到一个月叶片上就糊了一层灰风量明显下降。建议风扇进风口加一层过滤棉或者直接用防尘网把整个板子罩住。每两周做一次清灰。如果条件允许把树莓派装进带散热孔的金属接线盒里既防尘又防电磁干扰。9. 最终调参和效果对比最后给一张我在现场实测的数据表环境温度 28 度树莓派 5 8GBCSI 摄像头YOLOv5s输入 416x416项目实测数据单帧预处理耗时35ms 到 45ms单帧推理耗时700ms 到 1100ms单帧后处理耗时2ms 到 5ms整帧流水线耗时约 1.2 秒CPU 平均占用80% 到 90%核心温度55 度到 62 度检测精度mAP0.50.89相比 GPU 端下降 2%说实话这个性能不算亮眼但足够满足车间物料检测的节拍需求。有一次我在现场看到检测模块连续稳定跑了三天三夜没出岔子次品率下降了 0.7 个百分点。那一刻还是有点感慨——树莓派 5 这个小板子加一块 CSI 摄像头加一套 YOLOv5再配上工业供电和防护外壳硬是顶进了一线车间还得天天跟电焊火花和粉尘打交道。如果非要让我给后来者一个总结性的建议我会说树莓派 5 的性能上限决定了它做不了复杂的工业视觉但在轻量化检测场景里只要把散热、供电、模型优化这三件基本功做扎实它完全能当一台合格的小型边缘计算盒子用。至于后来我又入手的 AI 套件Hailo-8L推理性能又上了一个台阶那就是另一个故事了。
阅读完成 · 觉得有帮助?